找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9290|回复: 16
收起左侧

51单片机+LCD1602电子密码锁程序

  [复制链接]
ID:539683 发表于 2019-5-16 11:11 | 显示全部楼层 |阅读模式
基于51电路板 电子密码锁程序

24c02采用IIC与单片机通信,其详细通信时序参考24C02数据手册。我们只需使用At24c02Read(unsigned char addr)和At24c02Write(unsigned char addr,unsigned char dat)即可。

一、        实验现象
将线连接好并将程序下载后,可以看到1602上显示:
              
此时可以按下任意键继续
在这里我们可以“1”或“9”选择开锁或者是修改密码。如果这里选择的开锁,按下确定键,此时会提示输入密码,初始密码默认为888888,输入密码
然后按下确定键,如果密码正确则会显示:
并且可以看到继电器模块指示灯亮并可以听到继电器闭合的声音。
如果密码错误则会提示:Error.



  如果需要修改密码,则选择Change password
这里会提示输入密码:
输入原密码
按下确认键,如果密码正确会提示输入新密码,
输入密码后按下确认键,会提示OK并返回到待机画面。

单片机源程序如下:
  1. /**************************************************************************************
  2. *                              电子密码锁                                                                                                  *
  3. 实现现象:下载程序输入正确密码,会听到继电器吸合的声音
  4. 硬件连接:
  5.            P1 -->矩阵键盘
  6.                                          P20--> EEPROM模块SDA
  7.                                          P21--> EEPROM模块SCL
  8.                                          P22-->继电器模块J15
  9.                                          
  10.                                          矩阵键盘:
  11.                                          0      1      2       3
  12.                                          
  13.                                          4      5      6       7
  14.                                          
  15.                                          8      9    返回    确定
  16.                                          
  17.                                          [        DISCUZ_CODE_22        ]nbsp;     [        DISCUZ_CODE_22        ]nbsp;     [        DISCUZ_CODE_22        ]nbsp;      $
  18. 注意事项:无                                                                                                                                                                  
  19. ***************************************************************************************/

  20. #include "reg52.h"                       //此文件中定义了单片机的一些特殊功能寄存器
  21. #include "lcd.h"
  22. #include "key.h"
  23. #include "i2c.h"

  24. #define u16 unsigned int           //对数据类型进行声明定义
  25. #define u8 unsigned char

  26. sbit AS=P2^2;               //继电器

  27. /*****************************************************************************/

  28. /*****************************************************************************/
  29. u8 pw_num,Error_Num,PassWord_Length=6;
  30. u8 PASSWORD[]={8,8,8,8,8,8,0,0,0,0};
  31. u8 INPUT_PW_Tab[10];
  32. u8 key_num,Step,Step5,Load_first_flag=0;
  33. /*****************************************************************************/

  34. /*******************************************************************************/
  35. bit result_flag,Input_suc_flag;
  36. bit List1=0;
  37. /*****************************************************************************/

  38. /*******************************************************************************/
  39. void Step_0();
  40. void Step_1();
  41. void Step_2();
  42. void Step_3();
  43. void Step_4();
  44.          
  45. void Step_5();
  46.                  void Step5_0();
  47.            void Step5_1();
  48.            void Step5_2();
  49.            void Step5_3();
  50.            void Step5_4();
  51.            void Step5_5();
  52. void Step_6();
  53. /********************************************************************************/

  54. /*******************************************************************************/
  55. void CipherComparison();
  56. void input_password(bit m);
  57. void Read_Password();



  58. /*******************************************************************************
  59. * 函 数 名       : main
  60. * 函数功能                 : 主函数
  61. * 输    入       : 无
  62. * 输    出             : 无
  63. *******************************************************************************/
  64. void main()
  65. {        
  66.         u8 data1,a;
  67.         //        ShowString(0x00," Pechin Science ");  
  68.         //        At24c02Write(0,0);                                                //开机显示密码
  69.         LcdWriteCom(0x01);  //清屏
  70.         for(data1=0;data1<PassWord_Length+2;data1++)
  71.         {
  72.                 a=At24c02Read(data1)+0x30;
  73.                  LcdWriteData(a);        
  74.           delay(1000);        
  75.   }
  76.         
  77.         delay(1000);
  78.         LcdInit();
  79.         delay(1000);
  80.         Step=0;
  81.         Step5=0;
  82.         Error_Num=0x00;
  83.   Read_Password();
  84.         
  85.     //保存 密码长度
  86. //                for(j=0;j<10;j++)
  87. //                {
  88. //                        At24c02Write(j,j);
  89. //                        delay(100);        
  90. //                }
  91. //        

  92.         
  93.         while(1)
  94.                                 {        
  95.                                                                 key_num=KeyDown();                   //读取输入值

  96.                                                                                 switch(Step)
  97.                                                                                 {
  98.                                                                                                 case 0:
  99.                                                                                                  {Step_0();break;}
  100.                                                                                                 case 1:
  101.                                                                                                  {Step_1();break;}
  102.                                                                                                 case 2:
  103.                                                                                                  {Step_2();break;}
  104.                                                                                                 case 3:
  105.                                                                                                  {Step_3();break;}        
  106.                                                                                                 case 4:
  107.                                                                                                  {Step_4();break;}        
  108.                                                                                                 case 5:
  109.                                                                                                  {Step_5();break;}        
  110.                                                                                                 case 6:
  111.                                                                                                  {Step_6();break;}        
  112.                                                                                                   
  113.                                                                                 }

  114.                                  }                                
  115. }

  116. /*****************************************************************************/

  117. /*******************************************************************************/
  118. void Step_0()
  119. {
  120.                                         LcdInit();
  121.                                         ShowString(0x00," Pechin Science ");                           //第一行显示Pechin Science
  122.                 ShowString(0x10,"    WELCOME!    ");                           // 第二行显示 WELCOME!  
  123.         
  124.                                         while(KeyDown()==0xff)Step=1;                                  //  有按键按下进入下一步  
  125.               
  126.                                        
  127. }
  128. /*****************************************************************************/

  129. /*******************************************************************************/
  130. void Step_1()
  131. {
  132.                 LcdWriteCom(0x01);                                           //清屏
  133.           ShowString(0x00,"Unlock");
  134.                 ShowString(0x0f,"<");                                               //1602第一行显示unlock
  135.           ShowString(0x10,"Change Password");
  136.                 ShowString(0x1f," ");                                                // 1602第二行显示Change Password                                                                                    
  137.           Step=2;                                                              //
  138. }
  139. /*****************************************************************************/

  140. /*******************************************************************************/
  141. void Step_2()
  142. {

  143.         if(key_num!=0x0b)  
  144.                 {
  145.                                         if((key_num==0x01) ||( key_num==0x09))                    //1键或9键按下
  146.                                         {
  147.                                                                 List1=~List1;                           //Change Password
  148.                                                                 if(List1==0)
  149.                                                                         {                                                  
  150.                                                                         ShowString(0x0f,"<");                           // Unlock            <
  151.                                                                         ShowString(0x1f," ");                                  // Change Password  
  152.                                                                 }
  153.                                                                 else
  154.                                                                 {
  155.                                                                         ShowString(0x0f," ");                           // Unlock            
  156.                                                                         ShowString(0x1f,"<");                                  // Change Password   <
  157.                                                                 }
  158.                                         }
  159.                 }
  160.         else                                                           //确认键按下
  161.         {
  162.                                         if(List1==0){Step=3;}
  163.                                         else        {Step=5;List1=0;}
  164.         }
  165. }
  166. /*****************************************************************************/

  167. /*******************************************************************************/
  168. void Step_3()                                             //
  169. {
  170.                                                                 Step=4;
  171.                       pw_num=0;
  172.                                                                 LcdInit();
  173.                                                                 ShowString(0x00,"Pass Word:  ");
  174.                
  175.                                                 
  176. }
  177. /*****************************************************************************/

  178. /*******************************************************************************/
  179. void Step_4()                                                
  180. {
  181.            input_password(0);                                              //输入密码并以*显示
  182.            if(Input_suc_flag==1){Step=6;}                                  //密码输入完成进入下一步
  183.       Input_suc_flag=0;                                              //清除密码输入完成标志
  184. }
  185. /*****************************************************************************/

  186. /*******************************************************************************/
  187. void Step_5()                                                        //修改密码
  188. {
  189.         switch(Step5)
  190.         {
  191.                
  192.                         case 0: {Step5_0();}  break;
  193.                         case 1: {Step5_1();}  break;
  194.                         case 2: {Step5_2();}  break;
  195.                         case 3: {Step5_3();}  break;
  196.                   case 4: {Step5_4();}  break;
  197.                         case 5:        {Step5_5();}        break;

  198.         }
  199. }
  200. /*****************************************************************************/

  201. /*******************************************************************************/
  202. void Step_6()
  203. {
  204.         CipherComparison();                                //密码比对
  205.         if(result_flag==1)                                 //密码正确
  206.                 {
  207.                                 LcdInit();
  208.                                 ShowString(0x00,"    WELCOME!");
  209.                                 AS=0;                                         //开继电器
  210.                                 delay(60000);
  211.                                 delay(60000);
  212.                                 AS=1;                                                //关继电器
  213.                 }
  214.         else                                                //密码错误
  215.                 {
  216.                                 LcdInit();
  217.                                 ShowString(0x00,"Error 01!");
  218.                 }
  219.                
  220.                 Step=0;
  221.         

  222. }

  223. /****************************************************************************************
  224. 密码输入函数
  225. 密码长度:pw_num
  226. 密码输入完成标志:Input_suc_flag
  227. *****************************************************************************************/

  228. void Step5_0()                 
  229. {
  230.                 LcdWriteCom(0x01);  //清屏
  231.           ShowString (0x00,"Input PassWord:");     //1602显示:输入密码
  232.           Step5=1;
  233.           pw_num=0;
  234. }
  235. void Step5_1()               
  236. {
  237.                 input_password(0);                  //   输入密码并以*显示
  238.                 if(Input_suc_flag==1)               //密码输入完成
  239.                         {
  240.                                                         Step5=2;                  //
  241.                                                         Input_suc_flag=0;         //清除密码输入完成标志
  242.                         }
  243. }
  244. void Step5_2()                //
  245. {
  246.      CipherComparison();                //密码比对
  247.            Step5=3;
  248. }
  249. void Step5_3()                //
  250. {
  251.     if(result_flag==0)         //        密码错误
  252.                                 {
  253.                                                         if(Error_Num<3)             //输出错误次数小于3
  254.                                                         {
  255.                                                                 Error_Num++;
  256.                                                                 LcdInit();
  257.                                                                 ShowString (0x00,"Error 01");
  258.                                                                 delay(20000);
  259.                                                                 Step5=0;
  260.                                                         }
  261.                                                         else                          //密码错误次数大于3
  262.                                                         {
  263.                                                                 Error_Num=0;
  264.                                                                 Step=0;
  265.                                                         }
  266.                                        
  267.                                 }
  268.                 else                                                                                                     //密码正确
  269.                                 {
  270.                                         LcdInit();
  271.                                         ShowString (0x00,"New PassWord:");        
  272.                                         pw_num=0;
  273.                                         Step5=4;
  274.                                 }
  275.                         
  276.                                        
  277. }
  278. void Step5_4()
  279. {
  280.                 input_password(1);                                                    //输入密码并显示
  281.                 if(Input_suc_flag==1)                  //输入完成
  282.                         {
  283.                                 Step5=5;
  284.                                 Input_suc_flag=0;
  285.                                 LcdWriteCom(0x01);  //清屏
  286.               ShowString (0x00,"      OK!");
  287.                         }
  288. }
  289. void Step5_5()
  290. {
  291.         unsigned char j;
  292.         
  293.         PassWord_Length=pw_num;                         //读取输入密码长度
  294.         At24c02Write(0,Load_first_flag);        
  295.   delay(100);        
  296.         At24c02Write(1,PassWord_Length);                //保存 密码长度
  297.         delay(100);
  298.         for(j=0;j<PassWord_Length;j++)         
  299.         {
  300.                 PASSWORD[j]=INPUT_PW_Tab[j];                                //读取密码
  301.                 At24c02Write(j+2,INPUT_PW_Tab[j]);                          //保存密码至EEPROM
  302.                 delay(100);
  303. }
  304.         Step5=0;
  305.         Step=0;
  306. }


  307. void Read_Password()
  308. {
  309.         unsigned char j;

  310.         Load_first_flag=At24c02Read(0x00);
  311.         if(Load_first_flag==0)                          //初次运行
  312.         {
  313.         
  314.                 Load_first_flag=1;
  315.                 At24c02Write(0,0x01);
  316.                 delay(100);
  317.                 At24c02Write(1,0x06);           //写默认密码长度6至EEPROM
  318.                 delay(100);
  319.                 for(j=0;j<PassWord_Length;j++)
  320.                 {
  321.                         At24c02Write(j+2,8);              //写默认密码888888至EEPROM
  322.                         PASSWORD[j]=INPUT_PW_Tab[j];     //读密码
  323.                         delay(100);
  324.                 }
  325.         }
  326.         
  327.         Load_first_flag=At24c02Read(0x00);
  328.         PassWord_Length=At24c02Read(0x01);  //读取密码长度
  329.         for(j=0;j<PassWord_Length;j++)       //读取密码
  330.         {
  331.                 PASSWORD[j]=At24c02Read(j+2);
  332.         }
  333.         
  334. }
  335. void input_password(bit m)
  336. {
  337.         unsigned char j;
  338.         if(key_num!=0x0b)                                      //ok键没有按下
  339.                 {
  340.                                         if(key_num<0x0a)                               //1-9按下
  341.                                         {
  342.                                                 INPUT_PW_Tab[pw_num]=key_num;                //保存至输入密码数组
  343.                                                 pw_num=pw_num+1;                              //密码长度+1
  344.                                                 
  345.                                                  LcdWriteCom(0xc0);
  346.                                                  for(j=0;j<pw_num;j++)
  347.                                                                 {
  348.                                                                                                 if(m==0) {LcdWriteData('*');        }                        //密码隐藏
  349.                                                                                                 else     {LcdWriteData(INPUT_PW_Tab[j]+0x30);}         //显示密码
  350.                                                                 }
  351.                                                                                        
  352.                                         }
  353.                                         if(key_num==0x0a)                              //返回键按下
  354.                                         {
  355.                                                 if(pw_num!=0) {pw_num=pw_num-1;}
  356.                                                 else          {Step=0;}
  357.                                                 
  358.                                                          
  359.                                                 // ShowString (0x00,"Pass Word:");  
  360.                     LcdWriteCom(0xc0);                                                
  361.                                                                                 for(j=0;j<pw_num;j++)
  362.                                                                                         {
  363.                                                                                                                 if(m==0) {LcdWriteData('*');        }                   //密码隐藏
  364.                                                                                                                 else     {LcdWriteData(INPUT_PW_Tab[j]+0x30);}    //显示密码        
  365.                                                                                    }
  366.                                                                                         LcdWriteData(' ');
  367.                                         }
  368.                 }
  369.         else                          //ok键按下
  370.           {
  371.                         if(pw_num==0)         
  372.                                         {
  373.                                                         Step=0;
  374.                                                   LcdWriteCom(0x01);
  375.                                                   ShowString (0x00,"Error 02!");
  376.                                                         delay(10000);
  377.                                         }
  378.                
  379.                         else{               
  380.                                                         Input_suc_flag=1;
  381.                                         }
  382.                                          //AS=0;                        
  383.                 }               
  384. }
  385. /*******************************************************
  386.                 密码比对
  387. ********************************************************/
  388. void CipherComparison()
  389. {
  390.         u8 i,j=0;

  391.         if(PassWord_Length==pw_num)                       //密码长度比对
  392.         {
  393.                 for(i=0;i<PassWord_Length;i++)                  //密码比对
  394.                 {
  395.                         
  396.                                 if(PASSWORD[i]!=INPUT_PW_Tab[i])
  397.                                         {
  398.                                                 result_flag=0;break;                     //密码错误
  399.                                         }
  400.                                 else
  401.                                         {
  402.                                                 result_flag=1;                          //密码正确
  403.                                         }
  404.                                           INPUT_PW_Tab[i]=0XFF;                   //清除密码缓存数组
  405.                 }
  406.         }
  407.         else
  408.         {result_flag=0;}
  409.         
  410. }
