找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10768|回复: 18
收起左侧

单片机电子密码锁仿真 可修改密码

  [复制链接]
ID:204443 发表于 2017-5-29 10:00 | 显示全部楼层 |阅读模式
电子密码锁 可修改密码等,下面是proteus仿真原理图:
QQ图片20170529095832.png

0.png 0.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include "delay_ms.h"
  3. #include  "矩阵键盘.h"
  4. #include "i2c.h"
  5. #include "1602.h"
  6. #include "delay_ms.h"
  7. #include "mima.h"
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. #define A 0x0a //输入密码
  11. #define B 0x0b  //修改密码
  12. #define D 0x0d //关锁
  13. #define enter 0x0c //确认
  14. #define backspace 0x0f //退格键
  15. sbit baojing = P3^7; //蜂鸣器接口
  16. sbit lock = P3^3;//锁信号
  17. sbit set = P3^2;
  18. uchar idata mima_5[6] = {1,2,3,4,5,6}; //初始密码
  19. uchar flag_change;
  20. uchar aa;//存放密码错误的次数,够三次报警
  21. uchar bb;
  22. uchar flag_t0;
  23. void baoj1()//报警函数
  24. {
  25.         int i;
  26.         for(i = 0;i < 5; i++)
  27.         {
  28.                 baojing = 1;
  29.                 delay_ms(5);
  30.                 baojing = 0;
  31.                 delay_ms(5);       
  32.         }

  33. }
  34. void baoj()
  35. {
  36.         uchar i;
  37.         for(i = 0; i < 10; i++)
  38.                 baoj1();
  39. }
  40. /*密码处理函数*/
  41. void mimachuli()
  42. {
  43.         uchar key,i;
  44.         uchar idata mima_1[6]={' ',' ',' ',' ',' ',' '};//存放密码缓冲区
  45.         uchar idata mima_2[6]={' ',' ',' ',' ',' ',' '};
  46.         uchar idata mima_3[6]={' ',' ',' ',' ',' ',' '};

  47.         key = step_choose();
  48.         if(key == A)//A被按下,接收输入密码,处理
  49.         {
  50.                 read_n_add(mima_1,0x00,6);
  51.                 write_com(0x06);//写一个字符后地址指针加 1
  52.                 write_com(0x01);//显示清零,数据指针清零
  53.                 write_com(0x0f);//显示光标
  54.                 lcd_pos(0,0);
  55.                 write_n_char(" press password ");               
  56.        
  57.                 if(input_mima(mima_2)) //处理输入密码
  58.                 {
  59.                         if(mimaduibi(mima_2,mima_1)) //密码正确
  60.                         {
  61.                                 lcd_pos(0,0);
  62.                                 write_com(0x0c);
  63.                         write_com(0x06);//写一个字符后地址指针加 1
  64.                          write_com(0x01);//显示清零,数据指针清零
  65.                                 write_n_char(" password right ");
  66.                                 aa = 0; //清除密码错误次数
  67.                                 lock = 0; //开锁
  68.                                 baojing = 1; //响一下
  69.                                 delay_ms(1000);
  70.                                 baojing = 0;
  71.                                 TR0 = 1;
  72.                                 flag_t0 = 1;
  73.                                 while(key != D && flag_t0) //D没按下一直开
  74.                                 {                       
  75.                                         key = keyscan();
  76.                                 }
  77.                                 TR0 = 0;
  78.                                 lock = 1;//D按下了关锁
  79.                         }
  80.                         else //密码 不正确
  81.                         {
  82.                                 lcd_pos(0,0);
  83.                                 write_com(0x0c); //关光标
  84.                                 write_com(0x06);//写一个字符后地址指针加 1
  85.                                 write_com(0x01);//显示清零,数据指针清零
  86.                                 write_n_char(" password wrong");
  87.                                 delay_ms(1000);
  88.                                 aa++;
  89.                                 if(aa == 4)
  90.                                 {
  91.                                         aa = 0;
  92.                                     i = 20; //密码不正确报警
  93.                                         while(i--)
  94.                                          baoj();
  95.                                 }

  96.                         }
  97.                 }
  98.                 else //密码没有输入正确或完成
  99.                 {
  100.                         lcd_pos(0,0);
  101.                         write_com(0x0c); //关光标
  102.                    write_com(0x06);//写一个字符后地址指针加 1
  103.                    write_com(0x01);//显示清零,数据指针清零
  104.                         write_n_char(" password wrong");
  105.                         delay_ms(1000);
  106.                         aa++;
  107.                         if(aa == 4)
  108.                         {
  109.                                 aa = 0;
  110.                             i = 20; //密码不正确报警
  111.                                 while(i--)
  112.                                  baoj();
  113.                         }

  114.                 }
  115.         }

  116.         if(key == B)//B被按下,修改密码
  117.         {
  118.                 read_n_add(mima_1,0x00,6);
  119.                 write_com(0x06);//写一个字符后地址指针加 1
  120.                 write_com(0x01);//显示清零,数据指针清零
  121.                 write_com(0x0f);//显示光标
  122.                 lcd_pos(0,0);
  123.                 write_n_char(" input password");               
  124.                 write_com(0x0f);//显示光标       
  125.                 if(input_mima(mima_2)) //处理输入密码
  126.                 {
  127.                         if(mimaduibi(mima_2,mima_1)) //密码正确
  128.                         {
  129.                                 lcd_pos(0,0);
  130.                                 write_com(0x0c);
  131.                       write_com(0x06);//写一个字符后地址指针加 1
  132.                       write_com(0x01);//显示清零,数据指针清零
  133.                                 write_n_char("password right ");
  134.                                 aa = 0; //清除密码错误次数
  135.                                 delay_ms(1500);
  136.                                 flag_change = 1;
  137.                                 while(flag_change) //下面开始修改密码
  138.                                 {
  139.                                         write_com(0x06);//写一个字符后地址指针加 1
  140.                                         write_com(0x01);//显示清零,数据指针清零
  141.                                         write_com(0x0f);//显示光标
  142.                                         lcd_pos(0,0);
  143.                                         write_n_char("In new password");
  144.                                         delay_ms(1500);
  145.                                         if(input_mima(mima_2)) //处理输入密码
  146.                                         {

  147.                                                 lcd_pos(0,0);
  148.                                                 write_com(0x0c);
  149.                                  write_com(0x06);//写一个字符后地址指针加 1
  150.                                  write_com(0x01);//显示清零,数据指针清零
  151.                                                 write_n_char("Input new pass"); //确定新密码
  152.                                                 lcd_pos(1,0);
  153.                                                 write_n_char("word again");
  154.                                                 delay_ms(2000);
  155.                                                 lcd_pos(0,0);
  156.                                                 write_com(0x0f);//显示光标
  157.                                  write_com(0x06);//写一个字符后地址指针加 1
  158.                                  write_com(0x01);//显示清零,数据指针清零
  159.                                                 write_n_char("In new password");                                               
  160.                                                         if(input_mima(mima_3)) //处理输入密码
  161.                                                         {
  162.                                                                 if(mimaduibi(mima_2,mima_3)) //密码正确
  163.                                                                 {
  164.                                                                         lcd_pos(0,0);
  165.                                                                         write_com(0x0c);
  166.                                                               write_com(0x06);//写一个字符后地址指针加 1
  167.                                                               write_com(0x01);//显示清零,数据指针清零
  168.                                                                         write_n_char("password has");
  169.                                                                         lcd_pos(1,0);
  170.                                                                         write_n_char("change already");
  171.                                                                         write_n_add(mima_3,0x00,6); //把修改的密码存进24C02
  172.                                                                         delay_ms(2000);
  173.                                                                         flag_change = 0;
  174.                                                                 }
  175.                                                                 else //密码 不正确
  176.                                                                 {
  177.                                                                         lcd_pos(0,0);
  178.                                                                         write_com(0x0c); //关光标
  179.                                                                         write_com(0x06);//写一个字符后地址指针加 1
  180.                                                                         write_com(0x01);//显示清零,数据指针清零
  181.                                                                         write_n_char("password wrong");
  182.                                                                         delay_ms(1000);
  183.                                                                         aa++;
  184.                                                                         if(aa == 4)
  185.                                                                         {
  186.                                                                                 aa = 0;
  187.                                                                             i = 20; //3次输入密码不正确报警
  188.                                                                                 while(i--)
  189.                                                                                  baoj();
  190.                                                                         }
  191.                                                                         flag_change = 0;
  192.                                                                 }
  193.                                                         }
  194.                                                         else //密码没有输入正确或完成
  195.                                                         {
  196.                                                                 lcd_pos(0,0);
  197.                                                                 write_com(0x0c); //关光标
  198.                                                            write_com(0x06);//写一个字符后地址指针加 1
  199.                                                            write_com(0x01);//显示清零,数据指针清零
  200.                                                                 write_n_char(" password wrong");
  201.                                                                 delay_ms(1000);
  202.                                                                 aa++;
  203.                                                                 if(aa == 4)
  204.                                                                 {
  205.                                                                         aa = 0;
  206.                                                                     i = 20; //3次输入密码不正确报警
  207.                                                                         while(i--)
  208.                                                                          baoj();
  209.                                                                 }
  210.                                                         }
  211.                                                
  212.                                         }
  213.                                         else //密码没有输入正确或完成
  214.                                         {
  215.                                                 lcd_pos(0,0);
  216.                                                 write_com(0x0c); //关光标
  217.                                            write_com(0x06);//写一个字符后地址指针加 1
  218.                                            write_com(0x01);//显示清零,数据指针清零
  219.                                                 write_n_char("password wrong");
  220.                                                 delay_ms(1000);
  221.                                                 flag_change = 0;
  222.                                                 aa++;
  223.                                                 if(aa == 4)
  224.                                                 {
  225.                                                         aa = 0;
  226.                                                     i = 20; //3次输入密码不正确报警
  227.                                                         while(i--)
  228.                                                          baoj();
  229.                                                 }
  230.                                         }
  231.                                                                        
  232.                                 }
  233.                         }
  234.                         else //密码 不正确
  235.                         {
  236.                                 lcd_pos(0,0);
  237.                                 write_com(0x0c); //关光标
  238.                                 write_com(0x06);//写一个字符后地址指针加 1
  239.                                 write_com(0x01);//显示清零,数据指针清零
  240.                                 write_n_char("password wrong");
  241.                                 delay_ms(1000);
  242.                                 aa++;
  243.                                 if(aa == 4)
  244.                                 {
  245.                                         aa = 0;
  246.                                     i = 20; //3次输入密码不正确报警
  247.                                         while(i--)
  248.                                          baoj();
  249.                                 }
  250.                         }
  251.                 }
  252.                 else //密码没有输入正确或完成
  253.                 {
  254.                         lcd_pos(0,0);
  255.                         write_com(0x0c); //关光标
  256.                    write_com(0x06);//写一个字符后地址指针加 1
  257.                    write_com(0x01);//显示清零,数据指针清零
  258.                         write_n_char("password wrong");
  259.                         delay_ms(1000);
  260.                         aa++;
  261.                         if(aa == 4)
  262.                         {
  263.                                 aa = 0;
  264.                             i = 20; //3次输入密码不正确报警
  265.                                 while(i--)
  266.                                  baoj();
  267.                         }
  268.                 }               
  269.         }

  270. }
  271. /*外部中断函数,恢复出厂设置,长按set键恢复*/

  272. void int0() interrupt 0
  273. {
  274.         delay_ms(2000);
  275.         if(!set)
  276.         {
  277.                 lcd_pos(0,0);
  278.                 write_com(0x0c); //关光标
  279.            write_com(0x06);//写一个字符后地址指针加 1
  280.                 write_com(0x01);//显示清零,数据指针清零
  281.                 i2cinit();//24C02总线初始化
  282.                 write_n_add(mima_5,0x00,6);
  283.                 write_n_char("password renew");
  284.                 lcd_pos(1,0);
  285.                 write_n_char("already");
  286.                 delay_ms(1000);
  287.                 lcd_pos(0,0);
  288.                 write_com(0x0c); //关光标
  289.            write_com(0x06);//写一个字符后地址指针加 1
  290.                 write_com(0x01);//显示清零,数据指针清零
  291.                 write_n_char("Input password");
  292.                 lcd_pos(1,0);
  293.                 write_n_char("Press key A");

  294.         }// 引起了三个警告
  295. }
  296. ……………………

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

