找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电子密码锁Proteus仿真+程序+视频

  [复制链接]
跳转到指定楼层
楼主
ID:559277 发表于 2019-6-10 19:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)





3.6 开锁机构
在基于单片机的电子密码锁设计中,用户需要输入密码,密码正确则发出开锁信号开锁。
在这次基于单片机的电子密码锁设计中,通过控制蜂鸣器的发音来指示系统的开锁功能。蜂鸣器是一种采用直流电压供电的电子讯响器。图3-9是用蜂鸣器指示的开锁机构仿真图。因为在设计中是以蜂鸣器发生来指示开锁是否成功,当密码输入正确时蜂鸣器响起来,代表锁开了。
图3-9开锁机构指示电路
3.7 报警机构
在这次基于单片机的电子密码锁设计中,通过控制报警显示LED来指示系统的报警功能。图3-10是用基于LED的报警机构仿真图。控制RELAY输出高低电平,即P3.4引脚,就可以控制报警显示LED的亮灭,从而指示相关信息。
图3-10报警机构模拟仿真图
当用户输入密码错误次数达到预设警告次数时,系统调用报警子程序,使LED亮起来,同时禁止键盘输入。
3.8 硬件综合设计
根据电路原理,在PROTEUS中画出各功能模块的仿真图,各个功能模块验证正确后,将所有模块集合到一个电路设计图中,画出具有所有功能的总体硬件仿真图。
待程序编写好后,将KEIL和PROTEUS联调,观察此电路设计图可以知道各个功能模块和器件的工作情况。届时,根据实际情况可以适当修改电路图或者程序,以达到设计的目的。