复制代码

所有资料51hei提供下载:
电子密码锁.zip (1.95 MB, 下载次数: 236)

评分

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

查看全部评分

回复

使用道具 举报

ID:581274 发表于 2019-7-11 10:49 | 显示全部楼层
非常棒
回复

使用道具 举报

ID:682365 发表于 2020-2-3 22:16 | 显示全部楼层
有错误 显示 main函数开头几行用处不大
回复

使用道具 举报

ID:688561 发表于 2020-2-4 20:29 | 显示全部楼层
非常的教程,太厉害了
回复

使用道具 举报

ID:197531 发表于 2020-2-19 10:21 | 显示全部楼层
你好,我使用你的程序下载到我的普中开发板上,其他功能都正常,但是就是输入密码后一直是显示ERROR 01,我想问下是不是你的按键扫描方式是不是和普中有所区别,才会出现的这种情况
回复

使用道具 举报

ID:711778 发表于 2020-3-19 18:15 | 显示全部楼层
全力 发表于 2020-2-19 10:21
你好,我使用你的程序下载到我的普中开发板上,其他功能都正常,但是就是输入密码后一直是显示ERROR 01,我想问 ...

我也是这样,您解决了么,我用的是a2单核的那个开发板
回复

使用道具 举报

ID:711778 发表于 2020-3-19 18:22 | 显示全部楼层
全力 发表于 2020-2-19 10:21
你好,我使用你的程序下载到我的普中开发板上,其他功能都正常,但是就是输入密码后一直是显示ERROR 01,我想问 ...

