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

发布时间:2023-08-22  

一、功能简介


本项目使用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(cnt<6)//有效密码位数,确保6位有效


{


if(sys_ctrl.resive_flag==0)


{


 sys_ctrl.password[cnt]=key-1;//记录用户输入密码


 if(PASSWORD_SHOW_HIDE==0)


  lcd1602_show_num(cnt,1,'*',0);


 else


  lcd1602_show_num(cnt,1,sys_ctrl.password[cnt],1);



else//修改密码状态


{


 sys_ctrl.save_password[cnt]=key-1;//记录验证密码


 lcd1602_show_num(cnt,1,sys_ctrl.save_password[cnt],1); 



cnt++;

}


}


//输入撤回


if(cnt>0)//有输入密码,撤回才有效


{


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();//密码输入、修改


}


}

三、实验现象

图片

图片


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    以STC89C52单片机为核心的电子密码锁设计;引言 电子密码锁是现代生活中常用的加密工具。它克服了机械式密码锁密码量少、安全性能差的缺点,尤其是微控制器的智能电子密码锁;不仅具有电子密码锁......
    显示、监测控制模块、RS485 通 信接口、时钟DS1305、信息存储单元及蜂鸣器报警。电路的硬件框图如图2 所示: (1)系统采用单片机STC89C58RD+作为控制芯片,它是电子密码锁......
    采用AT89C2051和AT89S52单片机实现红外遥控电子密码锁的设计;随着科学技术的进步和社会经济的发展,电子密码锁取代传统的机械锁已成为一种必然的趋势。以往基于单片机的密码锁系统,直接将编好的密码......
    钥匙为IC卡式,整个读卡单元由CIPH09芯片、24C01A密码存储器、卡座以及外围电路组成,原理图如图4所示。     小结 在本文多功能电子密码锁系统的基础上结合单片机的串行通讯功能,可以将多个家庭的密码锁......
    基于单片机的指纹门禁设计;功能: 研究内容:本课题以单片机为核心采用C语言来开发一指纹电子密码锁。系统拟在Altium Designer9开发平台上设计原理图,并绘制PCB并制成单片机开发板,然后......
    对于门访问安全因此,我们打算通过引进一个电子密码锁系统,该系统包括一个人得到一个访问某些项目之前要输入密码的安全性,以及在家里,一个房间密码锁系统,不只是普通的单用户密码锁系统,需要......
    如何实现一种基于STM32单片机的电子密码锁设计;一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602液晶、矩阵按键、蜂鸣器、EEPROM模块、继电......
    是这么运用的,也难怪很久以前专业课老师每次上课都会给我们埋下伏笔。以前自己还没有这么深的感触,但越到后来的专业课程设计我渐渐感觉到专业课知识起到对课程设计的支配与指导作用 多次AT89C52的课程设计让我对单片机......
    基于51单片机实现简易密码锁功能;具体功能的实现: 按下不同的按键,在LCD1602显示屏中可以出现不同的数字密码,如果输入错误,会显示ERR,反之显示ON;如果密码输错3次,则蜂鸣器报警30s同时在此期间无法输入密码......
    51单片机积累了太多的学习资料、例程、设计实例等,而且他们也非常愿意把这些资料共享出来方便后辈们学习。大学里的课程设计题目甚至毕业设计题目,在网上都能找到许多参考资料,这让很多同学更愿意在51单片机的基础上去实现自己的毕业设计......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>