所有资料51hei提供下载:
电子密码锁仿真有代码.zip (3.92 MB, 下载次数: 468)

评分

参与人数 2黑币 +55 收起 理由
老大4012 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:248401 发表于 2017-11-11 16:35 | 显示全部楼层
支持支持
回复

使用道具 举报

ID:248401 发表于 2017-11-11 17:49 | 显示全部楼层
支持了
回复

使用道具 举报

ID:298628 发表于 2018-3-28 23:05 | 显示全部楼层
谢谢楼主的程序
回复

使用道具 举报

ID:333064 发表于 2018-5-18 15:57 | 显示全部楼层
楼主真棒
回复

使用道具 举报

ID:363386 发表于 2018-7-5 13:46 | 显示全部楼层
真心在这里面有好多大佬谢谢分享
回复

使用道具 举报

ID:365622 发表于 2018-7-5 15:03 | 显示全部楼层
大佬,都是大佬
回复

使用道具 举报

ID:28942 发表于 2018-7-5 22:44 | 显示全部楼层
谢谢楼主的分享
回复

使用道具 举报

ID:398918 发表于 2018-9-17 11:10 | 显示全部楼层
谢谢,楼主的分享
回复

使用道具 举报

ID:403340 发表于 2018-9-27 20:05 来自手机 | 显示全部楼层
z348818516 发表于 2018-9-17 11:10
谢谢,楼主的分享

大佬是否可以分享一下
回复

使用道具 举报

ID:358464 发表于 2019-4-8 10:05 | 显示全部楼层
谢谢分享!参考一下
回复

使用道具 举报

ID:585326 发表于 2019-8-9 19:53 | 显示全部楼层
不能修改密码
回复

使用道具 举报

ID:654359 发表于 2019-12-2 15:56 | 显示全部楼层
感谢分享!学习一下。
回复

使用道具 举报

ID:659524 发表于 2019-12-11 11:35 来自手机 | 显示全部楼层
大佬求资料分享
回复

使用道具 举报

ID:776035 发表于 2020-6-11 11:38 | 显示全部楼层
感谢分享!学习一下。
回复

使用道具 举报

ID:780428 发表于 2020-6-15 21:32 | 显示全部楼层
支持支持
回复

使用道具 举报

ID:780128 发表于 2020-6-17 22:41 | 显示全部楼层
支持支持帮大忙了
回复

使用道具 举报

ID:783929 发表于 2020-6-19 10:58 | 显示全部楼层
太厉害了
回复

使用道具 举报

ID:1076624 发表于 2023-5-11 10:47 来自手机 | 显示全部楼层
1044689557 发表于 2019-8-9 19:53
不能修改密码

能改吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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