找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1983|回复: 0
收起左侧

单片机电子密码锁程序

[复制链接]
ID:152930 发表于 2016-12-7 16:17 | 显示全部楼层 |阅读模式
单片机电子密码锁
程序.rar (56.65 KB, 下载次数: 10)

主程序预览
  1. #include<reg52.h>
  2. #include"lcd1602.h"
  3. #include"4x4key.h"
  4. #include"24c02.h"
  5. #define uchar unsigned char

  6. sbit Beep=P2^5;                          //蜂鸣器端口
  7. sbit SUO=P2^6;                          //开锁端口
  8. uchar Kflag=0;                          //记录按键的次数
  9. uchar Buffer[6]={0};          //用来读出AT24C02中所存的数据(即所谓的密码)
  10. uchar ABuffer[6]={0};          //用来从键盘所输入的键值
  11. uchar ABCBuffer[6]={0};          //用来改密码时候,存储第一次新密码的数组,好与第二次输入的新密码做比较
  12. uchar keytmp;                          //用来读取按下的键值
  13. uchar j,m,n,counter,k,Sflag,Nflag;   //程序中用到的变量
  14. bit Aflag=0;                                                //用来第一次输入新密码后按下确认键后执行所对应的程序断的标记
  15. bit Qflag=0;                                                //用来第二次输入新密码后按下确认键后执行所对应的程序断的标记

  16. void beep()                //蜂鸣器响一定时间函数
  17. {
  18.   for (k=0;k<100;k++)
  19.    {
  20.    mDelay(100);
  21.    Beep=!Beep;       //BEEP取反
  22.    }
  23.    Beep=1;           //关闭蜂鸣器
  24.    mDelay(250);       //延时250毫秒     
  25. }

  26. void main()
  27. {
  28.   SUO=1;
  29.   LCD_Initial();
  30.   LCD_Print(1,0,"Input  SCode:");
  31.   while(1)                                                //按键扫描循环
  32.   {         
  33.     if(Key_Down()==1)                      // 如果有键按下
  34.         {        keytmp=Key_Code();                  //获取输入的键值
  35.                 if(keytmp>=0&&keytmp<=9)
  36.        {   while(Key_Down()==1) {;}          //在按键释放的时候(这句很关键。)
  37.                    Kflag++;
  38.            switch(Kflag)                          //密码显示字符选择语句
  39.                       {
  40.                             case 1:  LCD_Print(5,1,"*");     ABuffer[0]=keytmp;         break;
  41.                             case 2:  LCD_Print(5,1,"**");    ABuffer[1]=keytmp;                    break;
  42.                              case 3:  LCD_Print(5,1,"***");   ABuffer[2]=keytmp;                        break;
  43.                             case 4:         LCD_Print(5,1,"****");  ABuffer[3]=keytmp;                        break;
  44.                             case 5:         LCD_Print(5,1,"*****"); ABuffer[4]=keytmp;                    break;
  45.                             case 6:         LCD_Print(5,1,"******");ABuffer[5]=keytmp;                    break;
  46.                       }       
  47.                           
  48.                 }                               
  49.                 if(keytmp==14)                                                                                                                //确认键代码
  50.                  {
  51.                   if(Nflag!=1&&Nflag!=2)                                                                                        //判断密码输入是否正确复合语句和在
  52.                  {                                                                                                                                        //改密码是判断输入旧密码是否正确
  53.                   RdFromROM(Buffer,0,6);                                                                                        //读取AT24C02中的密码
  54.                   for(j=0;j<6;j++)
  55.                    {   
  56.                        mDelay(200);
  57.                        if(Buffer[j]!=ABuffer[j]) {LCD_ClrScreen();LCD_Print(1,1," Input Error!");counter++;break;}
  58.                            else if(j==5&&Sflag==0)   {LCD_ClrScreen();LCD_Print(1,0," Welecome!"); LCD_Print(1,1,"Open Door!");SUO=0;counter=0;}
  59.                            else if(j==5&&Sflag==1)         { mDelay(100);LCD_ClrScreen();LCD_Print(1,0," Input NewSecret");Nflag=1;Kflag=0;Aflag=1;}
  60.                    }
  61.                  }
  62.          if(Kflag==6&&Aflag==1)                                                                                //第一次输入新密码并存储在一个数组中
  63.                  {                                                                                                                        //以便第二次输入新密码与前一次比较是否
  64.                   for(m=0;m<6;m++)                                                                                        //两次输入的密码正确
  65.                    {
  66.                          ABCBuffer[m]=ABuffer[m];
  67.                    }
  68.                    mDelay(100);LCD_ClrScreen();LCD_Print(1,0," Input ANewSecret");Kflag=0;Aflag=0;Qflag=1;Nflag=2;
  69.                  }
  70.                  if(Kflag==6&&Qflag==1)                                                   //第二次新密码与第一次新密码比较复合语句
  71.                   {                                                                                           //如果正确则把新密码写入到AT24C02中。
  72.                   for(n=0;n<6;n++)                                                                                  
  73.                    {  mDelay(200);
  74.                          if(ABCBuffer[n]!=ABuffer[n]) {LCD_ClrScreen();LCD_Print(1,0," Input NError!");counter++;break;}
  75.                          else if(n==5) {WrToROM(ABCBuffer,0,6);mDelay(100);LCD_ClrScreen();LCD_Print(1,0," NCode SetSuccess");Kflag=0;counter=0;Qflag=0;break;}
  76.                         }
  77.                   }       
  78.                  //如果密码输入不正确,就重新输入,如果次数超过3次就报警(即蜂鸣器响)
  79.                  if(counter==1){mDelay(2000);LCD_ClrScreen();if(Qflag==1)LCD_Print(1,0," Input ANewSecret");else LCD_Print(1,0,"  Input Again:");Kflag=0;}
  80.                  if(counter==2){mDelay(2000);LCD_ClrScreen();if(Qflag==1)LCD_Print(1,0," Input ANewSecret");else LCD_Print(1,0,"  Input Again:");Kflag=0;}
  81.                  if(counter==3){mDelay(2000);LCD_ClrScreen();            LCD_Print(1,0,"  Input Too");LCD_Print(2,1,"Many Times!");beep();}
  82.              }
  83.                 if(keytmp==15)                                                                          //重设密码键代码同时使相应的标记复位
  84.                 {
  85.                  LCD_ClrScreen();LCD_Initial();LCD_Print(1,0," Input OldSecret");Nflag=0;Kflag=0;Sflag=1;

  86.                 }
  87.                 if(keytmp==11)                                                                        //清除前面字符键代码
  88.                 {         while(Key_Down()==1) {;}                                        //在按键释放的时候(这句很关键。)
  89.                      Kflag--;
  90.                      ABuffer[Kflag+1]=0;
  91.                          switch(Kflag)
  92.                       {
  93.                             case 0: mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input  SCode:");                                                                break;
  94.                             case 1: mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input  SCode:");  LCD_Print(5,1,"*");         break;
  95.                             case 2: mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input  SCode:");  LCD_Print(5,1,"**");               break;
  96.                              case 3: mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input  SCode:");  LCD_Print(5,1,"***");           break;
  97.                             case 4:        mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input  SCode:");  LCD_Print(5,1,"****");             break;
  98.                             case 5:        mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input  SCode:");  LCD_Print(5,1,"*****");     break;
  99.                             case 6:        mDelay(100);LCD_ClrScreen();if(Nflag==1)LCD_Print(1,0," Input NewSecret");else if(Nflag==2)LCD_Print(1,0," Input ANewSecret");else if(Sflag==1)LCD_Print(1,0," Input OldSecret");else LCD_Print(1,0," Input  SCode:");  LCD_Print(5,1,"******");    break;
  100.                       }       
  101.                 }
  102.         /*        if(keytmp==12)  {}                //可以新增加功能的键
  103.                 if(keytmp==13)  {}*/
  104.                 //返回键代码和全部标记复位
  105.                 if(keytmp==10)  {SUO=1;Kflag=0;Sflag=0;Nflag=0;counter=0;Aflag=0;Qflag=0;mDelay(200);LCD_ClrScreen();LCD_Print(1,0," Input  SCode:");} //返回键代码          
  106.    }                                  
  107.   }

  108. }
复制代码


评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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