基于51單片機的多功能電子密碼鎖_第1頁
基于51單片機的多功能電子密碼鎖_第2頁
基于51單片機的多功能電子密碼鎖_第3頁
基于51單片機的多功能電子密碼鎖_第4頁
基于51單片機的多功能電子密碼鎖_第5頁
已閱讀5頁,還剩10頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 . . . #include <reg52.h>#define uint unsigned int#define uchar unsigned char#define KEY P3      /鍵盤輸入端口#define No_key 20    /無按鍵時的返回值#define lcddata P2   /1602的數據輸入端口sbit   lcden= P12;sbit   lcdrs= P10;sbit   lcdr

2、w= P11;sbit   light= P13;sbit   light1= P14;uchar j ; /用來統計輸入 個數的全局變量uchar aa; /用來在定時器中計數的 全局變量 uchar code table= " Hello!"uchar code table1=" OK!       " ;uchar code table2="Enter please:"   ;uchar code key_ta

3、ble16 =              1,2,3,10,    4,5,6,11,    7,8,9,12,    0,13,14,15      ;uchar password=2,0,1,0,9,3 ;   /設定初始密碼uchar save6;      &#

4、160;  /保存輸入的數據uchar conflag ;                   /確認標志uchar lockflag;      /鎖鍵盤標志uchar startflag;     /開始標志      void delay(uint z);

5、0;                       /延時子函數void wright_(uchar );               /寫指令函數void wright_data(uchar date) ;   

6、;   /寫數據函數void init();                          /初始化void display_OK();        / 顯示OKvoid delete();     &#

7、160;  /刪除輸入的最后一個數uchar keyscan() ;      /帶返回值的鍵盤掃描程序void enter_code(uchar t);       /輸入密碼函數,把輸入的數據存入數組中并在屏幕上顯示相應的東西,void   confirm();     /確認密碼對不對,把輸入的數據與密碼逐一對比,完全一樣剛正確,void   succeed_an();  

8、;  /輸入密碼成功時的 響應,void    fail_an();     /輸入密碼 失敗時 響應 void    lockkey();     /鎖鍵盤三秒void    alarm();    /發出警報聲void   reset();      /復位函數void   display_enter()

9、;    /顯示輸入void main(void)    uchar temp;   init();    while(1)              if(lockflag)           temp=keyscan();   / 鎖鍵期間也要進行鍵盤掃描

10、0;    if(temp!=No_key) /重新記時三秒                        aa=0;    /重新在定時器中計數                

11、    else               temp=keyscan();   /反復掃描輸入,等待隨時輸入                    if(temp!=No_key) /有按鍵按下才進行下面的操作   &

12、#160;              if(temp=10)                reset();         startflag=1; /開始標志置位        

13、0;      if(startflag)                        enter_code(temp);   /每掃描一次鍵盤就要進行一次處理,保存輸入的數值            

14、;      if(temp=13)   /按下確認鍵盤就要進行密碼確認                         confirm();    /進行確認判斷         

15、0;    if(conflag)       /密碼確認為正確                           succeed_an();    /密碼正確,作出相應的反應    &#

16、160;                   else                           fail_an();   /密碼錯誤,作相應反應 &

17、#160;                                          if(temp=14)        

18、;            delete();     /作刪除操作                                    &

19、#160;                       /* 顯示enter*/void   display_enter()    uchar num;   wright_(0x80);for(num=0;num<13;num+)      wright_data(tabl

20、e2num);   /* 顯示OK*/void display_OK()    uchar num;wright_(0x80);for(num=0;num<13;num+)             wright_data(table1num);   /* 刪除最后一個*/void delete()   wright_(0x80+0x40+j);   /確定刪除對象wrig

21、ht_data(' ');     /顯示空格即為刪除save-j=0;      /刪除后數據清零wright_(0x80+0x40+j);   /為下次輸入數據時寫好位置,必須是在最后一個后面/* 對各種變量進行復位*/void   reset()uchar num;display_enter();wright_(0x80+0x40);   /擦除屏幕上的顯示for(num=0;num<6;num+) 

22、0;    savenum=0;    /對輸入的數值進行清零   wright_data(' '); /顯示的是空格   wright_(0x80+0x40);   /下次再輸入時可以又從起始位置輸入lockflag=0;      /各種變量要清零回起始狀態conflag=0;j=0;/* 輸入密碼正確進行響應*/void succeed_an()   light=0;   /燈亮 di

