找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2662|回复: 0
打印 上一主题 下一主题
收起左侧

一个基于51单片机的电子密码设计与制作(代码注释,仿真都有)

[复制链接]
跳转到指定楼层
楼主
在此分享一个自己原创制作的基于51单片机的电子密码设计此电子密码锁的功能有:
(1)六位密码输入(如需修改密码位数,请看注释);
(2)不同的密码权限,管理员有修改密码,保持锁常开,手动关锁的功能,一般用户没有这些功能;
(3)定时关锁(附件里的定时了五秒,如需修改,请看注释);
(4)蜂鸣器报警;
(5)LCD1602显示(有一般的并口驱动,和IIC驱动);
嗯,应该就这些。
如图为Proteus仿真图


嗯,电磁锁的原理跟继电器的差不多(我也不是太懂),仿真中就用继电器模拟电磁锁的开关了,亮灯表示通电,门锁上,灭灯表示断电,门打开。
仿真中没有断电保护,也就是说,断电后,密码回到初始状态,修改的密码无效。我没有用外部的存储器保存数据,用的是51单片机自带的EEPROM。实现断电保护的程序一起打包了,不过注释掉了,因为会影响仿真,烧到硬件上的恢复一下就好。具体怎么实现断电保护有蛮多方式,可以在51hei论坛里找找。

这是部分程序,为了方便使用,我把驱动程序分成了.c和.h文件。修改一下对应的管脚就可以使用了。
  1. #include "MAIN.h"

  2. int main(void){
  3.                
  4.         LOCK = 0;                                                              //关锁
  5.         BUZ = 1;                                                                //关蜂鸣器
  6. //        ISP_Password_Read();                                          //从Flash或EEPROM中读出密码,进行初始化
  7.         init_timer();                                                            //初始化定时器
  8.         LCD_init();                                                             //显示初始
  9.         delayms(10);                                                                                
  10.         LCD_printf(0,0,"Please input");
  11.         LCD_printf(1,0,"Password:");
  12.         BUZ_time(5);                                                       //响鸣提示可以输入密码

  13.         while(1){
  14.                 KEY_read();                                                //按键值读取
  15.                 DISPLAY();                                                 //显示
  16.                 BUZ_cmd();                                                //蜂鸣器响应
  17.                 PassTiem();                                                //继电器响应
  18.         }
  19. }

  20. /****************************************
  21.                                                                               
  22.          定时计数器初始化子程序                                
  23.                                                                               
  24. *****************************************/

  25. void init_timer() {
  26.         
  27.         TMOD = 0X01;                                                  //设置T0为定时器,工作方式为1,16位定时/计数器
  28.         TH0 = TH;                                                        //设置定时器0初值,定时50ms
  29.            TL0 = TL;
  30.         EA = 1;                                                            //中断使能开
  31.         ET0 = 1;                                                          //定时器0中开
  32.         TR0 = 0;                                                          //定时器0关                 
  33. }

  34. /****************************************
  35. *                                                                                
  36. *        定时器0中断子程序                                       
  37. *                                                                                
  38. *****************************************/

  39. void timer_irs_0() interrupt 1{
  40.                         
  41.         if(time < hold_time) {                                        //这里设置定时为hold_time*50ms
  42.                 TH0 = TH;                                                //重新赋值50
  43.                    TL0 = TL;               
  44.                 time++;
  45.                 if(((hold_time - time) % 20) == 0){                                       //显示剩余时间                                                
  46.                         count[0] = '0' + ((hold_time - time) / 20) /10;
  47.                         count[1] = '0' + ((hold_time - time) / 20) %10;
  48.                         LCD_printf(1,9,count);                                                
  49.                         BUZ_time(50);
  50.                         time++;                                                                      //由于响铃50ms,计时补偿
  51.                 }

  52.         }
  53.         else {
  54.                 TR0 = 0;                                                        //定时器0关
  55.                 time = 0;                                                       //溢出标志清零
  56.                 LCD_WriteCommand(0X01);                             //清屏
  57.                 delayms(10);
  58.                 LCD_printf(0,0,"Closing!");
  59.                 BUZ_time(50);                                                //响鸣提示已关锁
  60.                 delayms(200);
  61.                 CLEAR();                                                        //清空数据
  62.                                 
  63.         }
  64.                                                    
  65. }

  66. /****************************************                                                                             
  67.         LCD显示程序                                                      
  68.                                                                               
  69.         显示操作信息,给用户操作提示                                                                                                                             
  70. *****************************************/

  71. uchar DISPLAY(void){
  72.         uchar t;
  73.         if(flag_pass && flag_a){                                        //通过且为管理员,显示Adm和剩余时间
  74.                 LCD_WriteCommand(0X01);
  75.                 delayms(10);
  76.                 LCD_printf(0,0,"Welcome,Adm!");
  77.                 LCD_printf(1,0,"Passtime:");
  78.                 return 0x00;
  79.         }
  80.         if(flag_pass && !flag_a){                                           //通过但非管理员,显示User和剩余时间
  81.                 LCD_WriteCommand(0X01);
  82.                 delayms(10);
  83.                 LCD_printf(0,0,"Welcome,User!");
  84.                 LCD_printf(1,0,"Passtime:");
  85.                 return 0x00;
  86.         }
  87.         if(flag_error){                                                                //不通过,错误显示,显示错误次数
  88.                 t = '0' + flag_error_time;
  89.                 LCD_WriteCommand(0X01);
  90.                 delayms(10);
  91.                 LCD_printf(0,0,"Input,error!");
  92.                 LCD_printf(1,0,&t);
  93.                 return 0x00;
  94.         }               
  95.         if(flag_m1){                                                   //管理员按下M1/M2,显示常开
  96.                 LCD_WriteCommand(0X01);
  97.                 delayms(10);
  98.                 LCD_printf(0,0,"Passing!");
  99.                 LCD_printf(1,0,"Hold on!");
  100.                 return 0x00;
  101.         }
  102.         if(flag_m2){
  103.                 LCD_WriteCommand(0X01);                                                //清屏
  104.                 delayms(10);
  105.                 LCD_printf(0,0,"Password Change");
  106.                 LCD_printf(1,0,"First :");
  107.                 return 0x00;        
  108.         }
  109.         if(flag_lock){
  110.                 LCD_WriteCommand(0X01);                                        //管理员按下LOCK,显示准备关锁
  111.                 delayms(10);
  112.                 LCD_printf(0,0,"Closing!");
  113.                 LCD_printf(1,0,"Attention!");
  114.                 return 0x00;
  115.         }
  116.         return 0x00;        
  117. }
复制代码

嗯。我也不是什么大神,写的东西不是那么完美,如果有什么错误的地方,请多多包涵,打包的文件里有程序、仿真、硬件效果图(都是用现成的模块制作的,非自己做板,请别嫌弃)。如何修改程序以达到相应的效果,请看注释的内容(我能注释的都注释了)。


全部资料51hei下载地址:
电子密码锁制作.7z (1.11 MB, 下载次数: 17)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表