1.实验任务用4×4组成0-9数字键及确认键。用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用LED发光二极管亮一秒钟做为提示,同时发出“叮咚”声;若密码不正确,禁止按键输入3秒,同时发出“嘀、嘀”报警声;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。2.电路原理图图4.33.13.系统板上硬件连线(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用导线连接到“音频放大模块”区域中的SPKIN端子上。(6).把“音频放大模块”区域中的SPKOUT接到喇叭上。4.程序设计内容(1).4×4行列式键盘识别技术:有关这方面内容前面已经讨论过,这里不再重复。(2).8位数码显示,初始化时,显示“P”,接着输入最大6位数的密码,当密码输入完后,按下确认键,进行密码比较,然后给出相应的信息。在输入密码过程中,显示器只显示“8.”。当数字输入超过6个时,给出报警信息。在密码输入过程中,若输入错误,可以利用“DEL”键删除刚才输入的错误的数字。(3).4×4行列式键盘的按键功能分布图如图4.33.2所示:图4.33.25.C语言源程序#includeAT89X52.Hunsignedcharps[]={1,2,3,4,5};unsignedcharcodedispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0x73,0xff};unsignedchardispbuf[8]={18,16,16,16,16,16,16,16};unsignedchardispcount;unsignedcharflashcount;unsignedchartemp;unsignedcharkey;unsignedcharkeycount;unsignedcharpslen=5;unsignedchargetps[6];bitkeyoverflag;biterrorflag;bitrightflag;unsignedintsecond3;unsignedintaa,bb;unsignedintcc;bitokflag;bitalarmflag;bithibitflag;unsignedcharoka,okb;voidmain(void){unsignedchari,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;i0;i--)for(j=248;j0;j--);temp=P3;temp=temp&0x0f;if(temp!=0x0f){temp=P3;temp=temp&0x0f;switch(temp){case0x0e:key=7;break;case0x0d:key=8;break;case0x0b:key=9;break;case0x07:key=10;break;}temp=P3;P1_1=~P1_1;if((key=0)&&(key10)){if(keycount6){getps[keycount]=key;dispbuf[keycount+2]=19;}keycount++;if(keycount==6){keycount=6;}elseif(keycount6){keycount=6;keyoverflag=1;//keyoverflow}}elseif(key==12)//deletekey{if(keycount0){keycount--;getps[keycount]=0;dispbuf[keycount+2]=16;}else{keyoverflag=1;}}elseif(key==15)//enterkey{if(keycount!=pslen){errorflag=1;rightflag=0;second3=0;}else{for(i=0;ikeycount;i++){if(getps[i]!=ps[i]){i=keycount;errorflag=1;rightflag=0;second3=0;gotoa;}}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;i0;i--)for(j=248;j0;j--);temp=P3;temp=temp&0x0f;if(temp!=0x0f){temp=P3;temp=temp&0x0f;switch(temp){case0x0e:key=4;break;case0x0d:key=5;break;case0x0b:key=6;break;case0x07:key=11;break;}temp=P3;P1_1=~P1_1;if((key=0)&&(key10)){if(keycount6){getps[keycount]=key;dispbuf[keycount+2]=19;}keycount++;if(keycount==6){keycount=6;}elseif(keycount6){keycount=6;keyoverflag=1;//keyoverflow}}elseif(key==12)//deletekey{if(keycount0){keycount--;getps[keycount]=0;dispbuf[keycount+2]=16;}else{keyoverflag=1;}}elseif(key==15)//enterkey{if(keycount!=pslen){errorflag=1;rightflag=0;second3=0;}else{for(i=0;ikeycount;i++){if(getps[i]!=ps[i]){i=keycount;errorflag=1;rightflag=0;second3=0;gotoa4;}}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;i0;i--)for(j=248;j0;j--);temp=P3;temp=temp&0x0f;if(temp!=0x0f){temp=P3;temp=temp&0x0f;switch(temp){case0x0e:key=1;break;case0x0d:key=2;break;case0x0b:key=3;break;case0x07:key=12;break;}temp=P3;P1_1=~P1_1;if((key=0)&&(key10)){if(keycount6){getps[keycount]=key;dispbuf[keycount+2]=19;}keycount++;if(keycount==6){keycount=6;}elseif(keycount6){keycount=6;keyoverflag=1;//keyoverflow}}elseif(key==12)//deletekey{if(keycount0){keycount--;getps[keycount]=0;dispbuf[keycount+2]=16;}else{keyoverflag=1;}}elseif(key==15)//enterkey{if(keycount!=pslen){errorflag=1;rightflag=0;second3=0;}else{for(i=0;ikeycount;i++){if(getps[i]!=ps[i]){i=keycount;errorflag=1;rightflag=0;second3=0;gotoa3;}}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;i0;i--)for(j=248;j0;j--);temp=P3;temp=temp&0x0f;if(temp!=0x0f){temp=P3;temp=temp&0x0f;switch(temp){case0x0e:key=0;break;case0x0d:key=13;break;case0x0b:key=14;break;case0x07:key=15;break;}temp=P3;P1_1=~P1_1;if((key=0)&&(key10)){if(keycount6){getps[keycount]=key;dispbuf[keycount+2]=19;}keycount++;if(keycount==6){keycount=6;}elseif(keycount6){keycount=6;keyoverflag=1;//keyoverflow}}elseif(key==12)//deletekey{if(keycount0){keycount--;getps[keycount]=0;dispbuf[keycount+2]=16;}else{keyoverflag=1;}}elseif(key==15)//enterkey{if(keycount!=pslen){errorflag=1;rightflag=0;second3=0;}else{for(i=0;ikeycount;i++){if(getps[i]!=ps[i]){i=keycount;errorflag=1;rightflag=0;second3=0;gotoa2;}}errorflag=0;rightflag=1;a2:i=keycount;}}temp=temp&0x0f;while(temp!=0x0f){temp=P3;temp=temp&0x0f;}keyoverflag=0;//?????????}}}}voidt0(void)interrupt1using0{TH0=(65536-500)/256;TL0=(65536-500)%2