基于51單片機的電子鎖_第1頁
基于51單片機的電子鎖_第2頁
基于51單片機的電子鎖_第3頁
基于51單片機的電子鎖_第4頁
基于51單片機的電子鎖_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、#include<reg52.h>#define uchar unsigned char #define uint unsigned int sbit lcden=P12;sbit lcdrs=P10;sbit lcdrw=P11;sbit p17=P17; /開門指示:指示燈和蜂鳴器uchar table18='N','A','M','E',':' /定義數(shù)碼管的第一行"name: "uchar table28='C','O','D'

2、,'E',':' /定義數(shù)碼管的第二行"lode: "uchar name10='0','1','2','3' uchar cod20='0','0','0','0','1','1','1','1','2','2','2','2','3','3','3

3、','3' /定義四個用戶,并設(shè)置對應(yīng)的用戶和密碼, /其中用戶0定義為超級用戶0,用戶1、用戶2和用戶3為普通用戶uint in_name; /保存輸入的用戶名uint error_num; /輸入密碼錯誤的次數(shù)uchar in_code14; /保存第一次輸入的密碼uchar in_code24; /保存第二次輸入的密碼uchar code sup11='S','U','P','E','R',' ','U','S','E',

4、'R','!' /輸入用戶為超級用戶uchar code nor12='N','O','R','M','A','L',' ','U','S','E','R','!' /輸入用戶為普通用戶uchar code err6='E','R','R','O','R','!' /輸入用戶名或

5、密碼錯誤uchar wait8='W','A','I','T','I','N','G','!' /等待uchar aga11='I','N','P','U','T',' ','A','G','A','I','N' /再次輸入密碼uchar ame9='A','M'

6、,'E','N','D','I','N','G','!' /正在修改密碼uchar fun6='a','b','c','d','e','f' /ABCDEF功能鍵 /=延時函數(shù)=/void delay(uint x) uint a,b; for(a=x;a>0;a-) for(b=110;b>0;b-);/=1602寫指令=/void write_com(uchar com)

7、lcdrs=0; P0=com; delay(10); lcden=1; delay(10); lcden=0;/=1602寫數(shù)據(jù)=/void write_data(uchar dat) lcdrs=1; P0=dat; delay(10); lcden=1; delay(10); lcden=0;/=1602在指定的位置顯示一個字符=/void disp_char(uchar x,uchar y,uchar dat) uint i; uchar addr; if(y=1) addr=0x80+x; else addr=0xc0+x; write_com(addr); for(i=0;i<

8、;2;i+); write_data(dat); for(i=0;i<2;i+);/=1602數(shù)碼管初始化函數(shù)=/void display() lcden=0; lcdrw=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80);/=4*4鍵盤掃描函數(shù)=/uint keyscan() uchar temp; uint key=16; /key=16表示沒有按下任何鍵 P2=0xfe; /第一行被置為低電平,開始掃描第一行 temp=P2; temp=temp&0x

9、f0; if(temp!=0xf0) delay(1); temp=P2; temp=temp&0xf0; if(temp!=0xf0) temp=P2; switch(temp) case(0xee): key=0; break; case(0xde): key=1; break; case(0xbe): key=2; break; case(0x7e): key=3; break; while(temp!=0xf0) /等待按鍵釋放 temp=P2; temp=temp&0xf0; / P2=0xfd; /第二行被置為低電平,開始掃描第二行 temp=P2; temp=te

10、mp&0xf0; if(temp!=0xf0) delay(1); temp=P2; temp=temp&0xf0; if(temp!=0xf0) temp=P2; switch(temp) case(0xed): key=4; break; case(0xdd): key=5; break; case(0xbd): key=6; break; case(0x7d): key=7; break; while(temp!=0xf0) /等待按鍵釋放 temp=P2; temp=temp&0xf0; / P2=0xfb; /第三行被置為低電平,開始掃描第三行 temp=P2