23、splay_OK(); /顯示成功delay(1000);light=1;     /燈滅 /* 輸入密碼錯誤進行響應*/void    fail_an()   alarm();   lockkey();/* 發出警報聲*/void    alarm()   /這個以后再擴展它    /*鎖鍵盤三秒*/void    lockkey()   

24、60;  lockflag=1;/*輸入密碼并在屏幕上顯示星號*/void enter_code(uchar t)if(t>=0&&t<10)             if(j=0)             wright_(0x80+0x40) ;    /第一輸入時要先寫入地址指令,否則無法顯示   

25、;        wright_data('*') ;          else                        wright_data('*') ;/不是第一個輸入則不用再寫地址  

26、;             savej+=t;   /保存輸入的數據    /*校對密碼以確定是不是正確的*/void   confirm()uchar k;for(k=0;k<6;k+)      if(passwordk!=savek)    /對數組中的容進行逐一比較,一旦有數據不對馬上退出循環      

27、       break;        if(k=6)      /要是條件退出的話說明六個數全對密碼        conflag=1;   / 進行標志密碼正確       /*中斷服務程序*/void timer0() interrupt   1   

28、     TH0=(65536-50000)/256;TL0=(65536-50000)%256;    /重裝初值if(lockflag)        aa+;   light1=0;         if(aa>=60)    /三秒到了      aa=0;   /

29、清零可以方便下次再使用    light1=1; /關閉警報    lockflag=0; /標志清零解除鍵鎖,方便下次使用         /*初始化*/void init()    uchar num;   /*定時器初始化*/    TMOD=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;EA=1; /開啟總中斷TR0=1;

30、/把定時器關閉/*1602初始化*/lcdrw=0;     /這個必須要置 零,否則無常顯示   lcden=0;wright_(0x38) ; /初始化 wright_(0x0c) ; /打開光標    0x0c不顯示光標   0x0e光標不閃,0x0f光標閃wright_(0x01) ; /清顯示wright_(0x80) ;for(num=0;num<9;num+)      wright_data(tablenum); 

31、  delay(1);   /*1602寫入指令*/void wright_(uchar )   lcdrs=0;lcddata=;delay(1);lcden=1;delay(1);lcden=0;/*1602寫入數據*/void wright_data(uchar date)   lcdrs=1;lcddata=date;delay(1);lcden=1;delay(1);lcden=0;/*延時函數*/void delay(uint z)   uint x,y;   for(x=

32、z;x>0;x-)      for(y=110;y>0;y-) ;/*4x4矩陣鍵盤掃描函數*/uchar keyscan()           uchar temp,num=No_key; /num的初值要為無鍵盤按下時的返回值/*掃描第一行*/    KEY=0xfe;    temp=KEY;    temp=temp&0xf0

33、;   /讀出高四位    while(temp!=0xf0)                   delay(5);    /延時消抖      temp=KEY;      temp=temp&0xf0;   

34、0;  while(temp!=0xf0) /確認確實有按鍵按下                     temp=KEY;      switch(temp)     /根據這八個電平可以確定是哪個按鍵按下          &

35、#160;    case 0xee:num=1;         break;        case 0xde:num=2;         break;        case 0xbe:num=3;     &#

36、160;   break;        case 0x7e:num=10;         break;             while(temp!=0xf0)    /等待松手         

37、0;     temp=KEY;        temp=temp&0xf0;                           /*掃描第二行*/    KEY=0xfd;    temp

38、=KEY;    temp=temp&0xf0;    while(temp!=0xf0)           delay(5);      temp=KEY;      temp=temp&0xf0;      while(temp!=0xf0)   

39、                   temp=KEY;      switch(temp)               case 0xed:num=4;         brea

40、k;        case 0xdd:num=5;         break;        case 0xbd:num=6;         break;        case 0x7d:num=11; 

41、0;       break;             while(temp!=0xf0)               temp=KEY;        temp=temp&0xf0;   &

42、#160;                         /*掃描第三行*/    KEY=0xfb;    temp=KEY;    temp=temp&0xf0;    while(temp!=0xf0)      

43、     delay(5);      temp=KEY;      temp=temp&0xf0;      while(temp!=0xf0)             temp=KEY;      switch(temp) &#

44、160;             case 0xeb:num=7;         break;        case 0xdb:num=8 ;         break;       

45、 case 0xbb:num=9;         break;        case 0x7b:num=12;         break;             while(temp!=0xf0)               temp=KEY;        temp=temp&0xf0;                        

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論