1. 电路原理图

图4.33.1
2. 系统板上硬件连线
(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接到喇叭上。
3. 程序设计内容
(1). 4×4行列式键盘识别技术:有关这方面内容前面已经讨论过,这里不再重复。
(2). 8位数码显示,初始化时,显示“P”,接着输入最大6位数的密码,当密码输入完后,按下确认键,进行密码比较,然后给出相应的信息。在输入密码过程中,显示器只显示“8.”。当数字输入超过6个时,给出报警信息。在密码输入过程中,若输入错误,可以利用“DEL”键删除刚才输入的错误的数字。
(3). 4×4行列式键盘的按键功能分布图如图所示:

4. 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)%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<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)%6;
 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;
 }
}
看完此文后单片机密码锁设计你应该会了吧