11、; temp=temp&0xf0; if(temp!=0xf0) delay(1); temp=P2; temp=temp&0xf0; if(temp!=0xf0) temp=P2; switch(temp) case(0xeb): key=8; break; case(0xdb): key=9; break; case(0xbb): key=10; break; case(0x7b): key=11; break; while(temp!=0xf0) /等待按鍵釋放 temp=P2; temp=temp&0xf0; / P2=0xf7; /第四行被置為低電平,開始掃描

12、第四行 temp=P2; temp=temp&0xf0; if(temp!=0xf0) delay(1); temp=P2; temp=temp&0xf0; if(temp!=0xf0) temp=P2; switch(temp) case(0xe7): key=12; break; case(0xd7): key=13; break; case(0xb7): key=14; break; case(0x77): key=15; break; while(temp!=0xf0) /等待按鍵釋放 temp=P2; temp=temp&0xf0; return(key);

13、/*/-B鍵的功能,刪除用戶-/void delete_user() ;/-D鍵的功能,添加用戶-/void add_user(); */-E鍵的功能,修改密碼-/void amend_code() uint i,j,k=16; display();for(i=0;i<5;i+) disp_char(i,1,table1i); /第一行顯示NAME:及對應(yīng)的用戶名disp_char(5,1,namein_name); for(i=0;i<5;i+) disp_char(i,2,table2i); /第二行顯示CODE:AMENDING!for(i=0;i<9;i+) disp

14、_char(i+5,2,amei); for(j=0;j<4;j+) k=keyscan();while(k=16) k=keyscan();codin_name*4+i=funk-10; /=F鍵的功能,開門,蜂鳴器間斷響=/void open_door() uint i,j; for(i=0;i<6;i+) for(j=0;j<10000;j+) if(j/5000)%2=0) p17=1; else p17=0; p17=0;/=超級用戶相關(guān)操作=/void super_user() uint k=16; uint flag=0; while(flag=0) k=key

