51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > C51教程 > 详细内容
【吉林科技大学】第三章:89S51实践课题--4*4及8位数码管电子密码锁
发布时间:2009/6/16  阅读次数:1942  字体大小: 【】 【】【

Lesson 31

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所示:
7
8
9
4
5
6
  
1
2
3
Del
0
  
  
Enter
  
5.C语言源程序
#include
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
                                                           {
                                                               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;
&n, bsp;        &n, bsp;                           break;
                &n, bsp;                 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
                                                           {
                                                               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;
       }
}
  
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号