介意留个联系方式探讨一下嘛,他好像代码有问题,按键设定的是没问题的,他是0代替1,依次类推都小了1
回复

使用道具 举报

ID:711778 发表于 2020-3-19 18:24 | 显示全部楼层
同楼上,也是报错,c516和c52开发的板子应该通的吧
回复

使用道具 举报

ID:110278 发表于 2020-3-20 10:30 | 显示全部楼层
清楚明了。
回复

使用道具 举报

ID:727106 发表于 2020-4-13 18:20 | 显示全部楼层
MAIN.C(80) : error C267: " LcdWriteCom' : requires ANSI- style prototype 您好,请问我用您的程序做练习 出现第80行 的错误这是因为什么 可以帮我修改一下吗  非常感谢
回复

使用道具 举报

ID:735456 发表于 2020-5-22 10:52 | 显示全部楼层
12313156 发表于 2020-3-19 18:22
介意留个联系方式探讨一下嘛,他好像代码有问题,按键设定的是没问题的,他是0代替1,依次类推都小了1

请问有解决吗?
回复

使用道具 举报

ID:757105 发表于 2020-5-22 15:21 | 显示全部楼层
新手看不太懂
回复

使用道具 举报

ID:771824 发表于 2020-6-8 21:11 | 显示全部楼层
12313156 发表于 2020-3-19 18:22
介意留个联系方式探讨一下嘛,他好像代码有问题,按键设定的是没问题的,他是0代替1,依次类推都小了1

我也是初始输入密码有问题 我有点其他资料
不知道您现在是否解决了这个问题?
回复

使用道具 举报

ID:775010 发表于 2020-6-11 21:47 | 显示全部楼层
感谢大佬
回复

使用道具 举报

ID:757976 发表于 2020-6-12 07:15 来自手机 | 显示全部楼层
谢谢分享,下载来学习
回复

使用道具 举报

ID:235055 发表于 2020-7-29 21:32 | 显示全部楼层
现在正在学习液晶显示,刚好可以拿来学习
回复

使用道具 举报

ID:692835 发表于 2023-2-8 22:33 | 显示全部楼层
全力 发表于 2020-2-19 10:21
你好,我使用你的程序下载到我的普中开发板上,其他功能都正常,但是就是输入密码后一直是显示ERROR 01,我想问 ...

解决了吗?想具体探讨一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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