|
在此分享一个自己原创制作的基于51单片机的电子密码设计此电子密码锁的功能有:
(1)六位密码输入(如需修改密码位数,请看注释);
(2)不同的密码权限,管理员有修改密码,保持锁常开,手动关锁的功能,一般用户没有这些功能;
(3)定时关锁(附件里的定时了五秒,如需修改,请看注释);
(4)蜂鸣器报警;
(5)LCD1602显示(有一般的并口驱动,和IIC驱动);
嗯,应该就这些。
如图为Proteus仿真图
嗯,电磁锁的原理跟继电器的差不多(我也不是太懂),仿真中就用继电器模拟电磁锁的开关了,亮灯表示通电,门锁上,灭灯表示断电,门打开。
仿真中没有断电保护,也就是说,断电后,密码回到初始状态,修改的密码无效。我没有用外部的存储器保存数据,用的是51单片机自带的EEPROM。实现断电保护的程序一起打包了,不过注释掉了,因为会影响仿真,烧到硬件上的恢复一下就好。具体怎么实现断电保护有蛮多方式,可以在51hei论坛里找找。
这是部分程序,为了方便使用,我把驱动程序分成了.c和.h文件。修改一下对应的管脚就可以使用了。- #include "MAIN.h"
- int main(void){
-
- LOCK = 0; //关锁
- BUZ = 1; //关蜂鸣器
- // ISP_Password_Read(); //从Flash或EEPROM中读出密码,进行初始化
- init_timer(); //初始化定时器
- LCD_init(); //显示初始
- delayms(10);
- LCD_printf(0,0,"Please input");
- LCD_printf(1,0,"Password:");
- BUZ_time(5); //响鸣提示可以输入密码
- while(1){
- KEY_read(); //按键值读取
- DISPLAY(); //显示
- BUZ_cmd(); //蜂鸣器响应
- PassTiem(); //继电器响应
- }
- }
- /****************************************
-
- 定时计数器初始化子程序
-
- *****************************************/
-
- void init_timer() {
-
- TMOD = 0X01; //设置T0为定时器,工作方式为1,16位定时/计数器
- TH0 = TH; //设置定时器0初值,定时50ms
- TL0 = TL;
- EA = 1; //中断使能开
- ET0 = 1; //定时器0中开
- TR0 = 0; //定时器0关
- }
- /****************************************
- *
- * 定时器0中断子程序
- *
- *****************************************/
- void timer_irs_0() interrupt 1{
-
- if(time < hold_time) { //这里设置定时为hold_time*50ms
- TH0 = TH; //重新赋值50
- TL0 = TL;
- time++;
- if(((hold_time - time) % 20) == 0){ //显示剩余时间
- count[0] = '0' + ((hold_time - time) / 20) /10;
- count[1] = '0' + ((hold_time - time) / 20) %10;
- LCD_printf(1,9,count);
- BUZ_time(50);
- time++; //由于响铃50ms,计时补偿
- }
- }
- else {
- TR0 = 0; //定时器0关
- time = 0; //溢出标志清零
- LCD_WriteCommand(0X01); //清屏
- delayms(10);
- LCD_printf(0,0,"Closing!");
- BUZ_time(50); //响鸣提示已关锁
- delayms(200);
- CLEAR(); //清空数据
-
- }
-
- }
- /****************************************
- LCD显示程序
-
- 显示操作信息,给用户操作提示
- *****************************************/
- uchar DISPLAY(void){
- uchar t;
- if(flag_pass && flag_a){ //通过且为管理员,显示Adm和剩余时间
- LCD_WriteCommand(0X01);
- delayms(10);
- LCD_printf(0,0,"Welcome,Adm!");
- LCD_printf(1,0,"Passtime:");
- return 0x00;
- }
- if(flag_pass && !flag_a){ //通过但非管理员,显示User和剩余时间
- LCD_WriteCommand(0X01);
- delayms(10);
- LCD_printf(0,0,"Welcome,User!");
- LCD_printf(1,0,"Passtime:");
- return 0x00;
- }
- if(flag_error){ //不通过,错误显示,显示错误次数
- t = '0' + flag_error_time;
- LCD_WriteCommand(0X01);
- delayms(10);
- LCD_printf(0,0,"Input,error!");
- LCD_printf(1,0,&t);
- return 0x00;
- }
- if(flag_m1){ //管理员按下M1/M2,显示常开
- LCD_WriteCommand(0X01);
- delayms(10);
- LCD_printf(0,0,"Passing!");
- LCD_printf(1,0,"Hold on!");
- return 0x00;
- }
- if(flag_m2){
- LCD_WriteCommand(0X01); //清屏
- delayms(10);
- LCD_printf(0,0,"Password Change");
- LCD_printf(1,0,"First :");
- return 0x00;
- }
- if(flag_lock){
- LCD_WriteCommand(0X01); //管理员按下LOCK,显示准备关锁
- delayms(10);
- LCD_printf(0,0,"Closing!");
- LCD_printf(1,0,"Attention!");
- return 0x00;
- }
- return 0x00;
- }
复制代码
嗯。我也不是什么大神,写的东西不是那么完美,如果有什么错误的地方,请多多包涵,打包的文件里有程序、仿真、硬件效果图(都是用现成的模块制作的,非自己做板,请别嫌弃)。如何修改程序以达到相应的效果,请看注释的内容(我能注释的都注释了)。
全部资料51hei下载地址:
电子密码锁制作.7z
(1.11 MB, 下载次数: 17)
|
评分
-
查看全部评分
|