15、scan(); while(!(k=10|k=11|k=13|k=14|k=15) /當(dāng)A、B、D、E、F均未被按下時,繼續(xù)掃描 k=keyscan(); if(k=10) / 當(dāng)A鍵被按下時,返回 flag=1; if(k=11) / 當(dāng)B鍵被按下時,刪除用戶 flag=1;/ delete_user(); if(k=13) / 當(dāng)D鍵被按下時,添加用戶 flag=1;/ add_user(); if(k=14) / 當(dāng)E鍵被按下時,修改密碼 flag=1; amend_code(); if(k=15) / 當(dāng)F鍵被按下時,開門 flag=1; open_door(); delay(6000

16、); /=普通用戶相關(guān)操作:改密、開門=/void normal_user() uint k=16; uint flag=0; while(flag=0) k=keyscan(); while(!(k=14|k=15) /當(dāng)沒有按下E、F鍵時,繼續(xù)掃描 k=keyscan(); if(k=14); /對應(yīng)于E鍵 flag=1; /普通用戶完成一項操作 amend_code(); /修改當(dāng)前用戶的密碼 if(k=15) flag=1; /普通用戶完成一項操作 open_door(); /F鍵的功能,開門 delay(6000);/=第二次輸入密碼函數(shù)=/ void input_code2() u

17、int i,j,flag2=0; uint k2=16; error_num=0; while(flag2=0&&error_num<3) for(i=0;i<4;i+) /輸入4位數(shù)密碼,保存在in_code2中 k2=keyscan(); while(k2=16) k2=keyscan(); in_code2i=funk2-10; display(); for(j=0;j<5;j+) disp_char(j,1,table1j); /第一行顯示NAME:及對應(yīng)的用戶名 disp_char(5,1,namein_name); for(j=0;j<5;j

18、+) disp_char(j,2,table2j); /第二行先后顯示CODE:*,CODE:*,CODE:*,CODE:* for(j=0;j<i+1;j+) disp_char(5+j,2,'*'); delay(10); delay(10);/-檢驗輸入的密碼是否與第一次輸入的密碼一致-/ if(in_code20=in_code10&&in_code21=in_code11&&in_code22=in_code12&&in_code23=in_code13) flag2=1; /輸入密碼正確,退出while循環(huán) p1

19、7=1;/指示燈亮,蜂鳴器響,表示密碼正確 delay(400); p17=0; else flag2=0; /輸入密碼錯誤重新輸入 error_num+; display(); for(j=0;j<5;j+) /第一行顯示NAME:及對應(yīng)的用戶名 disp_char(j,1,table1j); disp_char(5,1,namein_name); for(j=0;j<5;j+) /第二行顯示CODE:ERROR!2 disp_char(j,2,table2j); for(j=0;j<6;j+) disp_char(j+5,2,errj); disp_char(11,2,&

20、#39;2'); delay(10); /=第一次輸入密碼函數(shù)=/ void input_code1() uint i,j,n,flag1=0,k1=16; error_num=0; while(flag1=0&&error_num<3) for(i=0;i<4;i+) /輸入4位數(shù)密碼,保存在in_code1中 k1=16; k1=keyscan(); while(k1=16) k1=keyscan(); in_code1i=funk1-10; display(); for(j=0;j<5;j+) disp_char(j,1,table1j); /第

21、一行顯示NAME:及對應(yīng)的用戶名 disp_char(5,1,namein_name); for(j=0;j<5;j+) disp_char(j,2,table2j); /第二行先后顯示CODE:*,CODE:*,CODE:*,CODE:* for(n=0;n<i+1;n+) disp_char(5+n,2,'*'); delay(10); delay(600); /-檢驗輸入的密碼是否正確-/ if(in_code10=codin_name*4+0&&in_code11=codin_name*4+1&&in_code12=codin

22、_name*4+2&&in_code13=codin_name*4+3) flag1=1; /輸入密碼正確,退出wlile循環(huán),等待第二次輸入密碼 display(); for(j=0;j<5;j+) disp_char(j,1,table1j); /第一行顯示NAME:及對應(yīng)的用戶名 disp_char(5,1,namein_name); for(j=0;j<5;j+) disp_char(j,2,table2j); /第二行顯示CODE:INPUT AGAIN for(j=0;j<11;j+) disp_char(j+5,2,agaj); /INPUT A

23、GAIN delay(10); p17=0; /指示燈亮,蜂鳴器響,表示密碼正確 delay(400); p17=1; else flag1=0; /輸入密碼錯誤重新輸入 error_num+; display(); for(j=0;j<5;j+) /第一行顯示NAME:及對應(yīng)的用戶名 disp_char(j,1,table1j); disp_char(5,1,namein_name); for(j=0;j<5;j+) /第二行顯示CODE:ERROR!1 disp_char(j,2,table2j); for(j=0;j<6;j+) disp_char(j+5,2,errj

24、); disp_char(11,2,'1'); delay(100); /=輸入用戶名函數(shù)=/void input_name() uint j,flag0=0,error_num=0; uint k0=16; while(flag0=0) k0=keyscan();while(k0=16) /k0=16表示未輸入用戶名 k0=keyscan();/-/ if(k0>=0&&k0<4) /輸入為用戶0、用戶1、用戶2、用戶3 flag0=1; /flag=1表示輸入一個正確的用戶 in_name=k0; /記下所輸入的正確用戶的序號 display()

25、; for(j=0;j<5;j+)/第一行顯示NAME:及輸入的用戶 disp_char(j,1,table1j); disp_char(5,1,k0); for(j=0;j<5;j+) /第二行顯示CODE: disp_char(j,2,table2j); delay(10); p17=0; /指示燈亮,蜂鳴器響,表示用戶名正確 delay(400); p17=1; /-/ if(k0>=4&&k0<=15) /輸入的用戶錯誤 flag0=0; error_num+; display(); for(j=0;j<5;j+) /第一行顯示NAME:ERROR! disp_char(j,1,table1j); disp_char(5,1,funk0-10); for(j=0;j<6;j+) disp_char(j+7,1,errj); for(j=0;j<5;j

溫馨提示

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

評論

0/150

提交評論