找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1956|回復(fù): 0
收起左側(cè)

單片機(jī)電子密碼鎖程序

[復(fù)制鏈接]
ID:152930 發(fā)表于 2016-12-7 16:17 | 顯示全部樓層 |閱讀模式
單片機(jī)電子密碼鎖
程序.rar (56.65 KB, 下載次數(shù): 10)

主程序預(yù)覽
  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;                          //記錄按鍵的次數(shù)
  9. uchar Buffer[6]={0};          //用來讀出AT24C02中所存的數(shù)據(jù)(即所謂的密碼)
  10. uchar ABuffer[6]={0};          //用來從鍵盤所輸入的鍵值
  11. uchar ABCBuffer[6]={0};          //用來改密碼時(shí)候,存儲(chǔ)第一次新密碼的數(shù)組,好與第二次輸入的新密碼做比較
  12. uchar keytmp;                          //用來讀取按下的鍵值
  13. uchar j,m,n,counter,k,Sflag,Nflag;   //程序中用到的變量
  14. bit Aflag=0;                                                //用來第一次輸入新密碼后按下確認(rèn)鍵后執(zhí)行所對(duì)應(yīng)的程序斷的標(biāo)記
  15. bit Qflag=0;                                                //用來第二次輸入新密碼后按下確認(rèn)鍵后執(zhí)行所對(duì)應(yīng)的程序斷的標(biāo)記

  16. void beep()                //蜂鳴器響一定時(shí)間函數(shù)
  17. {
  18.   for (k=0;k<100;k++)
  19.    {
  20.    mDelay(100);
  21.    Beep=!Beep;       //BEEP取反
  22.    }
  23.    Beep=1;           //關(guān)閉蜂鳴器
  24.    mDelay(250);       //延時(shí)250毫秒     
  25. }

  26. void main()
  27. {
  28.   SUO=1;
  29.   LCD_Initial();
  30.   LCD_Print(1,0,"Input  SCode:");
  31.   while(1)                                                //按鍵掃描循環(huán)
  32.   {         
  33.     if(Key_Down()==1)                      // 如果有鍵按下
  34.         {        keytmp=Key_Code();                  //獲取輸入的鍵值
  35.                 if(keytmp>=0&&keytmp<=9)
  36.        {   while(Key_Down()==1) {;}          //在按鍵釋放的時(shí)候(這句很關(guān)鍵。)
  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)                                                                                                                //確認(rèn)鍵代碼
  50.                  {
  51.                   if(Nflag!=1&&Nflag!=2)                                                                                        //判斷密碼輸入是否正確復(fù)合語句和在
  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)                                                                                //第一次輸入新密碼并存儲(chǔ)在一個(gè)數(shù)組中
  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)                                                   //第二次新密碼與第一次新密碼比較復(fù)合語句
  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.                  //如果密碼輸入不正確,就重新輸入,如果次數(shù)超過3次就報(bào)警(即蜂鳴器響)
  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)                                                                          //重設(shè)密碼鍵代碼同時(shí)使相應(yīng)的標(biāo)記復(fù)位
  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) {;}                                        //在按鍵釋放的時(shí)候(這句很關(guān)鍵。)
  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.                 //返回鍵代碼和全部標(biāo)記復(fù)位
  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. }
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表