找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 32036|回复: 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, 下载次数: 2374)
演示视频.7z (9.91 MB, 下载次数: 262)

评分

参与人数 2黑币 +55 收起 理由
山科大 + 5 绝世好帖!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

58#
ID:1109531 发表于 2024-1-17 19:02 | 只看该作者
请问要下载什么东西吗才能打开你这些
回复

使用道具 举报

57#
ID:1092999 发表于 2023-9-8 17:28 | 只看该作者
+++++++++++ 发表于 2020-6-1 10:58
请问一下。上面的程序是不是不全呀。我下载了但是没有全部源代码

我也是
回复

使用道具 举报

56#
ID:1085806 发表于 2023-6-25 10:40 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

55#
ID:1081560 发表于 2023-6-2 11:16 | 只看该作者
51有你更精彩
回复

使用道具 举报

54#
ID:1077054 发表于 2023-5-12 14:38 来自手机 | 只看该作者
麻烦问一下这个代码适用于52单片机吗?
回复

使用道具 举报

53#
ID:1054627 发表于 2022-11-29 14:25 | 只看该作者
太爱啦这个代码
回复

使用道具 举报

52#
ID:1054627 发表于 2022-11-29 14:25 | 只看该作者
看得懂就行
回复

使用道具 举报

51#
ID:1051869 发表于 2022-11-26 15:25 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

50#
ID:1037792 发表于 2022-6-30 17:53 | 只看该作者
设置的密码是多少啊
回复

使用道具 举报

49#
ID:1033693 发表于 2022-6-22 09:03 来自手机 | 只看该作者
清水煮鱼 发表于 2020-1-5 21:30
请问如何将4位改成6位可以吗?

可以改,只不过程序内部就得改东
回复

使用道具 举报

48#
ID:1033215 发表于 2022-6-8 15:14 | 只看该作者
DestinyW 发表于 2019-11-21 12:56
如果51换成stm32的有哪些地方需要改动?

挺多的,端口什么的
回复

使用道具 举报

47#
ID:1027854 发表于 2022-5-24 11:29 | 只看该作者
有AD源文件吗
回复

使用道具 举报

46#
ID:1028811 发表于 2022-5-23 13:06 来自手机 | 只看该作者
代码都正确,但最后仿真运行的时候,我的LCD1602只亮但没有显示字,需要按键才显示
我觉得应该要加一个启动界面比较好  提示用户输入
回复

使用道具 举报

45#
ID:1027639 发表于 2022-5-18 17:29 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

44#
ID:1020070 发表于 2022-4-25 19:45 | 只看该作者
有没有实物图正面全图
回复

使用道具 举报

43#
ID:1010506 发表于 2022-3-15 10:22 | 只看该作者
lll1472589 发表于 2020-6-24 15:46
有的,下载的全了,你现在还需要吗

可以分享一下么,我下载的好像不全诶
回复

使用道具 举报

42#
ID:993956 发表于 2021-12-19 09:16 | 只看该作者
看完了,没懂
回复

使用道具 举报

41#
ID:917265 发表于 2021-12-9 18:02 | 只看该作者
有点旧了
回复

使用道具 举报

40#
ID:989093 发表于 2021-12-7 14:00 | 只看该作者
有没有汇编语言的
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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