找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机密码锁仿真电路程序设计 6位密码

  [复制链接]
跳转到指定楼层
楼主
实物图:


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



矩阵键盘按键说明

  1       2       3       确认键
  4       5       6       手动关闭锁
  7       8       9      修改密码
密码还原  0     删除键   退出键

接电磁锁说明:
本身是不带电磁锁的,买家可以自己外接也可以和我们联系购买。如果要接电磁锁的话,需要外接电磁锁的电源,我们是用的12V的电磁锁,外接了12V的直流电源,照片和视频里面没有拍出来。
请买家自己要理解的是继电器只是相当一个开关,只是开和关,上面是没有电压和电流的,需要自己外接电磁锁的电源。

买多少V的电磁锁就要买多少V的直流电源供电。

单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

  4. #include "lcd1602.h"
  5. #include "iic.h"

  6. uchar value,i;                //变量

  7. uchar flag_lj_en;  //边加
  8. uchar flag_lj_en_value;

  9. sbit relay = P2^2;  //继电器定义
  10. sbit beep  = P3^3;  //蜂鸣器定义

  11. sbit beiguan = P2^3;  //背光

  12. uint flag_time;

  13. uint flag_guan;

  14. uchar smg_i;
  15. uchar dis_smg[7]={0};

  16. uchar password[7]={6,5,4,3,2,1};            //密码保存
  17. uchar password_bj[7]={1,2,3,4,5,6};        //密码比较
  18. uchar code password_r[6] = {1,2,3,1,2,3} ;
  19. uchar code password_gl[6] = {5,2,0,0,2,5} ;
  20. uchar password_xg[6];        //密码修改
  21. uchar flag_password;      //密码正确否
  22. uchar flag_password_cichu1;//密码错误次数

  23. bit flag_200ms=1;     //200ms标志位

  24. uchar key_can;

  25. uchar menu_1,menu_i;



  26. #include "iic.h"


  27. /***********************1ms延时函数*****************************/
  28. void delay_1ms(uint q)
  29. {
  30.         uint i,j;
  31.         for(i=0;i<q;i++)
  32.                 for(j=0;j<120;j++);
  33. }


  34. void key()         //独立按键程序
  35. {
  36.         static uchar key_new = 0, key_l;
  37.         key_can = 20;                   //按键值还原
  38.         P1 = 0x0f;
  39.         if((P1 & 0x0f) != 0x0f)                //按键按下
  40.         {
  41.                 delay_1ms(1);                     //按键消抖动
  42.                 if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
  43.                 {                                                //确认是按键按下
  44.                         key_new = 0;
  45.                         key_l = (P1 | 0xf0);   //矩阵键盘扫描
  46.                         P1 = key_l;
  47.                         switch(P1)
  48.                         {
  49.                                 case 0xee:  key_can = 1;  break;  //得到按键值
  50.                                 case 0xde:  key_can = 4;  break;   //得到按键值
  51.                                 case 0xbe:  key_can = 7;  break;   //得到按键值
  52.                                 case 0x7e:  key_can = 10;  break;   //得到按键值
  53.         
  54.                                 case 0xed:  key_can = 0;  break;  //得到按键值
  55.                                 case 0xdd:  key_can = 8;  break;   //得到按键值
  56.                                 case 0xbd:  key_can = 5;  break;   //得到按键值
  57.                                 case 0x7d:  key_can = 2;  break;   //得到按键值
  58.         
  59.                                 case 0xeb:  key_can = 3;  break;  //得到按键值
  60.                                 case 0xdb:  key_can = 6;  break;   //得到按键值
  61.                                 case 0xbb:  key_can = 9;  break;   //得到按键值
  62.                                 case 0x7b:  key_can = 11;  break;   //得到按键值
  63.         
  64.                                 case 0xe7:  key_can = 15;  break;  //得到按键值
  65.                                 case 0xd7:  key_can = 14;  break;  //得到按键值
  66.                                 case 0xb7:  key_can = 13;  break;   //得到按键值
  67.                                 case 0x77:  key_can = 12;  break;  //得到按键值  

  68.                         }        
  69.                 }                        
  70.         }
  71.         else
  72.         {
  73.                 key_new = 1;
  74.                 flag_lj_en = 0;
  75.         }        
  76. }


  77. /*****************密码还原********************/
  78. void password_return()
  79. {
  80.         
  81.         if(flag_lj_en == 1)
  82.         {
  83.                 flag_lj_en_value ++;
  84.                 if(flag_lj_en_value > 13)         //按下3秒钟就自动密码还原        
  85.                 {
  86.                         flag_lj_en_value = 0;        
  87.                         flag_lj_en = 0;
  88.                         write_24c02_8(6,0,password_r);               
  89.                         beep = 0;
  90.                         delay_1ms(500);
  91.                         beep = 1;         
  92.                         read_24c02_8(6,0,password);
  93.                 }
  94.         }               
  95. }

  96. /***************把数组清空**********************/
  97. void clear_shuzu(uchar *p)
  98. {
  99.         for(i=0;i<7;i++)
  100.                 p[i] = 0;
  101. }

  102. /*************定时器0初始化程序***************/
  103. void time_init()         
  104. {
  105.         EA   = 1;                   //开总中断
  106.         TMOD = 0X01;          //定时器0、工作方式1
  107.         ET0  = 1;                  //开定时器0中断
  108.         TR0  = 1;                  //允许定时器0定时
  109. }

  110. /******************下载程序密码初始化**********************/           
  111. void password_chushifa()
  112. {
  113.         scl = 0;
  114.         value = read_24c02(10) ;
  115.         if(value != 75)
  116.         {
  117.                 value = 75;
  118.                 beep = 0;
  119.                 write_24c02(10,value);
  120.                 delay_1ms(200);
  121.                 write_24c02_8(6,0,password_r);
  122.                 delay_1ms(200);
  123.                 read_24c02_8(6,0,password);
  124.                 beep = 1;         
  125.         }
  126. }


  127. /****************按键功能处理********************/           
  128. void key_with()
  129. {
  130.         static uchar value;
  131.         if(key_can == 14)   //手动关闭密码锁
  132.                 relay = 1;
  133.         if(key_can == 10)         //用做密码从新回到初始值
  134.         {                                 
  135.            flag_lj_en = 1;          //连加使能
  136.            flag_lj_en_value = 0;
  137.         }
  138.         if(menu_1 == 0)
  139.         {
  140.                 if(key_can <= 9)
  141.                 if(menu_i < 6)   //密码输入
  142.                 {
  143.                         menu_i ++;
  144.                         if(menu_i > 6)
  145.                                 menu_i = 6;
  146.                         smg_i = menu_i;
  147.                         for(i=6;i>0;i--)
  148.                                 password_bj[i] = password_bj[i-1];        
  149.                         password_bj[0] = key_can;
  150.                         for(i=0;i<smg_i;i++)
  151.                                 dis_smg[i] ='*';//0x30 + password_bj[i];
  152.                         write_string(2,7,dis_smg);        
  153.                         lcd1602_guanbiao(1,7 + menu_i + 0x40);  //开光标
  154.                 }        
  155.                 if(key_can == 11)         //密码删除
  156.                 {
  157.                         for(i=0;i<menu_i;i++)
  158.                                 password_bj[i] = password_bj[i+1];         
  159.                         menu_i --;
  160.                         password_bj[menu_i] = ' ';        
  161.                         dis_smg[menu_i] = ' ';
  162.                         write_string(2,7,dis_smg);        
  163.                         lcd1602_guanbiao(1,7 + menu_i + 0x40);  //开光标
  164.                 }
  165.                 if(key_can == 15)  //确认键
  166.                 {
  167.                         value = 0;
  168.                         for(i=0;i<6;i++)
  169.                         {
  170.                                 if(password_bj[i] == password_gl[i]) //判断管理员密码
  171.                                 {
  172.                                          value ++;
  173.                                         if(value >= 6)  //密码正确
  174.                                         {
  175.                                                 write_string(2,0,"    return      ");
  176.                                                 beep = 0;
  177.                                                 delay_1ms(200);
  178.                                                 read_24c02_8(6,0,password);
  179.                                                 beep = 1;         
  180.                                                 delay_1ms(2000);
  181.                                         }
  182.                                 }
  183.                         }
  184.                         if(value < 6)
  185.                         for(i=0;i<6;i++)
  186.                         {
  187.                                 if(password_bj[i] == password[i])
  188.                                 {
  189.                                         flag_password = 1;         //密码正确
  190.                                         relay = 0;     //打开密码锁
  191.                                         for(i=0;i<6;i++)
  192.                                                 dis_smg[i] = 0xbf;
  193.                                 }
  194.                                 else
  195.                                 {
  196.                                         flag_password = 0;
  197.                                         flag_password_cichu1 ++;
  198.                                         write_string(1,0," Password error ");        
  199.                                         write_string(2,0,"   cishu:       ");
  200.                                         write_sfm2(2,9,flag_password_cichu1);
  201.                                         delay_1ms(280);
  202.                         
  203.                                         for(i=0;i<6;i++)
  204.                                         {
  205.                                                 beep = ~beep;
  206.                                                 delay_1ms(200);
  207.                                         }
  208.                                         beep = 1;
  209.                                         delay_1ms(800);
  210.                                         break;               //密码不正确
  211.                                 }
  212.                         }
  213.                         clear_shuzu(dis_smg);
  214.                         write_string(1,0," Password Lock  ");        
  215.                         write_string(2,0," Input:         ");
  216.                         lcd1602_guanbiao(1,7+0x40);  //开光标
  217.                         menu_i = 0;
  218.                 }
  219.         }                                                                        
  220. }

  221. /****************修改密码********************/           
  222. void xiugai_password()
  223. {
  224.         if(key_can == 13)   //修改密码
  225.         {
  226.                 if((relay == 0) && (menu_1 == 0))
  227.                 {
  228.                         menu_1 = 1;        menu_i = 0;
  229.                         clear_shuzu(password_bj);          //数据清空
  230.                         clear_shuzu(dis_smg);
  231.                         write_string(1,0,"Input1:          ");        
  232.                         write_string(2,0,"Input2:          ");
  233.                         lcd1602_guanbiao(1,7);  //开光标
  234.                 }        
  235.         }
  236.         if(menu_1 == 1)   //第一次输入修改的密码
  237.         {
  238.                 if(key_can <= 9)
  239.                 {
  240.                         if(menu_i < 6)
  241.                         {
  242.                                 menu_i ++;
  243.                                 if(menu_i > 6)
  244.                                         menu_i = 6;
  245.                                 smg_i = menu_i;
  246.                                 for(i=7;i>0;i--)
  247.                                         password_bj[i] = password_bj[i-1];        
  248.                                 password_bj[0] = key_can;
  249.                                 for(i=0;i<menu_i;i++)
  250.                                         dis_smg[i] ='*';
  251.                                 write_string(1,7,dis_smg);
  252.                                 lcd1602_guanbiao(1,7 + menu_i);  //开光标        
  253.                         }        
  254.                 }
  255.                 if(key_can == 11)  //删除键
  256.                 {
  257.                         for(i=0;i<menu_i;i++)
  258.                                 password_bj[i] = password_bj[i+1];        
  259.                         menu_i --;
  260.                         password_bj[menu_i] = ' ';        
  261.                         dis_smg[menu_i] = ' ';
  262.                         write_string(1,7,dis_smg);        
  263.                         lcd1602_guanbiao(1,7 + menu_i);  //开光标        
  264.                 }        
  265.                 if(key_can == 15)  //确定键
  266.                 {
  267.                         clear_shuzu(password_xg);
  268.                         clear_shuzu(dis_smg);
  269.                         lcd1602_guanbiao(1,8 + 0x40);  //开光标
  270.                         menu_1 = 2;
  271.                     menu_i = 0;
  272.                         key_can = 20;
  273.                 }
  274.         }
  275.         if(menu_1 == 2)   //第二次输入修改的密码
  276.         {
  277.                 if(key_can <= 9)
  278.                 {
  279.                         if(menu_i < 6)
  280.                         {
  281.                                 menu_i ++;               
  282.                                 if(menu_i > 6)
  283.                                         menu_i = 6;
  284.                                 for(i=5;i>0;i--)
  285.                                         password_xg[i] = password_xg[i-1];        
  286.                                 password_xg[0] = key_can;
  287.                                 for(i=0;i<menu_i;i++)
  288.                                         dis_smg[i] ='*';//0x30 + password_xg[i];
  289.                                 write_string(2,7,dis_smg);           
  290.                                 lcd1602_guanbiao(1,7 + menu_i + 0x40);  //开光标
  291.                         }        
  292.                 }
  293.                 if(key_can == 11)  //删除键
  294.                 {
  295.                         for(i=0;i<menu_i;i++)
  296.                                 password_xg[i] = password_xg[i+1];        
  297.                         password_xg[menu_i] = ' ';        
  298.                         dis_smg[menu_i] = ' ';
  299.                         write_string(2,7,dis_smg);        
  300.                         lcd1602_guanbiao(1,7 + menu_i + 0x40);  //开光标
  301.                 }        
  302.                 if(key_can == 15)  //确定键
  303.                 {
  304.                         for(i=0;i<6;i++)
  305.                         {
  306.                                 if(password_bj[i] == password_xg[i])
  307.                                 {
  308.                                         flag_password = 1;         //两次输入的密码一样                        
  309.                                 }
  310.                                 else
  311.                                 {
  312.                                         flag_password = 0;
  313.                                         write_string(1,0," Password Error ");        
  314.                                         write_string(2,0,"     reenter    ");
  315.                                         delay_1ms(300);
  316.                                         for(i=0;i<6;i++)
  317.                                         {
  318.                                                 beep = ~beep;                //提示三声
  319.                                                 delay_1ms(300);
  320.                                         }
  321.                                         beep = 1;
  322.                                         delay_1ms(1000);
  323.                                         break;               //密码不正确
  324.                                 }
  325.                         }
  326.                         if(flag_password == 1)                 //两次输入的密码一样的
  327.                         {                        
  328.                                 for(i=0;i<6;i++)
  329.                                 {
  330.                                         write_string(1,0,"    Password    ");        
  331.                                         write_string(2,0,"    Succeed     ");
  332.                                         password[i] = password_bj[i];   //保存密码
  333.                                 }
  334.                                 write_24c02_8(6,0,password);
  335.                                 delay_1ms(300);
  336.                                 beep = 0;
  337.                                 delay_1ms(2000);
  338.                                 beep = 1;
  339.                         }
  340.                         clear_shuzu(password_xg);
  341.                         clear_shuzu(dis_smg);
  342.                         write_string(1,0," Password Lock  ");        
  343.                         write_string(2,0," Input:         ");
  344.                         lcd1602_guanbiao(1,7+0x40);  //开光标
  345.                         menu_1 = 0;
  346.                     menu_i = 0;

  347.                 }
  348.         }        
  349. }


  350. /******************主程序**********************/           
  351. void main()
  352. {
  353.         static uint value ;
  354.         password_chushifa();
  355.         time_init();   //定时器初始化
  356.         read_24c02_8(6,0,password);
  357.         init_1602();
  358.         beiguan = 0;
  359.         while(1)
  360.         {        
  361.                 if(flag_password_cichu1 < 3)     //错误三次按键不能用了
  362.                 {
  363.                         key();                                         //按键函数
  364.                         if(key_can < 20)
  365.                         {
  366.                                 if(beiguan == 0)
  367.                                 {
  368.                                         if(menu_1 == 0)
  369.                                                 key_with();                         //按键处理函数
  370.                                         xiugai_password();       //修改密码
  371.                                 }
  372.                                 else
  373.                                         beiguan = 0;
  374.                                 flag_time = 0;               
  375.                         }
  376.                 }

  377.                 if(flag_200ms == 1)
  378.                 {
  379.                         flag_200ms = 0;         
  380.                         if(beiguan == 0)         //延时关闭锁20秒关闭背光
  381.                         {
  382. ……………………

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


仿真程序等资料,密码123123:
单片机电子密码锁 1602.7z (2.12 MB, 下载次数: 360)




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

使用道具 举报

沙发
ID:777173 发表于 2020-6-12 13:37 | 只看该作者
谢谢分享
回复

使用道具 举报

板凳
ID:663502 发表于 2020-6-22 11:21 | 只看该作者
我也试一试,谢谢分享!!!
回复

使用道具 举报

地板
ID:783189 发表于 2020-6-23 01:36 | 只看该作者
感谢大佬
回复

使用道具 举报

5#
ID:611032 发表于 2020-6-23 14:25 | 只看该作者
感谢大佬
回复

使用道具 举报

6#
ID:774009 发表于 2020-6-23 19:04 | 只看该作者
初始密码是多少鸭?
回复

使用道具 举报

7#
ID:897137 发表于 2021-4-29 23:39 | 只看该作者
楼主给的源程序跟仿真hex文件,源程序有很多问题,楼主有最终的源程序吗?改了好久改不出来,源程序的键盘扫描模块有问题,求正确的程序
回复

使用道具 举报

8#
ID:1092027 发表于 2023-8-27 11:24 | 只看该作者
uchar flag_lj_en;  //边加
uchar flag_lj_en_value;
这个起什么作用呢?
uchar password[7]={6,5,4,3,2,1}; 还有这个数组,六个数字前面怎么是7呢
回复

使用道具 举报

9#
ID:884711 发表于 2024-5-5 09:52 | 只看该作者
路过学习,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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