找回密码
 立即注册

QQ登录

只需一步,快速开始

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

注释详细的51单片机的密码锁程序+Proteus仿真设计

[复制链接]
跳转到指定楼层
楼主
非常适合单片机新手,需要可来下载。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下(代码注释非常详细):
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char        // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int        // 以后unsigned int 就可以用uint 代


  5. sbit SDA_P   = P2^1;                                // 定义了AT24C02的SCL引脚
  6. sbit SCL_P   = P2^0;                                // 定义了AT24C02的SDA引脚
  7. sbit LcdEn_P = P2^5;                                // 1602液晶的EN管脚
  8. sbit LcdRw_P = P2^6;                                // 1602液晶的RW管脚
  9. sbit LcdRs_P = P2^7;                                // 1602液晶的RS管脚
  10. sbit Beep_P  = P3^3;                                // 蜂鸣器引脚
  11. sbit Relay_P = P3^2;                                // 继电器引脚

  12. uchar ArrCodeBuff[6];                                // 密码输入缓冲区
  13. uchar ArrCodeUnlock[6];                        // 解锁密码
  14. uchar ArrCodeTemp[6];                                // 临时数组(修改密码时会用到)
  15. uchar ArrCodeAdmin[6]={1,2,3,1,2,3};                // 管理员密码


  16. uchar row,column;                                        // 液晶的当前行列坐标
  17. uchar inputNum=0;                                        // 输入的密码位数
  18. uchar inputMode=1;                                // =1输入解锁密码,=2输入修改密码1,=3输入解锁密码2
  19. uchar errTime=0;                                        // 密码输入错误的次数


  20. /*********************************************************/
  21. // 毫秒级的延时函数,time是要延时的毫秒数
  22. /*********************************************************/
  23. void DelayMs(uint time)
  24. {
  25.         uint i,j;
  26.         for(i=0;i<time;i++)
  27.                 for(j=0;j<112;j++);
  28. }


  29. /*********************************************************/
  30. // 延时6微秒
  31. /*********************************************************/
  32. void Delay6us()
  33. {
  34.   _nop_();
  35.         _nop_();
  36.         _nop_();
  37.         _nop_();
  38.         _nop_();
  39.         _nop_();
  40. }


  41. /*********************************************************/
  42. // 1602液晶写命令函数,cmd就是要写入的命令
  43. /*********************************************************/
  44. void LcdWriteCmd(uchar cmd)
  45. {
  46.         LcdRs_P = 0;
  47.         LcdRw_P = 0;
  48.         LcdEn_P = 0;
  49.         P0=cmd;
  50.         DelayMs(2);
  51.         LcdEn_P = 1;   
  52.         DelayMs(2);
  53.         LcdEn_P = 0;        
  54. }


  55. /*********************************************************/
  56. // 1602液晶写数据函数,dat就是要写入的数据
  57. /*********************************************************/
  58. void LcdWriteData(uchar dat)
  59. {
  60.         LcdRs_P = 1;
  61.         LcdRw_P = 0;
  62.         LcdEn_P = 0;
  63.         P0=dat;
  64.         DelayMs(2);
  65.         LcdEn_P = 1;   
  66.         DelayMs(2);
  67.         LcdEn_P = 0;
  68. }


  69. /*********************************************************/
  70. // 1602液晶初始化函数
  71. /*********************************************************/
  72. void LcdInit()
  73. {
  74.         LcdWriteCmd(0x38);        // 16*2显示,5*7点阵,8位数据口
  75.         LcdWriteCmd(0x0C);        // 开显示,不显示光标
  76.         LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移
  77.         LcdWriteCmd(0x01);        // 清屏
  78. }


  79. /*********************************************************/
  80. // 液晶光标定位函数
  81. /*********************************************************/
  82. void LcdGotoXY(uchar y, uchar x)
  83. {
  84.         // 第一行
  85.         if(y==0)        
  86.                 LcdWriteCmd(0x80+x);
  87.         // 第二行
  88.         if(y==1)        
  89.                 LcdWriteCmd(0x80+0x40+x);
  90.         row=y;
  91.         column=x;
  92. }


  93. /*********************************************************/
  94. // 液晶输出字符串函数
  95. /*********************************************************/
  96. void LcdPrintStr(uchar *str)
  97. {
  98.         while(*str!='\0')
  99.                         LcdWriteData(*str++);
  100. }


  101. /*********************************************************/
  102. // IIC起始函数
  103. /*********************************************************/
  104. void IIcStart()
  105. {
  106.         SDA_P=1;         
  107.         Delay6us();
  108.         SCL_P=1;         
  109.         Delay6us();
  110.         SDA_P=0;         
  111.         Delay6us();
  112. }


  113. /*********************************************************/
  114. // IIC终止函数
  115. /*********************************************************/
  116. void IIcStop()
  117. {
  118.         SDA_P=0;         
  119.         Delay6us();
  120.         SCL_P=1;         
  121.         Delay6us();
  122.         SDA_P=1;         
  123.         Delay6us();
  124. }



  125. /*********************************************************/
  126. // IIC写一个字节
  127. /*********************************************************/
  128. void IIcWriteByte(uchar dat)
  129. {  
  130.         uchar i;

  131.         for(i=0;i<8;i++)
  132.         {
  133.                 dat=dat<<1;
  134.                 SCL_P=0;               
  135.                 Delay6us();
  136.                 SDA_P=CY;               
  137.                 Delay6us();
  138.                 SCL_P=1;                 
  139.                 Delay6us();
  140.         }
  141.         SCL_P=0;                        
  142.         Delay6us();
  143.         SDA_P=1;                        
  144.         Delay6us();
  145. }


  146. /*********************************************************/
  147. // IIC读一个字节
  148. /*********************************************************/
  149. uchar IIcReadByte()
  150. {
  151.         uchar i,temp,dat=0;
  152.         
  153.         SCL_P=0;                 
  154.         Delay6us();
  155.         SDA_P=1;               
  156.         Delay6us();
  157.         
  158.         for (i=0;i<8;i++)
  159.         {  
  160.                 SCL_P=1;                        
  161.                 Delay6us();
  162.                 temp=SDA_P;               
  163.                 Delay6us();
  164.                 dat=(dat<<1)|temp;
  165.           SCL_P=0;                        
  166.                 Delay6us();
  167.         }
  168.         return(dat);
  169. }



  170. /*********************************************************/
  171. // IIC总线响应
  172. /*********************************************************/
  173. void IIcRespons()
  174. {
  175.         uchar i=0;
  176.         
  177.         SCL_P=1;
  178.         Delay6us();
  179.         
  180.         while((SDA_P==1)&&(i<250))         
  181.         {
  182.                 i++;
  183.         }
  184.         SCL_P=0;
  185.         Delay6us();
  186. }



  187. /*********************************************************/
  188. // IIC读出数据
  189. /*********************************************************/
  190. uchar IIcReadDat(uchar addr)
  191. {
  192.         uchar dat;

  193.         IIcStart();                                                // 开始信号
  194.         IIcWriteByte(0xa0);                // 写芯片地址(写)
  195.         IIcRespons();                                        // 等待应答
  196.         IIcWriteByte(addr);                // 写内存地址(0-255)
  197.         IIcRespons();                                        // 等待应答  

  198.         IIcStart();                                                // 开始信号
  199.         IIcWriteByte(0xa1);         // 写芯片地址(读)
  200.         IIcRespons();                                        // 等待应答  
  201.         dat=IIcReadByte();                // 读取一个字节数据
  202.         IIcRespons();                                        // 等待应答  
  203.         IIcStop();                                                // 结束信号
  204.         
  205.         DelayMs(2);                                                // 简短延时
  206.         return dat;                                                // 返回读取到的数据
  207. }


  208. /*********************************************************/
  209. // IIC写入数据
  210. /*********************************************************/
  211. void IIcWriteDat(uchar addr,uchar dat)
  212. {
  213.    IIcStart();                                                 // 开始信号
  214.    IIcWriteByte(0xa0);                // 写芯片地址(写)
  215.    IIcRespons();                                         // 等待应答
  216.    IIcWriteByte(addr);                // 写内存地址(0-255)
  217.    IIcRespons();                                         // 等待应答
  218.    IIcWriteByte(dat);                        // 写入数据
  219.    IIcRespons();                                         // 等待应答
  220.    IIcStop();                                                        // 结束信号
  221.    DelayMs(2);                                                // 简短延时
  222. }



  223. /**********************************************************
  224. 矩阵键盘扫描程序.
  225. -----------------
  226. 如果扫描到有按键按下,则返回按键值,返回值情况如下所示:
  227.   ----------------------------------
  228.   |                    第1列  第2列 第3列 第4列 |
  229.   |第1行    1             2                 3          12         |
  230.   |第2行    4      5     6    13         |
  231.   |第3行    7      8     9    14   |
  232.   |第4行   10      0    11    15   |
  233.    --------------------------------
  234. 如果扫描不到有按键按下,则返回99
  235. **********************************************************/
  236. uchar KeyScanf()
  237. {
  238.         uchar ret,temp1,temp2;
  239.         
  240.         P1=0x0f;
  241.         if(P1!=0x0f)
  242.         {
  243.                 DelayMs(15);
  244.                 if(P1!=0x0f)
  245.                 {
  246.                         temp1=P1;                                                // 判断出是哪一行按键按下
  247.                         P1=0xf0;
  248.                         DelayMs(5);
  249.                         temp2=P1;                                                // 判断出是哪一列按键被按下
  250.                         ret=temp1|temp2;                // 通过行和列的值,确定是哪个按键被按下
  251.                         switch(ret)
  252.                         {
  253.                                 case 0xe7:        return 1;
  254.                                 case 0xd7:        return 2;
  255.                                 case 0xb7:        return 3;
  256.                                 case 0x77:        return 12;
  257.                                 
  258.                                 case 0xeb:        return 4;
  259.                                 case 0xdb:        return 5;
  260.                                 case 0xbb:        return 6;
  261.                                 case 0x7b:        return 13;
  262.                                 
  263.                                 case 0xed:        return 7;
  264.                                 case 0xdd:        return 8;
  265.                                 case 0xbd:        return 9;
  266.                                 case 0x7d:        return 14;
  267.                                 
  268.                                 case 0xee:        return 10;
  269.                                 case 0xde:        return 0;
  270.                                 case 0xbe:        return 11;
  271.                                 case 0x7e:        return 15;
  272.                         }
  273.                         return ret;
  274.                 }
  275.         }
  276.         return 99;
  277. }


  278. /*********************************************************/
  279. // 液晶显示密码
  280. /*********************************************************/
  281. void LcdPrintCode(uchar num)
  282. {
  283.         LcdGotoXY(row,column);                        // 液晶显示定位
  284.         LcdWriteData(num+0x30);                        // 显示输入的密码
  285.         DelayMs(150);                                                                // 等待150毫秒
  286.         LcdGotoXY(row,column);                        // 重新回到刚刚的显示位置
  287.         LcdWriteData('*');                                        // 显示“*”替换刚刚显示的数字
  288.         column++;                                                                                // 液晶显示光标的纵坐标加1
  289. }


  290. /*********************************************************/
  291. // 蜂鸣器鸣叫
  292. /*********************************************************/
  293. void MingJiao(uint time)
  294. {
  295.         Beep_P=0;                                                // 蜂鸣器开始鸣叫
  296.         DelayMs(time);                        // 延时
  297.         Beep_P=1;                                                // 蜂鸣器停止鸣叫
  298. }


  299. /*********************************************************/
  300. // 清除密码输入缓冲区的内容
  301. /*********************************************************/
  302. void ClearCodeBuff()
  303. {
  304.         uchar i;
  305.         for(i=0;i<6;i++)                                                                                // 循环执行6次
  306.         {
  307.                 ArrCodeBuff[i]=' ';                                                                // 每次清除一位密码缓冲区
  308.         }
  309.         inputNum=0;                                                                                                        // 输入的密码位数为0
  310. }


  311. /*********************************************************/
  312. // 密码输入初始化
  313. /*********************************************************/
  314. void inputInit()
  315. {
  316.         LcdGotoXY(0,0);                                                                                        // 光标定位        
  317.         LcdPrintStr("   State:lock   ");                // 液晶第0行显示"   State:lock   "
  318.         LcdGotoXY(1,0);                                                                                        // 光标定位        
  319.         LcdPrintStr("Password:       ");
  320.         LcdGotoXY(1,9);                                                                                        // 液晶第1行显示"Password:       "
  321.         ClearCodeBuff();                                                                                // 清除密码缓冲区
  322. }


  323. /*********************************************************/
  324. // 密码初始化
  325. /*********************************************************/
  326. void CodeInit()
  327. {
  328.         uchar dat,i;
  329.         dat=IIcReadDat(10);
  330.         if(dat!=88)                                                                                // 如果是第一次使用AT24C02芯片
  331.         {
  332.                 IIcWriteDat(0,1);                                                // 给AT24C02第0个内存写入第一个密码“1”
  333.                 IIcWriteDat(1,2);                                                // 给AT24C02第1个内存写入第二个密码“2”
  334.                 IIcWriteDat(2,3);                                                // 给AT24C02第2个内存写入第三个密码“3”
  335.                 IIcWriteDat(3,4);                                                // 给AT24C02第3个内存写入第四个密码“4”
  336.                 IIcWriteDat(4,5);                                                // 给AT24C02第4个内存写入第五个密码“5”
  337.                 IIcWriteDat(5,6);                                                // 给AT24C02第5个内存写入第六个密码“6”
  338.                 IIcWriteDat(10,88);                                        // 给AT24C02第10个内存写入数字“88”,代表密码初始化好了
  339.         }
  340.         for(i=0;i<6;i++)                                                        // 从AT24C02读取6个密码,赋值给密码数组ArrCode
  341.         {
  342.                 ArrCodeUnlock[i]=IIcReadDat(i);
  343.         }
  344. }



  345. /*********************************************************/
  346. // 主函数,程序从这里开始执行
  347. /*********************************************************/        
  348. void main()
  349. {  
  350.         uchar i;                                                                        // 临时变量
  351.         uchar keyVal;                                                        // 按键扫描的返回值
  352.         
  353.         uchar ArrCodeTemp[6];                        // 临时数组
  354.         
  355.         LcdInit();                                                                // 液晶初始化
  356.         inputInit();                                                        // 密码输入初始化
  357.         CodeInit();                                                                // 密码初始化
  358.         
  359.         while(1)
  360.         {
  361.                
  362.                 if(inputNum==6)                                        // 如果输入了6位密码了
  363.                         LcdWriteCmd(0x0c);                // 关闭光标闪烁
  364.                 else                                                                                // 如果输入不够6位密码
  365.                         LcdWriteCmd(0x0f);                // 开启光标闪烁
  366.                
  367.                
  368.                 keyVal=KeyScanf();                        // 扫描按键是否有按键
  369.                 if(keyVal!=99)                                        // 如果有按键被按下了
  370.                 {
  371.                         MingJiao(50);                                        // 那么蜂鸣器鸣叫50毫秒
  372.                 }
  373.                
  374.                
  375.                 /* 0-9 数字 */
  376.                 if(keyVal<10)                                                                                                        // 如果数字键被按下
  377.                 {
  378.                         if(inputNum<6)                                                                                        // 如果输入的密码不到6位
  379.                         {
  380.                                 ArrCodeBuff[inputNum]=keyVal;                        // 给ArrCodeBuff缓冲区加入一个新的密码记录
  381.                                 inputNum++;                                                                                                // inputNum加1,代表当前的密码输入多了一位
  382.                                 LcdPrintCode(keyVal);                                                        // 将输入的密码显示出来
  383.                         }
  384.                         while(KeyScanf()!=99);                                                        // 等待按键释放
  385.                 }
  386.                
  387.                
  388.                 /* 删除一个密码 */
  389.                 if(keyVal==10)                                                                                                // 如果删除键被按下
  390.                 {
  391.                         if(inputNum>0)                                                                                        // 如果当前已经有输入密码了
  392.                         {
  393.                                 column--;                                                                                                        // 光标退回上一个位置
  394.                                 LcdGotoXY(row,column);
  395.                                 LcdWriteData(' ');                                                                // 显示空格
  396.                                 LcdGotoXY(row,column);                                                // 光标退回上一个位置
  397.                                 inputNum--;                                                                                                // inputNum减1,代表当前的密码删掉了一位
  398.                                 ArrCodeBuff[inputNum]=' ';                                // 清除一位密码缓冲区
  399.                         }
  400.                         while(KeyScanf()!=99);                                                        // 等待按键释放
  401.                 }
  402.                
  403.                
  404.                 /* 清除全部密码 */
  405.                 if(keyVal==11)                                                                                                // 如果取消键被按下
  406.                 {
  407.                         ClearCodeBuff();                                                                                // 清除密码缓冲区
  408.                         
  409.                         if(inputMode==1)                                                                                // 如果当前正在输入解锁密码
  410.                         {
  411.                                 LcdGotoXY(1,0);                                                                                // 光标定位                                                                                
  412.                                 LcdPrintStr("Password:       ");        // 液晶第1行显示“Password:       ”
  413.                                 LcdGotoXY(1,9);                                                                                // 光标定位        
  414.                         }
  415.                         
  416.                         if(inputMode==2)                                                                                // 如果当前正在输入修改密码1
  417.                         {
  418.                                 LcdGotoXY(0,0);                                                                                // 光标定位        
  419.                                 LcdPrintStr(" input1:        ");        // 液晶第0行显示“input1:        ”
  420.                                 LcdGotoXY(0,8);                                                                                // 光标定位        
  421.                         }
  422.                         
  423.                         if(inputMode==3)                                                                                // 如果当前正在输入修改密码2
  424.                         {
  425.                                 LcdGotoXY(1,0);                                                                                // 光标定位        
  426.                                 LcdPrintStr(" input2:        ");        // 液晶第1行显示“input1:        ”
  427.                                 LcdGotoXY(1,8);                                                                                // 光标定位        
  428.                         }

  429.                         while(KeyScanf()!=99);                                                        // 等待按键释放
  430.                 }
  431.                
  432.                
  433.                 /* 手动关锁 */
  434.                 if(keyVal==12)
  435.                 {
  436.                         while(KeyScanf()!=99);                                                        // 等待按键释放                                       
  437.                 }
  438.                
  439.                 /* 取消密码修改 */
  440.                 if(keyVal==13)                                                                                                // 如果修改密码按键被按下
  441.                 {
  442.                         if((inputMode==2)||(inputMode==3))        // 如果当前正在输入修改密码
  443.                         {
  444.                                 inputInit();                                                                                        // 输入初始化(退出修改)
  445.                                 Relay_P=1;                                                                                                // 继电器闭合
  446.                                 inputMode=1;                                                                                        // 改为输入解锁密码模式
  447.                         }
  448.                         while(KeyScanf()!=99);
  449.                 }
  450.                
  451.                
  452.                 /* 管理员密码 */               
  453.                 if(keyVal==14)
  454.                 {
  455.                         for(i=0;i<6;i++)
  456.                         {
  457.                                 if(ArrCodeBuff[i]!=ArrCodeAdmin[i])
  458.                                         break;
  459.                         }
  460.                         if(i<6)
  461.                         {
  462.                                 LcdGotoXY(1,0);
  463.                                 LcdPrintStr("     ERROR      ");
  464.                                 MingJiao(5000);        
  465.                         }
  466.                         else
  467.                         {
  468.                                 LcdGotoXY(1,0);
  469.                                 LcdPrintStr("Password Init OK");
  470.                                 MingJiao(3000);
  471.                                 IIcWriteDat(10,' ');
  472.                                 CodeInit();
  473.                         }
  474.                         inputInit();
  475.                 }

  476.                
  477.                 /* 确认按键 */
  478.                 if(keyVal==15)                                                                                                // 如果确定键被按下
  479.                 {
  480.                         /*解锁密码*/
  481.                         if(inputMode==1)                                                                                // 如果当前正在输入解锁密码
  482.                         {
  483.                                 for(i=0;i<6;i++)                                                                        // 把密码缓冲区的内容和解锁密码进行6次比较
  484.                                 {
  485.                                         if(ArrCodeBuff[i]!=ArrCodeUnlock[i])
  486.                                                 break;
  487.                                 }
  488.                
  489.                                 if(i<6)                                                                                                                                // 如果密码错误
  490.                                 {
  491.                                         errTime++;                                                                                             // 错误次数加1
  492.                                         LcdGotoXY(1,0);                                                                                        // 光标定位
  493.                                         LcdPrintStr("    ERROR       ");                // 第1行显示"    ERROR       "
  494.                                         LcdGotoXY(1,11);                                                                                // 光标定位
  495.                                         LcdWriteData(errTime+0x30);                                        // 显示错误的次数
  496.                                         LcdWriteCmd(0x0c);                                                                        // 关闭光标闪烁
  497.                                         MingJiao(3000);                                                                                        // 蜂鸣器鸣叫3秒

  498.                                         if(errTime==3)                                                                                        // 如果错误了3次
  499.                                         {
  500.                                                 LcdGotoXY(1,0);                                                                                // 光标定位
  501.                                                 LcdPrintStr("Password:lock   ");        // 第1行显示"Password:locd   "
  502.                                                 errTime=0;                                                                                                // 密码错误次数清零
  503.                                                 DelayMs(60000);                                                                                // 延时60秒
  504.                                         }
  505.                                 }
  506.                                 else                                                                                                                                        // 如果密码正确
  507.                                 {
  508.                                         errTime=0;                                                                                                        // 密码错误次数清零
  509.                                         Relay_P=0;                                                                                                        // 打开继电器
  510.                                         LcdGotoXY(0,0);                                                                                        // 光标定位
  511.                                         LcdPrintStr("   State:open   ");                // 第0行显示"   State:open   "
  512.                                         LcdGotoXY(1,0);                                                                                        // 光标定位
  513.                                         LcdPrintStr("                ");                // 第1行显示"                "
  514.                                        
  515.                                         for(i=0;i<100;i++)                                                                        // 进行10秒等待,执行100次循环
  516.                                         {
  517.                                                 keyVal=KeyScanf();                                                                // 扫描按键
  518.                                                 DelayMs(100);                                                                                        // 等待100毫秒
  519.                                                 
  520.                                                 if(keyVal==12)                                                                                // 如果手动关锁按键被按下
  521.                                                         break;                                                                                                        // 退出for循环,结束开始等待
  522.                                                 
  523.                                                 if(keyVal==13)                                                                                                                // 如果按下修改密码键
  524.                                                 {
  525.                                                         LcdGotoXY(0,0);                                                                                                        // 光标定位
  526.                                                         LcdPrintStr(" input1:        ");                                // 第0行显示" input1:        "
  527.                                                         LcdGotoXY(1,0);                                                                                                        // 光标定位
  528.                                                         LcdPrintStr(" input2:        ");                                // 第1行显示" input2:        "
  529.                                                         LcdGotoXY(0,8);                                                                                                        // 光标定位
  530.                                                         inputMode=2;                                                                                                                // 切换密码输入模式
  531.                                                         ClearCodeBuff();                                                                                                // 清除密码缓冲区
  532.                                                         while(KeyScanf()!=99);                                                                        // 等待按键释放
  533.                                                         break;                                                                                                                                        // 退出for循环,进入密码修改
  534.                                                 }
  535.                                         }
  536.                                 }
  537.                                 
  538.                                 if(inputMode==1)                                                                                        // 如果当前处于输入解锁密码状态
  539.                                 {
  540.                                         Relay_P=1;                                                                                                        // 闭合继电器
  541.                                         inputInit();                                                                                                // 密码输入初始化
  542.                                 }
  543.                         }
  544.                         
  545.                         /*修改密码1*/
  546.                         else if(inputMode==2)                                                                                // 如果当前正在输入修改密码1                                       
  547.                         {
  548.                                 for(i=0;i<6;i++)                                                                                        // 将输入的密码暂时存入ArrCodeTemp数组
  549.                                 {
  550.                                         ArrCodeTemp[i]=ArrCodeBuff[i];
  551.                                 }
  552.                                 LcdGotoXY(1,8);                                                                                                // 光标定位
  553.                                 inputMode=3;                                                                                                        // 改为输入 修改密码2                                       
  554.                                 ClearCodeBuff();                                                                                        // 清除密码缓冲区
  555.                                 while(KeyScanf()!=99);                                                                // 等待按键释放
  556.                         }
  557.                         
  558.                         /*修改密码2*/                        
  559.                         else
  560.                         {
  561.                                 for(i=0;i<6;i++)                                                                                        // 将2次输入的密码进行比较
  562.                                 {
  563.                                         if(ArrCodeBuff[i]!=ArrCodeTemp[i])
  564.                                                 break;
  565.                                 }
  566.                                 
  567.                                 if(i<6)                                                                                                                                // 密码修改错误
  568.                                 {
  569.                                         LcdGotoXY(0,0);                                                                                        // 光标定位
  570.                                         LcdPrintStr("Password Modify ");                // 第0行显示"Password Modify "
  571.                                         LcdGotoXY(1,0);                                                                                        // 光标定位
  572.                                         LcdPrintStr("-----failed-----");                // 第1行显示"-----failed-----"
  573.                                         MingJiao(3000);                                                                                        // 蜂鸣器鸣叫3秒
  574.                                 }
  575.                                 else                                                                                                                                        // 密码修改成功
  576.                                 {
  577.                                         LcdGotoXY(0,0);                                                                                        // 光标定位
  578.                                         LcdPrintStr("Password Modify ");                // 第0行显示"Password Modify "
  579.                                         LcdGotoXY(1,0);                                                                                        // 光标定位
  580.                                         LcdPrintStr("---Successful---");                // 第1行显示"---Successful---"
  581.                                         MingJiao(2000);                                                                                        // 蜂鸣器鸣叫2秒
  582.                                         for(i=0;i<6;i++)
  583.                                         {
  584.                                                 IIcWriteDat(i,ArrCodeTemp[i]);                // 将新的密码存入EEPROM芯片
  585.                                                 ArrCodeUnlock[i]=ArrCodeTemp[i];        // 将新的密码存入解锁密码数组
  586.                                         }
  587.                                 }
  588.                                 Relay_P=1;                                                                        // 继电器闭合
  589.                                 inputMode=1;                                                                // 改为输入解锁密码模式
  590.                                 for(i=0;i<6;i++)                                                // 清空修改密码缓冲区
  591.                                 {
  592.                                         ArrCodeTemp[i]=' ';
  593.                                 }
  594.                                 inputInit();                                                                // 输入初始化
  595.                                 while(KeyScanf()!=99);                        // 等待按键释放
  596.                         }
  597.                 }
  598.         }
  599. }


  600.                                        
复制代码

所有资料51hei提供下载:
07、单片机程序(先解压,后查看).rar (294.84 KB, 下载次数: 92)
08、电路图(原理图和PCB图).rar (317.92 KB, 下载次数: 57)
09、仿真图.rar (896.85 KB, 下载次数: 98)


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

使用道具 举报

沙发
ID:89286 发表于 2019-6-29 20:55 | 只看该作者
thanks for sharing
回复

使用道具 举报

板凳
ID:581274 发表于 2019-7-11 10:18 | 只看该作者
我真是感动死 了
回复

使用道具 举报

地板
ID:888822 发表于 2021-4-30 10:17 来自手机 | 只看该作者
问一下里面的管理员密码是做什么用的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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