1.實(shí)驗(yàn)任務(wù)
根據(jù)設(shè)定好的密碼,采用二個(gè)按鍵實(shí)現(xiàn)密碼的輸入功能,當(dāng)密碼輸入正確之后,鎖就打開,如果輸入的三次的密碼不正確,就鎖定按鍵3秒鐘,同時(shí)發(fā)現(xiàn)報(bào)警聲,直到?jīng)]有按鍵按下3種后,才打開按鍵鎖定功能;否則在3秒鐘內(nèi)仍有按鍵按下,就重新鎖定按鍵3秒時(shí)間并報(bào)警。
2.系統(tǒng)板上硬件連線
(1).把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0/AD0用導(dǎo)線連接到“音頻放大模塊”區(qū)域中的SPK IN端子上;
(2).把“音頻放大模塊”區(qū)域中的SPK OUT端子接喇叭和;
(3).把“單片機(jī)系統(tǒng)”區(qū)域中的P2.0/A8-P2.7/A15用8芯排線連接到“四路靜態(tài)數(shù)碼顯示”區(qū)域中的任一個(gè)ABCDEFGH端子上;
(4). 把“單片機(jī)系統(tǒng)“區(qū)域中的P1.0用導(dǎo)線連接到“八路發(fā)光二極管模塊”區(qū)域中的L1端子上;
(5). 把“單片機(jī)系統(tǒng)”區(qū)域中的P3.6/WR、P3.7/RD用導(dǎo)線連接到“獨(dú)立式鍵盤”區(qū)域中的SP1和SP2端子上;
3.程序設(shè)計(jì)內(nèi)容
(1). 密碼的設(shè)定,在此程序中密碼是固定在程序存儲(chǔ)器ROM中,假設(shè)預(yù)設(shè)的密碼為“12345”共5位密碼。
(2). 密碼的輸入問題:
由于采用兩個(gè)按鍵來完成密碼的輸入,那么其中一個(gè)按鍵為功能鍵,另一個(gè)按鍵為數(shù)字鍵。在輸入過程中,首先輸入密碼的長(zhǎng)度,接著根據(jù)密碼的長(zhǎng)度輸入密碼的位數(shù),直到所有長(zhǎng)度的密碼都已經(jīng)輸入完畢;或者輸入確認(rèn)功能鍵之后,才能完成密碼的輸入過程。進(jìn)入密碼的判斷比較處理狀態(tài)并給出相應(yīng)的處理過程。
(3).按鍵禁止功能:初始化時(shí),是允許按鍵輸入密碼,當(dāng)有按鍵按下并開始進(jìn)入按鍵識(shí)別狀態(tài)時(shí),按鍵禁止功能被激活,但啟動(dòng)的狀態(tài)在3次密碼輸入不正確的情況下發(fā)生的。
5.C語言源程序
#i nclude
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[9];
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)%6;
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
{
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)%6;
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;
}
}
}
}
1.實(shí)驗(yàn)任務(wù)
用4×4組成0-9數(shù)字鍵及確認(rèn)鍵。
用8位數(shù)碼管組成顯示電路提示信息,當(dāng)輸入密碼時(shí),只顯示“8.”,當(dāng)密碼位數(shù)輸入完畢按下確認(rèn)鍵時(shí),對(duì)輸入的密碼與設(shè)定的密碼進(jìn)行比較,若密碼正確,則門開,此處用LED發(fā)光二極管亮一秒鐘做為提示,同時(shí)發(fā)出“叮咚”聲;若密碼不正確,禁止按鍵輸入3秒,同時(shí)發(fā)出“嘀、嘀”報(bào)警聲;若在3秒之內(nèi)仍有按鍵按下,則禁止按鍵輸入3秒被重新禁止。
圖4.33.1
3.系統(tǒng)板上硬件連線
(1)。把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0-P0.7用8芯排線連接到“動(dòng)態(tài)數(shù)碼顯示”區(qū)域中的ABCDEFGH端子上。
(2)。把“單片機(jī)系統(tǒng)“區(qū)域中的P2.0-P2.7用8芯排線連接到“動(dòng)態(tài)數(shù)碼顯示”區(qū)域中的S1S2S3S4S5S6S7S8端子上。
(3)。把“單片機(jī)系統(tǒng)”區(qū)域中的P3.0-P3.7用8芯排線連接到“4×4行列式鍵盤”區(qū)域中的R1R2R3R4C1C2C3C4端子上。
(4)。把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0用導(dǎo)線連接到“八路發(fā)光二極管模塊”區(qū)域中的L2端子上。
(5)。把“單片機(jī)系統(tǒng)”區(qū)域中的P1.7用導(dǎo)線連接到“音頻放大模塊”區(qū)域中的SPK IN端子上。
(6)。把“音頻放大模塊”區(qū)域中的SPK OUT接到喇叭上。
4.程序設(shè)計(jì)內(nèi)容
(1).4×4行列式鍵盤識(shí)別技術(shù):有關(guān)這方面內(nèi)容前面已經(jīng)討論過,這里不再重復(fù)。
(2).8位數(shù)碼顯示,初始化時(shí),顯示“P”,接著輸入最大6位數(shù)的密碼,當(dāng)密碼輸入完后,按下確認(rèn)鍵,進(jìn)行密碼比較,然后給出相應(yīng)的信息。在輸入密碼過程中,顯示器只顯示“8.”。當(dāng)數(shù)字輸入超過6個(gè)時(shí),給出報(bào)警信息。在密碼輸入過程中,若輸入錯(cuò)誤,可以利用“DEL”鍵刪除剛才輸入的錯(cuò)誤的數(shù)字。
(3).4×4行列式鍵盤的按鍵功能分布圖如圖4.33.2所示:
圖4.33.2
5.電子密碼鎖C語言源程序
#i nclude
unsigned char ps[]={1,2,3,4,5};
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,
0x00,0x40,0x73,0xff};
unsigned char dispbuf[8]={18,16,16,16,16,16,16,16};
unsigned char dispcount;
unsigned char flashcount;
unsigned char temp;
unsigned char key;
unsigned char keycount;
unsigned char pslen=5;
unsigned char getps[6];
bit keyoverflag;
bit errorflag;
bit rightflag;
unsigned int second3;
unsigned int aa,bb;
unsigned int cc;
bit okflag;
bit alarmflag;
bit hibitflag;
unsigned char oka,okb;
void main(void)
{
unsigned char i,j;
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%6;
TR0=1;
ET0=1;
EA=1;
while(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=10;i》0;i--)
for(j=248;j》0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=7;
break;
case 0x0d:
key=8;
break;
case 0x0b:
key=9;
break;
case 0x07:
key=10;
break;
}
temp=P3;
P1_1=~P1_1;
if((key》=0) && (key《10))
{
if(keycount《6)
{
getps[keycount]=key;
dispbuf[keycount+2]=19;
}
keycount++;
if(keycount==6)
{
keycount=6;
}
else if(keycount》6)
{
keycount=6;
keyoverflag=1;//key overflow
}
}
else if(key==12)//delete key
{
if(keycount》0)
{
keycount--;
getps[keycount]=0;
dispbuf[keycount+2]=16;
}
else
{
keyoverflag=1;
}
}
else if(key==15)//enter key
{
if(keycount!=pslen)
{
errorflag=1;
rightflag=0;
second3=0;
}
else
{
for(i=0;i
{
if(getps[i]!=ps[i])
{
i=keycount;
errorflag=1;
rightflag=0;
second3=0;
goto a;
}
}
errorflag=0;
rightflag=1;
a: i=keycount;
}
}
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
keyoverflag=0;//?????????
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=10;i》0;i--)
for(j=248;j》0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=4;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=11;
break;
}
temp=P3;
P1_1=~P1_1;
if((key》=0) && (key《10))
{
if(keycount《6)
{
getps[keycount]=key;
dispbuf[keycount+2]=19;
}
keycount++;
if(keycount==6)
{
keycount=6;
}
else if(keycount》6)
{
keycount=6;
keyoverflag=1;//key overflow
}
}
else if(key==12)//delete key
{
if(keycount》0)
{
keycount--;
getps[keycount]=0;
dispbuf[keycount+2]=16;
}
else
{
keyoverflag=1;
}
}
else if(key==15)//enter key
{
if(keycount!=pslen)
{
errorflag=1;
rightflag=0;
second3=0;
}
else
{
for(i=0;i
{
if(getps[i]!=ps[i])
{
i=keycount;
errorflag=1;
rightflag=0;
second3=0;
goto a4;
}
}
errorflag=0;
rightflag=1;
a4: i=keycount;
}
}
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
keyoverflag=0;//?????????
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=10;i》0;i--)
for(j=248;j》0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=1;
break;
case 0x0d:
key=2;
break;
case 0x0b:
key=3;
break;
case 0x07:
key=12;
break;
}
temp=P3;
P1_1=~P1_1;
if((key》=0) && (key《10))
{
if(keycount《6)
{
getps[keycount]=key;
dispbuf[keycount+2]=19;
}
keycount++;
if(keycount==6)
{
keycount=6;
}
else if(keycount》6)
{
keycount=6;
keyoverflag=1;//key overflow
}
}
else if(key==12)//delete key
{
if(keycount》0)
{
keycount--;
getps[keycount]=0;
dispbuf[keycount+2]=16;
}
else
{
keyoverflag=1;
}
}
else if(key==15)//enter key
{
if(keycount!=pslen)
{
errorflag=1;
rightflag=0;
second3=0;
}
else
{
for(i=0;i
{
if(getps[i]!=ps[i])
{
i=keycount;
errorflag=1;
rightflag=0;
second3=0;
goto a3;
}
}
errorflag=0;
rightflag=1;
a3: i=keycount;
}
}
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
keyoverflag=0;//?????????
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=10;i》0;i--)
for(j=248;j》0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=0;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
}
temp=P3;
P1_1=~P1_1;
if((key》=0) && (key《10))
{
if(keycount《6)
{
getps[keycount]=key;
dispbuf[keycount+2]=19;
}
keycount++;
if(keycount==6)
{
keycount=6;
}
else if(keycount》6)
{
keycount=6;
keyoverflag=1;//key overflow
}
}
else if(key==12)//delete key
{
if(keycount》0)
{
keycount--;
getps[keycount]=0;
dispbuf[keycount+2]=16;
}
else
{
keyoverflag=1;
}
}
else if(key==15)//enter key
{
if(keycount!=pslen)
{
errorflag=1;
rightflag=0;
second3=0;
}
else
{
for(i=0;i
{
-
二極管
+關(guān)注
關(guān)注
147文章
9660瀏覽量
166770 -
密碼鎖
+關(guān)注
關(guān)注
6文章
249瀏覽量
35036 -
C語言
+關(guān)注
關(guān)注
180文章
7608瀏覽量
137071
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論