1.實驗任務(wù) 根據(jù)設(shè)定好的密碼,采用二個按鍵實現(xiàn)密碼的輸入功能,當(dāng)密碼輸入正確之后,鎖就打開,如果輸入的三次的密碼不正確,就鎖定按鍵3秒鐘,同時發(fā)現(xiàn)報警聲,直到?jīng)]有按鍵按下3種后,才打開按鍵鎖定功能;否則在3秒鐘內(nèi)仍有按鍵按下,就重新鎖定按鍵3秒時間并報警。 2.電路原理圖 圖4.32.1 3.系統(tǒng)板上硬件連線 (1). 把“單片機系統(tǒng)”區(qū)域中的p0.0/ad0用導(dǎo)線連接到“音頻放大模塊”區(qū)域中的spk in端子上; (2). 把“音頻放大模塊”區(qū)域中的spk out端子接喇叭和; (3). 把“單片機系統(tǒng)”區(qū)域中的p2.0/a8-p2.7/a15用8芯排線連接到“四路靜態(tài)數(shù)碼顯示”區(qū)域中的任一個abcdefgh端子上; (4). 把“單片機系統(tǒng)“區(qū)域中的p1.0用導(dǎo)線連接到“八路發(fā)光二極管模塊”區(qū)域中的l1端子上; (5). 把“單片機系統(tǒng)”區(qū)域中的p3.6/wr、p3.7/rd用導(dǎo)線連接到“獨立式鍵盤”區(qū)域中的sp1和sp2端子上; 4.程序設(shè)計內(nèi)容 (1). 密碼的設(shè)定,在此程序中密碼是固定在程序存儲器rom中,假設(shè)預(yù)設(shè)的密碼為“12345”共5位密碼。 (2). 密碼的輸入問題: 由于采用兩個按鍵來完成密碼的輸入,那么其中一個按鍵為功能鍵,另一個按鍵為數(shù)字鍵。在輸入過程中,首先輸入密碼的長度,接著根據(jù)密碼的長度輸入密碼的位數(shù),直到所有長度的密碼都已經(jīng)輸入完畢;或者輸入確認(rèn)功能鍵之后,才能完成密碼的輸入過程。進入密碼的判斷比較處理狀態(tài)并給出相應(yīng)的處理過程。 (3). 按鍵禁止功能:初始化時,是允許按鍵輸入密碼,當(dāng)有按鍵按下并開始進入按鍵識別狀態(tài)時,按鍵禁止功能被激活,但啟動的狀態(tài)在3次密碼輸入不正確的情況下發(fā)生的。 5.c語言源程序 #include <at89x52.h> unsigned char code ps[]={1,2,3,4,5}; unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; unsigned char pslen=9; unsigned char templen; unsigned char digit; unsigned char funcount; unsigned char digitcount; unsigned char psbuf; bit cmpflag; bit hibitflag; bit errorflag; bit rightflag; unsigned int second3; unsigned int aa; unsigned int bb; bit alarmflag; bit exchangeflag; unsigned int cc; unsigned int dd; bit okflag; unsigned char oka; unsigned char okb; void main(void) { unsigned char i,j; p2=dispcode[digitcount]; tmod=0x01; th0=(65536-500)/256; tl0=(65536-500)%256; tr0=1; et0=1; ea=1; while(1) { if(cmpflag==0) { if(p3_6==0) //function key { for(i=10;i>0;i--) for(j=248;j>0;j--); if(p3_6==0) { if(hibitflag==0) { funcount++; if(funcount==pslen+2) { funcount=0; cmpflag=1; } p1=dispcode[funcount]; } else { second3=0; } while(p3_6==0); } } if(p3_7==0) //digit key { for(i=10;i>0;i--) for(j=248;j>0;j--); if(p3_7==0) { if(hibitflag==0) { digitcount++; if(digitcount==10) { digitcount=0; } p2=dispcode[digitcount]; if(funcount==1) { pslen=digitcount; templen=pslen; } else if(funcount>1) { psbuf[funcount-2]=digitcount; } } else { second3=0; } while(p3_7==0); } } } else { cmpflag=0; for(i=0;i<pslen;i++) { if(ps[ i]!=psbuf[ i]) { hibitflag=1; i=pslen; errorflag=1; rightflag=0; cmpflag=0; second3=0; goto a; } } cc=0; errorflag=0; rightflag=1; hibitflag=0; a: cmpflag=0; } } } void t0(void) interrupt 1 using 0 { th0=(65536-500)/256; tl0=(65536-500)%256; if((errorflag==1) && (rightflag==0)) { bb++; if(bb==800) { bb=0; alarmflag="alarmflag; } if(alarmflag==1) { p0_0="p0_0; } aa++; if(aa==800) { aa=0; p0_1="p0_1; } second3++; if(second3==6400) { second3=0; hibitflag=0; errorflag=0; rightflag=0; cmpflag=0; p0_1=1; alarmflag=0; bb=0; aa=0; } } if((errorflag==0) && (rightflag==1)) { p0_1=0; cc++; if(cc<1000) { okflag=1; } else if(cc<2000) { okflag=0; } else { errorflag=0; rightflag=0; hibitflag=0; cmpflag=0; p0_1=1; cc=0; oka=0; okb=0; okflag=0; p0_0=1; } if(okflag==1) { oka++; if(oka==2) { oka=0; p0_0="p0_0; } } else { okb++; if(okb==3) { okb=0; p0_0="p0_0; } } } |