单片机源程序如下:
  1. #include<reg51.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

  2. #include"lcd1602.h"
  3. #include"i2c.h"

  4. sbit LED=P3^3;  //继电器控制引脚
  5. sbit RELAY=P3^4;  //继电器控制引脚
  6. sbit BUZZER=P3^5; //蜂鸣器控制引脚
  7. sbit SET=P0^7;          //设置
  8. sbit LCK=P0^6;          //关锁

  9. #define LOCK_TIME_second 10
  10. #define SU 1/256
  11. #define GPIO_KEY P1        //4X4矩阵键盘输入
  12. unsigned char KeyValue; //用来存放读取到的键值
  13. unsigned char saved_Value[4]={6,7,6,7};          //初始密码
  14. unsigned char input_Value[4];
  15. unsigned char Right_flg=0,Right_flg0=0;
  16. unsigned char set_flg=0,LOCK_flg=0;
  17. unsigned char temp00;
  18. unsigned int  time_cnt,time_remember,delay_ddll;
  19. long int DECvalue=0;

  20. //存储芯片存储的内容
  21. /*===============================================
  22. 地址: 0    1    2     3    4    5      6     
  23. 数据:无   密码 密码  密码 密码         无  错误次数
  24. =================================================*/

  25. void TimerConfiguration(void);  //定时中断
  26. void KeyDown();                            //检测按键函数
  27. void At24c02Write(unsigned char addr,unsigned char dat);
  28. unsigned char At24c02Read(unsigned char addr);

  29. //====主函数入口======
  30. void main()
  31. {
  32.    char i=0,j=0;
  33.    //unsigned char aa;
  34.    char k=0;

  35.    LcdInit();    //液晶初始化
  36.    clear_window();
  37.    TimerConfiguration();   //初始化定时器

  38.    Lcd1602_Delay1ms(5);
  39.    At24c02Write(1,6);   //初始化存储芯片,实际电路中就不需要
  40.    At24c02Write(2,7);
  41.    At24c02Write(3,6);
  42.    At24c02Write(4,7);
  43.    At24c02Write(6,0);        ////清除错误输入次数

  44.    RELAY=1;
  45.    BUZZER=1;

  46.         while(1)
  47.                 {
  48.                    KeyDown();         ////按键扫描

  49.                   ///===========正常输入密码操作======================
  50.                    if (KeyValue<=9 && !set_flg && !LOCK_flg) //有按键按下
  51.                    {
  52.                      input_Value[i]=KeyValue;                                                  
  53.                          if (Right_flg0)
  54.                          {  clear_window();
  55.                                  Right_flg0=0;
  56.                          }

  57.                          LcdWriteCom(0x80+i);  //显示当前按键的值
  58.                          LcdWriteData('*');

  59.                          i++;
  60.                             if(i>=4)  //判断
  61.                          {
  62.                                  Right_flg0=0;
  63.                             for (j=0;j<4;j++)
  64.                                 {
  65.                                     if (input_Value[j]!=saved_Value[j])
  66.                                            Right_flg0=1;                                
  67.                                 }
  68.                                 clear_window();
  69.                                 if(!Right_flg0)                  ////密码输入正确
  70.                                 {
  71.                                   BUZZER=0;         //声音报警
  72.                                   delay_ddll = 1;
  73.                                   LcdWriteCom(0x80+i+2);
  74.                                   LcdWriteData('O');
  75.                                   LcdWriteData('K');
  76.                                   At24c02Write(6,0);        ////清除错误输入次数
  77.                                 }
  78.                                 else
  79.                                 {
  80.                                   BUZZER=1;
  81.                                   LcdWriteCom(0x80+i+2);
  82.                                   LcdWriteData('E');
  83.                                   LcdWriteData('R');

  84.                                   temp00=At24c02Read(6);  ////存储输入错误次数
  85.                                   if (temp00>=2)              //连续输入错误超过3次
  86.                                   {         
  87.                                     LOCK_flg=1;
  88.                                         RELAY=0;  /////指示灯起来
  89.                                         LcdWriteCom(0x80+i+2);
  90.                                     LcdWriteData('L');
  91.                                     LcdWriteData('K');                                            
  92.                                   }
  93.                                   At24c02Write(6,temp00+1);                                                            
  94.                                 }

  95.                                 i=0;                    
  96.                          }
  97.                    }
  98.                 ///===========正常输入密码操作 end======================


  99.                  ///===========修改密码操作======================
  100.                    if (KeyValue<=9 && set_flg && !LOCK_flg) //有按键按下 KeyValue!=66
  101.                    {
  102.                          input_Value[k]=KeyValue;
  103.                         
  104.                          LcdWriteCom(0x80+k);  //显示当前按键的值
  105.                          LcdWriteData('*');

  106.                           k++;
  107.                           if(k>=4)  //判断
  108.                           {
  109.                                   if (set_flg==2)
  110.                                   {                                       
  111.                                         for (j=0;j<4;j++)
  112.                                                 {
  113.                                                   saved_Value[j]=input_Value[j];
  114.                                                   At24c02Write(j+1,saved_Value[j]);                                                                                                                                                                                                                                            
  115.                                                 }
  116.                                                 clear_window();

  117.                                                   set_flg=0;
  118.                                                 LED = 0;  //设置状态指示灯亮起来
  119.                                                 delay_ddll =1;
  120. //                                                  LcdWriteCom(0x80+k+2);
  121. //                                                LcdWriteData('O');
  122. //                                                LcdWriteData('K');
  123.                                   }

  124.                                    if (set_flg==1)
  125.                                   {///============================================                                                                                                  
  126.                                                 Right_flg=0;
  127.                                             for (j=0;j<4;j++)
  128.                                                 {
  129.                                                   if(input_Value[j]!=saved_Value[j])
  130.                                                     Right_flg=1;                                    
  131.                                                 }
  132.                                                 clear_window();
  133.                                                 if(!Right_flg)                  ///旧密码输入正确
  134.                                                 {
  135.                                                   set_flg=2;         ///可以进行下一步操作                                                  
  136.                                                   LcdWriteCom(0x80+0x40);  //
  137.                                                   LcdWriteData('N');
  138.                                                   LcdWriteData('E');
  139.                                                   LcdWriteData('W');         
  140.                                                 }
  141.                                                 else
  142.                                                 {
  143.                                                   LcdWriteCom(0x80+k+2);
  144.                                                   LcdWriteData('E');
  145.                                                   LcdWriteData('R');
  146.                                                   
  147.                                                   temp00=At24c02Read(6);  ////存储输入错误次数
  148.                                                   if (temp00>=2)        
  149.                                                   {         
  150.                                                     LOCK_flg=1;
  151.                                                         RELAY=0;  /////指示灯起来
  152.                                                         LcdWriteCom(0x80+i+2);
  153.                                                     LcdWriteData('L');
  154.                                                     LcdWriteData('K');                                            
  155.                                                   }
  156.                                                   At24c02Write(6,temp00+1);                        
  157.                                                 }
  158.                                   }          ///============================================
  159.                                                                           

  160.                                 k=0;                    
  161.                          }
  162.                    }
  163.           ///===========修改密码操作 end======================

  164.                    if (KeyValue==0x0A && !LOCK_flg)  //有按键按下         
  165.                    {
  166.                            clear_window();
  167.                            set_flg=1;
  168.                            LcdWriteCom(0x80+0x40);  //
  169.                            LcdWriteData('O');
  170.                            LcdWriteData('L');
  171.                            LcdWriteData('D');

  172.                             k=0;  //=================                                             
  173.                    }
  174.          ////=============############================================
  175.                    else if (KeyValue==0x0B && !LOCK_flg)  //有按键按下,关上锁,清除窗口!LCK
  176.                    {        
  177.                           BUZZER=1;
  178.                           clear_window();                                             
  179.                    }
  180.                   
  181.                   if (delay_ddll)
  182.                   {
  183.                              delay_ddll++;
  184.                            if (delay_ddll>2000)
  185.                            {
  186.                                       LED = 1;
  187.                                    BUZZER = 1;
  188.                                    delay_ddll = 0;
  189.                            }
  190.                   }
  191.            ////=============================================
  192.                  Lcd1602_Delay1ms(1);

  193.                 }
  194. }


  195. /*******************************************************************************
  196. * 函 数 名         : KeyDown
  197. * 函数功能                   : 检测有按键按下并读取键值
  198. * 输    入         : 无
  199. * 输    出         : 无
  200. *******************************************************************************/
  201. void KeyDown(void)
  202. {
  203.         unsigned char a=0;
  204.                  
  205.         KeyValue=66;
  206.         GPIO_KEY=0x0f;
  207.         if(GPIO_KEY!=0x0f)//读取按键是否按下
  208.         {
  209.                 Lcd1602_Delay1ms(10); //延时10ms进行消抖
  210.                 if(GPIO_KEY!=0x0f)    //再次检测键盘是否按下
  211.                 {               
  212.                         //测试列
  213.                         GPIO_KEY=0X0F;
  214.                         switch(GPIO_KEY)
  215.                         {
  216.                                 case(0X07):        KeyValue=0;break;
  217.                                 case(0X0b):        KeyValue=1;break;
  218.                                 case(0X0d): KeyValue=2;break;
  219.                                 case(0X0e):        KeyValue=3;break;
  220.                         }
  221.                         //测试行
  222.                         GPIO_KEY=0XF0;
  223.                         switch(GPIO_KEY)
  224.                         {
  225.                                 case(0X70):        KeyValue=KeyValue;break;
  226.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  227.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  228.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  229.                         }

  230.                         while((a<250)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
  231.                         {
  232.                                 Lcd1602_Delay1ms(2);
  233.                                 a++;
  234.                         }
  235.                 }
  236.         }
  237. }

  238. /*******************************************************************************
  239. * 函数名         : void At24c02Write(unsigned char addr,unsigned char dat)
  240. * 函数功能                   : 往24c02的一个地址写入一个数据
  241. * 输入           : 无
  242. * 输出                  : 无
  243. *******************************************************************************/
  244. void At24c02Write(unsigned char addr,unsigned char dat)
  245. {
  246.         I2cStart();
  247.         I2cSendByte(0xa0);//发送写器件地址
  248.         I2cSendByte(addr);//发送要写入内存地址
  249.         I2cSendByte(dat);        //发送数据
  250.         I2cStop();
  251. }
  252. /*******************************************************************************
  253. * 函数名         : unsigned char At24c02Read(unsigned char addr)
  254. * 函数功能                   : 读取24c02的一个地址的一个数据
  255. * 输入           : 无
  256. * 输出                  : 无
  257. *******************************************************************************/
  258. unsigned char At24c02Read(unsigned char addr)
  259. {
  260.         unsigned char num;
  261.         I2cStart();
  262.         I2cSendByte(0xa0); //发送写器件地址
  263.         I2cSendByte(addr); //发送要读取的地址
  264.         I2cStart();
  265. ……………………

  266. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
仿真代码.7z (398.91 KB, 下载次数: 2345)
演示视频.7z (9.91 MB, 下载次数: 251)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:560088 发表于 2019-6-11 16:40 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:564145 发表于 2019-6-17 09:24 | 只看该作者
能不能发个联系方式,有问题不懂
回复

使用道具 举报

地板
ID:554248 发表于 2019-6-17 10:22 | 只看该作者
能不能给个联系方式
回复

使用道具 举报

5#
ID:435101 发表于 2019-7-5 16:51 | 只看该作者
如何修改为断电记忆密码?求大家指导
回复

使用道具 举报

6#
ID:581274 发表于 2019-7-11 10:16 | 只看该作者
真是太有爱了
回复

使用道具 举报

7#
ID:632812 发表于 2019-10-30 17:26 | 只看该作者
万分感谢
回复

使用道具 举报

8#
ID:646452 发表于 2019-11-21 12:56 | 只看该作者
如果51换成stm32的有哪些地方需要改动?
回复

使用道具 举报

9#
ID:646231 发表于 2019-11-21 13:32 来自手机 | 只看该作者
感谢感谢,这网站太好用了
回复

使用道具 举报

10#
ID:649766 发表于 2019-11-26 15:28 | 只看该作者
初始密码是什么?

回复

使用道具 举报

11#
ID:660359 发表于 2019-12-13 09:41 | 只看该作者
兄弟,三次密码输入错误以后就不能再输入密码了呀,复位键没用啊
回复

使用道具 举报

12#
ID:569937 发表于 2019-12-26 17:38 | 只看该作者
复位电路  没有用  什么情况
回复

使用道具 举报

13#
ID:675096 发表于 2019-12-27 08:27 | 只看该作者
真是太有爱了
回复

使用道具 举报

14#
ID:675096 发表于 2019-12-28 09:04 | 只看该作者
感谢感谢,这网站太好用了
回复

使用道具 举报

15#
ID:675760 发表于 2019-12-28 23:06 | 只看该作者
可以设置密码位数可以让它多几位或者少几位吗
回复

使用道具 举报

16#
ID:680994 发表于 2020-1-5 21:30 | 只看该作者
清水煮鱼 发表于 2020-1-4 14:05
没有黑币呀,这上面的代码全吗?

请问如何将4位改成6位可以吗?
回复

使用道具 举报

17#
ID:705869 发表于 2020-3-15 10:38 | 只看该作者

密码是6767
回复

使用道具 举报

18#
ID:539798 发表于 2020-4-2 15:50 | 只看该作者
感谢感谢,这网站太好用了
回复

使用道具 举报

19#
ID:478073 发表于 2020-4-3 10:30 | 只看该作者
|一|枝|独|秀| 发表于 2020-4-2 15:50
感谢感谢,这网站太好用了

好用就多上来聊聊
回复

使用道具 举报

20#
ID:718173 发表于 2020-4-3 15:55 来自手机 | 只看该作者
楼主,按照你的的代码,键盘锁定之后该怎么解除锁定啊,在找就解答
回复

使用道具 举报

21#
ID:705465 发表于 2020-4-7 09:12 | 只看该作者
89c51没有IIC总线呀,只能模拟,那我要怎么实现呀
回复

使用道具 举报

22#
ID:764847 发表于 2020-6-1 10:58 | 只看该作者

请问一下。上面的程序是不是不全呀。我下载了但是没有全部源代码
回复

使用道具 举报

23#
ID:768360 发表于 2020-6-6 10:05 | 只看该作者
666 感谢兄弟
回复

使用道具 举报

24#
ID:773076 发表于 2020-6-8 17:18 | 只看该作者
谢谢分享,感觉受益匪浅!
回复

使用道具 举报

25#
ID:777060 发表于 2020-6-24 15:43 | 只看该作者
问一下怎么设置让它显示输入的数字呢
回复

使用道具 举报

26#
ID:777060 发表于 2020-6-24 15:44 | 只看该作者
大神啊,怎么让它显示输入的数字呢,就输入一个显示一个
回复

使用道具 举报

27#
ID:777060 发表于 2020-6-24 15:46 | 只看该作者
+++++++++++ 发表于 2020-6-1 10:58
请问一下。上面的程序是不是不全呀。我下载了但是没有全部源代码

有的,下载的全了,你现在还需要吗
回复

使用道具 举报

28#
ID:769553 发表于 2020-6-28 12:58 | 只看该作者
啊,我输入初始密码6767怎么直接锁了
回复

使用道具 举报

29#
ID:637237 发表于 2020-10-20 16:22 | 只看该作者
已下载,等有空的时候好好学习一下
回复

使用道具 举报

30#
ID:298850 发表于 2020-11-5 17:12 | 只看该作者
这主程序都辣么长。看完有点晕
回复

使用道具 举报

31#
ID:839241 发表于 2020-11-8 12:08 来自手机 | 只看该作者
找到了跟我一致想法的帖子
回复

使用道具 举报

32#
ID:849142 发表于 2020-12-5 09:37 | 只看该作者
DSN文件需要什么版本proteus才能打开呀
回复

使用道具 举报

33#
ID:861954 发表于 2020-12-22 08:08 | 只看该作者
我确实没想过一个锁的程序都这么多
回复

使用道具 举报

34#
ID:865733 发表于 2020-12-22 19:04 | 只看该作者
非常有用的程序,谢楼主分享
回复

使用道具 举报

35#
ID:870507 发表于 2020-12-29 19:41 | 只看该作者
太棒了,就是我想要的。
回复

使用道具 举报

36#
ID:28992 发表于 2021-6-4 07:14 | 只看该作者
thank you for your sharing!
回复

使用道具 举报

37#
ID:941265 发表于 2021-11-18 17:20 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

38#
ID:978751 发表于 2021-11-18 19:21 | 只看该作者
aaasym 发表于 2019-7-5 16:51
断电不能记忆密码-有弊端!

肯定可以了,24C02可以掉电存储啊
回复

使用道具 举报

39#
ID:982352 发表于 2021-11-18 21:22 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

40#
ID:985818 发表于 2021-11-30 20:39 | 只看该作者
做实物的话都需要买啥哇
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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