如何实现一种基于STM32单片机的电子密码锁设计?

一、功能简介
本项目使用proteus8仿真stm32单片机控制器,使用lcd1602液晶、矩阵按键、蜂鸣器、eeprom模块、继电器模块等。
主要功能:
系统运行后,lcd1602显示密码输入提示界面,系统存储在eeprom的初始密码为123456,用户可通过矩阵按键s1-s10输入数值0-9,当在密码输入过程中有误,可按s11键回删并重新输入。当密码输入完成后,可按s12键确认,校验密码是否正确,如密码输入正确,电磁阀工作开门,对应d3指示灯点亮;如密码输入错误,lcd显示错误信息,可重新输入密码,最多可输入3次,如还输入错误,系统锁死,需等待10s钟解锁系统方可再次输入。当管理员需要更换密码时,可按下s13键,lcd显示更换密码界面,此时可通过s1-s10输入修改密码,修改过程中如需更改可按s11键回删并重新输入。修改密码完成后可按下s12键保存新密码至eeprom中,更新的密码可断电不丢失。
二、软件设计
/*******************************************************************************
函 数 名 : tim2_irqhandler函数功能 : tim2中断函数输 入 : 无输 出 : 无*******************************************************************************/
void tim2_irqhandler(void)
{
static u32 i=0;
if(tim_getitstatus(tim2,tim_it_update))
{
i++;
if(i>=(100*afresh_time))//时间到
{
i=0;
tim_cmd(tim2,disable);//关闭定时器
sys_ctrl.time_flag=1;
}
}
tim_clearitpendingbit(tim2,tim_it_update);
}
//主界面,输入密码提示
void main_display(void)
{
memset(sys_ctrl.password,0,6);//密码数据清零
sys_ctrl.time_flag=0;
sys_ctrl.resive_flag=0;
delay_ms(500);
lcd1602_clear();
lcd1602_show_string(0,0,password input:);
}
//密码输入错误次数超过规定值,等待指定时间后可重新输入
void password_error_wait_afreah_input(void)
{
tim_cmd(tim2,enable);//开启定时器
lcd1602_clear();
lcd1602_show_string(0,0,error too much!);
lcd1602_show_string(0,1,please wait...);
while(1)
{
if(sys_ctrl.time_flag)//时间到
{
relay=1;
sys_ctrl.error_cnt=0;
break;
}
}
}
//密码输入、修改
void password_input(void)
{
u8 key=0;
u8 cnt=0;
while(1)
{
key=key_matrix_flip_scan();
//密码输入
if(key>0&&key<=10)//输入有效数字0-9,排除无效键输入
{
beep_alarm(100,10);//提示音
if(cnt0)//有输入密码,撤回才有效
{
if(key==11)//撤回键
{
beep_alarm(100,10);cnt--;if(sys_ctrl.resive_flag==0){ sys_ctrl.password[cnt]=' '; lcd1602_show_num(cnt,1,sys_ctrl.password[cnt],0); }else//修改密码状态{ sys_ctrl.save_password[cnt]=' '; lcd1602_show_num(cnt,1,sys_ctrl.save_password[cnt],0); }}
}
//密码确认
if(key==12)//密码确认键
{
beep_alarm(100,10);
if(sys_ctrl.resive_flag==0)
{
if(sys_ctrl.error_cnt< error_password_cnt)//密码输错,还可继续重新输入{ if(memcmp(sys_ctrl.password,sys_ctrl.save_password,6))//密码错误 { sys_ctrl.error_cnt++; lcd1602_show_string(0,1,password error!); //密码错误,不可继续输入,需等待10s重新输入 if(sys_ctrl.error_cnt==error_password_cnt) password_error_wait_afreah_input(); break; } else//密码正确,开锁 { relay=0; sys_ctrl.error_cnt=0; lcd1602_show_string(0,1,password ok!); delay_ms(2000); relay=1; break; } }}
else//修改密码状态
{
sys_ctrl.resive_flag=0;//修改完成lcd1602_show_string(0,1,password set ok!);at24cxx_write(0,sys_ctrl.save_password,6);//存储新密码break;}
}
//密码修改
if(key==13)//密码修改键
{
beep_alarm(100,10);
sys_ctrl.resive_flag=1;
cnt=0;
lcd1602_clear();
lcd1602_show_string(2,0,password set:);
}
}
}
//应用控制系统
void appdemo_show(void)
{
u8 i=0;
u8 init_flag=0;
ctrl_pin_init();
key_matrix_init();
beep_init();
lcd1602_init();//lcd1602初始化
tim2_init(500-1,71);//定时10ms
at24cxx_init();
init_flag=at24cxx_readonebyte(250);
if(init_flag!=0xaa)//初始化一次,防止重复初始化密码
{
at24cxx_writeonebyte(250,0xaa);
for(i=1;i<7;i++)sys_ctrl.save_password[i-1]=i;
delay_ms(10);
at24cxx_write(0,sys_ctrl.save_password,6);//写入初始密码123456
}
at24cxx_read(0,sys_ctrl.save_password,6);//读取密码
while(1)
{
main_display();//主界面显示
password_input();//密码输入、修改
}
}
三、实验现象

步进电机和伺服电机哪个好_步进电机和伺服电机的区别
低噪声放大器 (LNA) 的设备物理和参数特性
IA架构在智能会议领域中的应用介绍
区块链权重证明的概念及定义
ACTB系列电流互感器过电压保护器
如何实现一种基于STM32单片机的电子密码锁设计?
接地变压器与电力变压器的区别
中国移动公布了2019年集中网络云资源池工程硬件采购项目中标结果
新零售的互联网公司和传统零售商心照不宣的合谋
人工智能时代下 安防加速释放实战价值
iPhone6s电池更换苹果解决方案:问题背后满满都是套路啊
安科瑞AKH-0.66/K低压开口电流互感器
工信部正式宣布将于近期发放5G商用牌照
汽车电子电气架构设计中控制器融合的分析和参考案例
华为麒麟9000S首批产品售罄 麒麟9000S砸碎美国封锁
可穿戴设备不再“叫好不叫座”?
恩智浦发布 LPCXpresso 6
OPPO首次实现了屏下摄像头!“未来手机”真正形态
东芝推出业界首款双相机模块,可实现图像和深度数据的同步输出
机器人常用电机解析及区别在哪里