1. 實驗任務 用4×4組成0-9數字鍵及確認鍵。 用8位數碼管組成顯示電路提示信息,當輸入密碼時,只顯示“8.”,當密碼位數輸入完畢按下確認鍵時,對輸入的密碼與設定的密碼進行比較,若密碼正確,則門開,此處用LED發光二極管亮一秒鐘做為提示,同時發出“叮咚”聲;若密碼不正確,禁止按鍵輸入3秒,同時發出“嘀、嘀”報警聲;若在3秒之內仍有按鍵按下,則禁止按鍵輸入3秒被重新禁止。 2. 電路原理圖 3. 系統板上硬件連線 (1). 把“單片機系統”區域中的P0.0-P0.7用8芯排線連接到“動態數碼顯示”區域中的ABCDEFGH端子上。 (2). 把“單片機系統“區域中的P2.0-P2.7用8芯排線連接到“動態數碼顯示”區域中的S1S2S3S4S5S6S7S8端子上。 (3). 把“單片機系統”區域中的P3.0-P3.7用8芯排線連接到“4×4行列式鍵盤”區域中的R1R2R3R4C1C2C3C4端子上。 (4). 把“單片機系統”區域中的P1.0用導線連接到“八路發光二極管模塊”區域中的L2端子上。 (5). 把“單片機系統”區域中的P1.7用導線連接到“音頻放大模塊”區域中的SPK IN端子上。 (6). 把“音頻放大模塊”區域中的SPK OUT接到喇叭上。 4. 程序設計內容 (1). 4×4行列式鍵盤識別技術:有關這方面內容前面已經討論過,這里不再重復。 (2). 8位數碼顯示,初始化時,顯示“P ”,接著輸入最大6位數的密碼,當密碼輸入完后,按下確認鍵,進行密碼比較,然后給出相應的信息。在輸入密碼過程中,顯示器只顯示“8.”。當數字輸入超過6個時,給出報警信息。在密碼輸入過程中,若輸入錯誤,可以利用“DEL”鍵刪除剛才輸入的錯誤的數字。 (3). 4×4行列式鍵盤的按鍵功能分布圖如圖4.33.2所示: 圖4.33.2
5. 單片機C語言源程序
- #include <AT89X52.H>
-
- 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)%256;
- 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<keycount;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<keycount;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<keycount;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<keycount;i++)
- {
- if(getps[i]!=ps[i])
- {
- i=keycount;
- errorflag=1;
- rightflag=0;
- second3=0;
- goto a2;
- }
- }
- errorflag=0;
- rightflag=1;
- a2: i=keycount;
- }
- }
- temp=temp & 0x0f;
- while(temp!=0x0f)
- {
- temp=P3;
- temp=temp & 0x0f;
- }
- keyoverflag=0;//?????????
- }
- }
- }
- }
- void t0(void) interrupt 1 using 0
- {
- TH0=(65536-500)/256;
- TL0=(65536-500)%256;
-
- flashcount++;
- if(flashcount==8)
- {
- flashcount=0;
- P0=dispcode[dispbuf[dispcount]];
- P2=dispbit[dispcount];
- dispcount++;
- if(dispcount==8)
- {
- dispcount=0;
- }
- }
-
- if((errorflag==1) && (rightflag==0))
- {
- bb++;
- if(bb==800)
- {
- bb=0;
- alarmflag=~alarmflag;
- }
- if(alarmflag==1)//sound alarm signal
- {
- P1_7=~P1_7;
- }
-
- aa++;
- if(aa==800)//light alarm signal
- {
- aa=0;
- P1_0=~P1_0;
- }
- second3++;
- if(second3==6400)
- {
- second3=0;
- errorflag=0;
- rightflag=0;
- alarmflag=0;
- bb=0;
- aa=0;
- }
- }
- else if((errorflag==0) && (rightflag==1))
- {
- P1_0=0;
- cc++;
- if(cc<1000)
- {
- okflag=1;
- }
- else if(cc<2000)
- {
- okflag=0;
- }
- else
- {
- errorflag=0;
- rightflag=0;
- P1_7=1;
- cc=0;
- oka=0;
- okb=0;
- okflag=0;
- P1_0=1;
- }
- if(okflag==1)
- {
- oka++;
- if(oka==2)
- {
- oka=0;
- P1_7=~P1_7;
- }
- }
- else
- {
- okb++;
- if(okb==3)
- {
- okb=0;
- P1_7=~P1_7;
- }
- }
- }
-
- if(keyoverflag==1)
- {
- P1_7=~P1_7;
- }
- }
復制代碼 |