52、h>#defineuintunsignedint#defineucharunsignedcharlongintshu=1,shu1,aa=0,password;uchark=0,key=0,bz=0,dk=0,num2;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};longintnum,temp,num1;voidinit();voiddisplay();voiddelay(uintz)
//延时函数{uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidkeyscan();voidmain(){init();while
(1)
{keyscan();display();}}voidinit()
//初始化函数{num=17;P1=0xff;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=0;}//键盘扫描函数voidkeyscan(){P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!
=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!
=0xf0){temp=P3;k++;bz++;switch(temp){case0xee:
num=0;break;case0xde:
num=1;break;case0xbe:
num=2;break;case0x7e:
num=3;break;}while(temp!
=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!
=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!
=0xf0){temp=P3;k++;bz++;switch(temp){case0xed:
num=4;break;case0xdd:
num=5;break;case0xbd:
num=6;break;case0x7d:
num=7;break;}while(temp!
=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!
=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!
=0xf0){temp=P3;switch(temp){case0xeb:
num=8,k++,bz++;break;case0xdb:
num=9,k++,bz++;break;case0xbb:
num=10,num2=10;break;case0x7b:
num=11;break;}while(temp!
=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!
=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!
=0xf0){temp=P3;switch(temp){case0xe7:
num=12;break;case0xd7:
num=13;break;case0xb7:
num=14;break;case0x77:
num=15;break;}while(temp!
=0xf0){temp=P3;temp=temp&0xf0;}}}if(key==0)
//每输入一个数,执行一次{if(shu==k){dk=k;shu++;if(num<10)//只可以输入0--9num1=10*num1+num;//num1即为输入的密码的数值(由于程序的问题,密码的第一位不可以为零)}}if(num2==10)
//确认键(接下来进行密码的对比){shu1=num1;//将输入数字赋给shu1if(shu1==password)//输入密码正确,执行下面语句{TR0=1;//开定时器if(aa<=20)
//绿灯亮一秒P1=0x7f;//具体是不是绿灯亮需根据自己的跑马灯调整elseP1=0xff;//一秒后熄灭}else//密码输入错误,则执行下面语句{TR0=1;//开启定时器if(aa<=60)
{key=1;//禁止输入P1=0xfb;//红灯亮if(dk==k)
//再次禁止输入{aa=0;//重新计时,红灯亮三秒TH0=(65536-50000)/256;TL0=(65536-50000)%256;dk=99;//使dk不等于k跳出此if语句}}elseP1=0xff;//大于3秒后,灯全灭key=0;//可以重新输入密码}}if(num==11)
//删除键{num=20;bz--;num1=num1/10;num2=0;key=0;}if(num==13)
//重设密码{password=num1;num=20;num1=0;num2=0;bz=0;}}voidtimer0()
interrupt1//定时器{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;}voiddisplay()
//显示程序{if(bz==0)
//没有输入时,数码管全熄灭{P0=0x00;P2=0xff;}if(bz==1)//输入一位时,一个数码管亮{P0=0xff;P2=0xfe;delay(5);}if(bz==2)
//输入两位时,两个数码管亮{P0=0xff;P2=0xfe;delay(5);P0=0xff;P2=0xfd;delay(5);}if(bz==3)//***********{P0=0xff;P2=0xfe;delay(5);P0=0xff;P2=0xfd;delay(5);P0=0xff;P2=0xfb;delay(5);}if(bz==4)
//****************{P0=0xff;P2=0xfe;delay(5);P0=0xff;P2=0xfd;delay(5);P0=0xff;P2=0xfb;delay(5);P0=0xff;P2=0xf7;delay(5);}if(bz==5){P0=0xff;P2=0xfe;delay(5);P0=0xff;P2=0xfd;delay(5);P0=0xff;P2=0xfb;delay(5);P0=0xff;P2=0xf7;delay(5);P0=0xff;P2=0xef;delay(5);}if(bz==6)
{P0=0xff;P2=0xfe;delay(5);P0=0xff;P2=0xfd;delay(5);P0=0xff;P2=0xfb;delay(5);P0=0xff;P2=0xf7;delay(5);P0=0xff;P2=0xef;delay(5);P0=0xff;P2=0xdf;delay(5);}if(bz==7)
{P0=0xff;P2=0xfe;delay(5);P0=0xff;P2=0xfd;delay(5);P0=0xff;P2=0xfb;delay(5);P0=0xff;P2=0xf7;delay(5);P0=0xff;P2=0xef;delay(5);P0=0xff;P2=0xdf;delay(5);P0=0xff;P2=0xbf;delay(5);}if(bz==8)
{P0=0xff;P2=0xfe;delay(5);P0=0xff;P2=0xfd;delay(5);P0=0xff;P2=0xfb;delay(5);P0=0xff;P2=0xf7;delay(5);P0=0xff;P2=0xef;delay(5);P0=0xff;P2=0xdf;delay(5);P0=0xff;P2=0xbf;delay(5);P0=0xff;P2=0x7f;delay(5);}}
C、程序调试及仿真本程序通过Keil单片机开发平台实现程序的编译,链接,生成HEX文件。
程序再编译过程中可以发现错位,并及时改正,在设计时非常重要,使错误被扼杀在摇篮中。
通过Keil和硬件仿真平台Proteus的联合,可以将设计效果仿真出来,根据效果,有目的的改变设计,优化程序。
c、1利用Keil软件实验过程截图:
1,建一个工程,并设定与Proteus仿真相关的参数2,c语言程序,并生成HEX文件c、2利用Proteu画原理图:
五、实验总结及感想学习单片机是我们小学期的任务,刚接到课题的时候有点迷茫,感觉单片机这种东西,很高深不是几天就能够学好的,信心不足。
可是之后我们以小组为单位,以小组学习的方式一同学习,共同分享探讨学习单片机,发现单片机并没有想象的那么难。
它是以keil为软件平台,以AT89S52单片机为硬件平台,经过编程控制单片机实现各种功能。
一分耕耘一分收获,我们搜索了大量的资料,网上的教学视频,图书馆的单片机的教程等等。
对单片机渐渐有了柳暗花明又一村的效果,也收集了大量关于密码锁的资料。
随着涉猎的点滴积累,我对电子密码锁的设计方案已经慢慢酝酿而成。
有了方向和不少知识储备后,在接下来的几天,几乎每天都有突破,虽然有时只是一句程序的修改或诞生,但那种收获的感觉很暖人心。
通过自主学习,从实践中真正学到了知识,也认识到了自己的学习能力的缺陷,对今后的学习积累了经验。
同时,也对单片机功能的强大有了更深的理解,产生了浓厚的兴趣。
每一次的进步,即使是小小的跑马灯按照自己的意愿亮了,受自己控制了,也让自己颇有成就感。
因为,付出获得了收获是人生之快事。
当然在实践中也遇到了不少的问题,接下来总结一下,共同探讨:
1、按键问题在密码锁的设计中,按密码的功能选择是通过按键开关实现的。
实际在按按键时,有时按键反应太快,按一次,跳了几下,很是纠结。
后来通过学习知道开关可以通过使用软件消抖和硬件消抖来避免这种情况发生。
后来,我采取了软件消抖。
硬件消抖并不适合,板子已经固定无法使用硬件消抖,所以,在编程时多了几行代码(延时函数等)成功解决了这个问题。
在实际电路调试中,按键反应没有出现过于灵敏的问题,基本可控制。
2、密码设定问题这也是该程序的一个缺陷,就是输入的第一个数字密码不能是0,否则会出错。
因为在编程中把输入的密码看成是一个多数字(这是从计算器的实现移植过来的方法),比较容易实现。
所以造成了这样的缺陷。
要是把密码看成是一组数组,就可以成功解决这个问题,由于时间的原因,就没去实践了。
以上便是此次学习的一些心得。
虽然在学习中遇到了不少问题,基本上都找到了相应的解决之道,也还存在未解决的问题。
不过整个实验的过程就是一个解决问题的过程,每天都解决一些问题,我的实验也就解决了,当然结果不重要,功利化的追求结果,会使人浮躁,还是享受那份疑难迎刃而解的快感吧!