【STM32单片机】多功能电子密码锁设计

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使用按键、IIC OLED模块、DS18B20温度传感器、SG90舵机、红外遥控、矩阵按键、EEPROM等。
主要功能:
系统运行后,OLED显示RTC日期时间和温度;

键盘解锁:可使用矩阵键盘S1-S10键输入数字
0-9,初始密码为012345,当密码输入有误可按下S11键撤回,输入完成后可按下S12键解锁,若密码正确则开锁,舵机启动。若密码错误,OLED显示错误信息,当错误次数超过3次则锁死一段时间后重新输入。当按下S13键可修改密码,进入密码修改界面首先需校验旧密码,当输入旧密码正确,才可进入新密码设置。可按下S16键返回主界面。密码支持掉电不丢失。

红外遥控解锁:使用红外遥控器,按下第一个键(该键对应HEX为A2),则一键解锁。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)*///系统参数初始化
void sys_parm_init(void)
{u8 i=0;sys_ctrl.mode=0;sys_ctrl.err_cnt=0;sys_ctrl.psw_flag=0;sys_ctrl.psw_resive=0;sys_ctrl.psw_bit=0;//初始密码0-5if(AT24CXX_ReadOneByte(255)!=0x28){AT24CXX_WriteOneByte(255,0x28);//写入初始密码到EEPROMfor(i=0;i<PSW_BITNUM;i++){sys_ctrl.save_psw[i]=i;AT24CXX_WriteOneByte(i,sys_ctrl.save_psw[i]);}	}else{//读取EEPROM内密码数据for(i=0;i<PSW_BITNUM;i++){sys_ctrl.save_psw[i]=AT24CXX_ReadOneByte(i);	}	}	
}//系统时钟温度显示模块
void sys_rtc_temp_show(void)
{u8 buf[5];static u8 i=0;OLED_Clear();OLED_ShowString(0,0,  "2023-08-22 Week5",16);OLED_ShowString(0,20, "   12:16:56",16);OLED_ShowString(0,40,"  Temp:    C",16);while(sys_ctrl.mode==0){//温度获取i++;if(i%1==0)sys_ctrl.temp=DS18B20_GetTemperture()*10;//日期显示buf[0]=calendar.w_year/1000+0x30;buf[1]=calendar.w_year%1000/100+0x30;buf[2]=calendar.w_year%1000%100/10+0x30;buf[3]=calendar.w_year%1000%100%10+0x30;buf[4]='\0';OLED_ShowString(0,0,buf,16);buf[0]=calendar.w_month/10+0x30;buf[1]=calendar.w_month%10+0x30;buf[2]='\0';OLED_ShowString(5*8,0,buf,16);buf[0]=calendar.w_date/10+0x30;buf[1]=calendar.w_date%10+0x30;buf[2]='\0';OLED_ShowString(8*8,0,buf,16);buf[0]=calendar.week%7+0x30;buf[1]='\0';OLED_ShowString(15*8,0,buf,16);//时间显示buf[0]=calendar.hour/10+0x30;buf[1]=calendar.hour%10+0x30;buf[2]='\0';OLED_ShowString(3*8,20,buf,16);//时buf[0]=calendar.min/10+0x30;buf[1]=calendar.min%10+0x30;buf[2]='\0';OLED_ShowString(6*8,20,buf,16);//分buf[0]=calendar.sec/10+0x30;buf[1]=calendar.sec%10+0x30;buf[2]='\0';OLED_ShowString(9*8,20,buf,16);//秒//温度显示buf[0]=sys_ctrl.temp/100+0x30;buf[1]=sys_ctrl.temp%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp%100%10+0x30;buf[4]='\0';OLED_ShowString(7*8,40,buf,16);//检测是否按下键,进入密码输入界面if(KEY_Matrix_Scan()!=0){sys_ctrl.mode=1;break;}OLED_Refresh_Gram();//刷新显存}
}//密码输入界面显示
void psw_input_show(void)
{OLED_Clear();OLED_ShowString(0,0,"Password:",16);
}
//修改密码时输入校验密码界面显示
void adjust_input_show(void)
{OLED_Clear();OLED_ShowString(0,0,"Calib Psw:",16);
}
//设置新密码界面显示
void set_new_psw_show(void)
{OLED_Clear();OLED_ShowString(0,0,"New Psw:",16);	
}
//一键解锁界面显示
void one_click_unlock_show(void)
{OLED_Clear();OLED_ShowString(0,0,"One click unlock",16);OLED_ShowString(0,20,"OK...",16);	
}//修改密码时,密码校验
void sys_psw_resive(void)
{u8 key=0;//在密码设置有效if(sys_ctrl.psw_resive){//初始化参数值sys_ctrl.psw_bit=0;sys_ctrl.err_cnt=0;sys_ctrl.psw_flag=0;memset(sys_ctrl.psw,0,PSW_BITNUM);//清除输入数据adjust_input_show();//修改密码时输入校验密码界面显示while(sys_ctrl.psw_resive){//键盘扫描key=KEY_Matrix_Scan();if(key>0)//按键输入{BEEP_Alarm(100,100);//提示音if(key<=10)//数字键0-9{if(sys_ctrl.psw_bit<PSW_BITNUM)//最多输入密码位数{sys_ctrl.psw[sys_ctrl.psw_bit]=key-1;//记录输入密码sys_ctrl.psw_bit++;//输入位数累加//密码可见if(PASSWORD_SHOW_HIDE)//显示输入密码OLED_ShowNum((9+sys_ctrl.psw_bit)*8,0,sys_ctrl.psw[sys_ctrl.psw_bit-1],1,16);//密码不可见elseOLED_ShowString((9+sys_ctrl.psw_bit)*8,0,"*",16);}	}else if(key==11)//撤回键{sys_ctrl.psw[sys_ctrl.psw_bit-1]=10;//将所需撤回的数据设置为无效数OLED_ShowString((9+sys_ctrl.psw_bit)*8,0," ",16);//将撤销位置显示空位sys_ctrl.psw_bit--;if(sys_ctrl.psw_bit<0)sys_ctrl.psw_bit=0;}else if(key==12)//确定键{sys_ctrl.psw_flag=0;sys_ctrl.psw_bit=0;//输入密码与存储密码比较if(memcmp(sys_ctrl.psw,sys_ctrl.save_psw,PSW_BITNUM)==0)sys_ctrl.psw_flag=1;//密码正确memset(sys_ctrl.psw,0,PSW_BITNUM);//清除输入数据	//密码正确,开锁if(sys_ctrl.psw_flag==1){sys_ctrl.err_cnt=0;OLED_ShowString(0,20,"Password OK!   ",16);OLED_Refresh_Gram();//刷新显存delay_ms(1000);break;//进入新密码设置程序	}//如果密码错误else{sys_ctrl.err_cnt++;//错误次数累计OLED_ShowString(0,20,"Password Error!",16);OLED_Refresh_Gram();//刷新显存//密码输入错误次数超限if(sys_ctrl.err_cnt>=ERROR_PASSWORD_CNT){sys_ctrl.err_cnt=0;OLED_ShowString(0,0,"Too many errors!",16);OLED_ShowString(0,20,"Please wait...",16);OLED_Refresh_Gram();//刷新显存delay_ms(1000);	delay_ms(1000);delay_ms(1000);}else delay_ms(1000);adjust_input_show();//修改密码时输入校验密码界面显示}}else if(key==16)//退出键{sys_ctrl.psw_resive=0;sys_ctrl.mode=0;//回到时钟温度显示模式	break;	}}OLED_Refresh_Gram();//刷新显存}		}	
}//应用控制系统
void app_sys_ctrl_demo(void)
{u8 i=10;LED_Init();USART1_Init(115200);AT24CXX_Init();OLED_Init();KEY_Matrix_Init();BEEP_Init();DS18B20_Init();RTC_Init();Hwjs_Init();//获取稳定数据while(i--){sys_ctrl.temp=DS18B20_GetTemperture()*10;delay_ms(100);}TIM4_Init(200,36000-1);  //定时100msTIM3_CH2_PWM_Init(20000-1,71); //周期20mssteer_control(0);sys_parm_init();//系统参数初始化while(1){sys_rtc_temp_show();//系统时钟温度显示模块sys_psw_unlock_show();//系统解锁显示模块sys_psw_resive();//修改密码时,密码校验sys_new_psw_set();//新密码设置}
}

三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/150134.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++面向对象侯捷下】21. 关于New, Delete

文章目录 底层 是 调用 malloc函数 class 可以 重载这些 函数&#xff08;可以重载 构造&#xff0c;析构函数&#xff1f;&#xff09;

CCF CSP认证 历年题目自练Day24

题目一 试题编号&#xff1a; 202009-1 试题名称&#xff1a; 称检测点查询 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 题目背景 2020 年 6 月 8 日&#xff0c;国务院联防联控机制发布《关于加快推进新冠病毒核酸检测的实施意见》&…

速通Redis基础(一):掌握Redis的字符串类型和命令

目录 字符串&#xff08;String&#xff09; 常见命令 SET GET MSET&MGET SETNX INCR INCRBY DECR DECRBY INCRBYFLOAT APPEND GETRANGE SETRANGE STRLEN Redis字符串类型命令总结 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的…

【14】c++设计模式——>工厂模式

简单工厂模式的弊端 简单工厂模式虽然简单&#xff0c;但是违反了设计模式中的开放封闭原则&#xff0c;即工厂类在数据增加时需要被修改&#xff0c;而我们在设计时对于已经设计好的类需要避免修改的操作&#xff0c;而选用扩展的方式。 工厂模式设计 简单工厂模式只有一个…

河北吉力宝:国内顶尖资源荣誉共筑全景融合新商业生态

随着科技的不断发展和社会的进步&#xff0c;新兴企业纷纷崭露头角&#xff0c;展现出令人瞩目的商业潜力。随着科技的不断演进和社会的持续进步&#xff0c;新兴企业正崭露头角&#xff0c;显露出巨大的商机。在这个时代&#xff0c;合作和资源整合变得至关重要。河北吉力宝智…

【java爬虫】使用vue+element-plus编写一个简单的管理页面

前言 前面我们已经将某宝联盟的数据获取下来了&#xff0c;并且编写了一个接口将数据返回&#xff0c;现在我们需要使用vueelement-plus编写一个简单的管理页面进行数据展示&#xff0c;由于第一次使用vue编写前端项目&#xff0c;所以只是编写了一个非常简单的页面。 项目结…

高速数字化仪为您带来高效RF测量秘籍!(二)

上一章主要介绍了虹科高速数字化仪的特点、RF测试选型以及RF动态范围测量示例&#xff0c;本章将继续为大家介绍多通道采集分析正交调制信号、RF频率响应测量等内容。 RF测试分析 数字化仪获取数据并将其用于测量和分析。在这些例子中&#xff0c;虹科SBench6用于分析测试数据…

对干扰SAY NO!GNSS模拟将提供伽利略OS-NMA功能(一)

新一代卫星应用程序依赖灵活且准确的GNSS信号作为许多关键项目的重点要素&#xff0c;以确保高精度的定位、导航和授时&#xff08;PNT&#xff09;数据。虹科Safran提供了GNSS仿真测试解决方案&#xff0c;旨在确保复杂GNSS应用系统的高性能、高弹性和高准确性。 现状 GNSS技…

位移贴图和法线贴图的区别

位移贴图和法线贴图都是用于增强模型表面细节和真实感的纹理贴图技术&#xff0c;但是它们之间也存在着差异。 1、什么是位移贴图 位移贴图&#xff1a;位移贴图通过在模型顶点上定义位移值来改变模型表面的形状。该贴图包含了每个像素的高度值信息&#xff0c;使得模型的细节…

2023年中国短租公寓主要类型、品牌及行业市场规模分析[图]

短租是一种以24小时为计量单位、按天计费的房屋租赁形式&#xff0c;短租又称日租。短租房有高性价比、特色、浓厚居家感的特点&#xff0c;比起传统酒店的客房更具竞争优势。当前&#xff0c;短租房已经成为人们出行住宿的新选择。短租公寓主要类型有合租公寓、月租公寓、服务…

Python 数据分析与挖掘(一)

Python 数据分析与挖掘&#xff08;数据探索&#xff09; 数据探索 1.1 需要掌握的工具&#xff08;库&#xff09; 1.1.1 Nump库 Numpy 提供多维数组对象和各种派生对象&#xff08;类矩阵&#xff09;&#xff0c;利用应用程序接口可以实现大量且繁琐的数据运算。可以构建…

Minecraft个人服务器搭建自己的皮肤站并实现外置登录更换自定义皮肤组件

Minecraft个人服务器搭建自己的皮肤站并实现外置登录更换自定义皮肤组件 大家好&#xff0c;我是艾西有不少小伙伴非常喜欢我的世界Minecraft游戏&#xff0c;今天小编跟大家分享下Minecraft个人服务器怎么设置皮肤站。 Minecraft皮肤站是什么&#xff1f;其实官网就有皮肤站…

Overloud TH-U Complete for Mac:演绎您的音乐世界

Overloud TH-U Complete for Mac是一款功能强大的吉他谱曲软件&#xff0c;可以让您在Mac电脑上轻松进行吉他模拟、录音和混音等操作&#xff0c;创作属于自己的音乐作品。 Overloud TH-U Complete for Mac提供了丰富的吉他模拟和音效库&#xff0c;涵盖了多种吉他放大器、箱体…

腾讯云服务器简介_CVM优势_常见问题解答

腾讯云服务器CVM提供安全可靠的弹性计算服务&#xff0c;腾讯云明星级云服务器&#xff0c;弹性计算实时扩展或缩减计算资源&#xff0c;支持包年包月、按量计费和竞价实例计费模式&#xff0c;CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格&#xff0c;提供9个9的数…

1600*C. Good Subarrays(找规律前缀和)

Problem - 1398C - Codeforces 解析&#xff1a; 可以写出 sum[ j ] - sum[ i ] j - i 1&#xff0c;对其移项得 sum[ j ] - j sum[ i ] - &#xff08;i - 1&#xff09;&#xff0c;问题转换为有多少个前缀和相等&#xff0c;则用map遍历统计一遍即可。 注意&#xff0c;当…

数据结构——AVL树(详解 + C++模拟实现)

文章目录 前言AVL树的概念AVL树节点的定义AVL树类框架AVL树的插入AVL树的旋转新节点插入较高子树的左侧 —— 左左: 右单旋新节点插入较高右子树的右侧——右右: 左单旋新节点插入较高左子树的右侧 —— 左右&#xff1a; 先左单旋然后再有单旋新节点插入较高右子树的左侧&…

【JavaEE重点知识归纳】第5节:方法

目录 一&#xff1a;方法的概念和使用 1.什么是方法 2.方法的定义 3.方法的调用过程 4.实参和形参的关系&#xff08;重点&#xff09; 二:方法重载 1.方法重载概念 2.方法签名 三&#xff1a;递归 1.递归的概念 2.递归执行的过程分析 一&#xff1a;方法的概念和使…

qt 5.15.2 安卓 macos

macos环境安卓配置 我的系统是monterey12.5.1 打开qt的配置界面 这里版本是java1.8&#xff0c;注意修改这个json文件&#xff0c;显示包内容 {"common": {"sdk_tools_url": {"linux": "https://dl.google.com/android/repository/comm…

1500*B. Zero Array(贪心数学找规律)

Problem - 1201B - Codeforces 解析&#xff1a; 因为每次减少2&#xff0c;如果总和为奇数肯定无法实现。 特例&#xff0c;如果某个数大于其他所有数的总和&#xff0c;同样无法实现。 其他均可实现。 #include<bits/stdc.h> using namespace std; #define int long l…