还剩6页未读,继续阅读
文本内容:
电子密码锁实验报告实验目的
1、学习8051定时器时间计时处理、跑马灯、按键扫描及LED数码管显示的设计方法
2、设计任务及要求利用实验平台上8个LED数码管,按键,跑马灯实现设置密,,码密码锁的功能二实验要求基本要求1用44矩阵键盘组成0-9数字键及确认键和删除键2:可以自行设定或删除8位密码3:用5位数码管组成显示电路提示信息,当输入密码时,只显示、,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码8进行比较,若密码正确,则门开,此处用绿色发光二极管亮一秒钟做为提示,若密码不led正确,禁止按键输入3秒,同时用红色led发光二极管亮三秒钟做为提示;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止三,实验基本原理利用单片机定时器完成计时功能,定时器0计时中断程序每隔
0、05s中断一次并当作一个计数,设定定时1秒的中断计数初值为20为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由o于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现显示,通LED过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示四,实验设计分析针对要实现的功能,采用AT89S51单片机进行设计,位AT89S51单片机是一款低功耗,高性能CMOS8单片机,片内含4KB在线可编程ISP的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准指令系统及引脚结构这样,既能做到经济合理又能实现预期的MCS-5180C51功能在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能程序可分为闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计这是前期准备工作第二部分是硬件部分依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等第三部分是软件部分先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计第四部分是软件画图部分设计好电路后进行画图,包括电路图和仿真图的绘制第五部分是软件仿真部分软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功第六部分是硬件实现部分连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!五,实验要求实现A、电路设计
1、整体设计此次设计主要是应用单片机来设计电子密码锁,硬件部分主要分以下电路模块显示电路用个共阴数码管显示输入的密码,通过动态扫描进行显示,8从而避免了译码器的使用,同时节约了I/O端口,使电路更加简单跑马灯的红绿灯作指示灯,指示输入密码的正确与否单片机采用AT89S52系列,这种单片机应用简单,适合电子密码锁设计电路的总体设计框架如下单片机输入部分晶振和复位输出部分B、程序设计B、程序总体设计本实验用汇编程序完成、主程序开始显示星期,时,分,秒是否有调转?中断秒,分,时等进位闪烁提示显示日期并调整响铃提示时间调整闹铃设置定时设TO置铃声测试秒表模式回主程序定时到按键按0键闹铃到按1键按2键按3键按4键按5键按键键恢复按键按键按键按键倒计时启动并显示回主程序秒表暂停秒表清零774800回主程序按7键程序总的流程图如下NO YES结合电路图,程序设计的整体思路为以下为在该工作方式下模式选择的按键方式,步骤如下各模块数码管,跑马灯,键L CPU,盘接好线
2、第1到10个键代表0—9这个数字
3、进行密码的设置随意按下六个键确保第一位密码不是,并记住密码然后按下第二个键重置密码键,即完成了密码的设置0此时数码管是不会亮的
4、随意输入6个数,组成新密码,然后按下第10个键确认键按下后,程序自动进行与原设密码进行对比若密码正确,则绿灯亮秒,然后熄灭若密1码不正确,则红灯亮3秒,且在这三秒内按下任何数字键无效,按下一个数字键后,会重新计时红灯再亮三秒,三秒后,才能重新输入密码、另外,第个键是删除键,可进行数511字的删除,重新输入B、
2、3主程序主程序主要对按键进行扫描,以及判断定时和闹铃时间是否已到,若到则调用相关程序,该段程序如下#includereg
52、h#define uintunsigned int#define ucharunsigned charlong intshu=l,shul,aa=0,password;uchar k=0,key=0,bz=0,dk=0,num2;uchar codetable□={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,Ox79,0x71,0};longintnum,temp,numl;void init;void display;void delayuintz〃延时函数{uint x,y;forx=z;x0;x—fory=110;y0;y—;}void keyscan;voidmain{init;whilel{keyscanQ;displayO;}}void init〃初始化函数{num=17;P L=0xff;TMOD=0x01;TH0=65536-〃键盘扫描函数50000/256;TL0=65536-50000%256;EA=l;ET0=l;TR0=0;}voidkeyscan{P3=0xfe;temp=P3;temp=temp0xf0;whiletemp!=0xf0{delay5;temp=P3;temp=temp0xf0;whiletemp!=0xf0{temp=P3;k++;bz++;switchtemp{caseOxee:num=O;break;case Oxde:num=l;break;case0xbe:num=2;break;case0x7e:num=3;break;}whiletemp!=0xf0{temp=P3;temp=temp0xf0;}}}P3=0xfd;temp=P3;temp=temp0xf0;whiletemp!=0xf0{delay5;temp=P3;temp=temp0xf0;while;temp!=0xf0{temp=P3;k++;bz4-+switchtemp{case0xed:num=4;break;case0xdd:num=5;break;case0xbd:num=6;break;case0x7d:num=7;break;}whiletemp!=0xf0{temp=P3;temp=temp0xf0;}}}P3=0xfb;te mp=⑸P3;temp=tempOxfO;whiletemp!=OxfO{delay;temp=P3;temp=tempOxfO;whiletemp!=0xf0{temp=P3;switchtemp{case0xeb:num=8k++bz++;break;case0xdb:num=9k++,bz++;break;casez z/0xbb:num=10num2=10;break;case/0x7b:num=ll;break;}whiletemp!=0xf0{temp=P3;temp=temp0xf0;}}}P3=0xf7;temp=P3;temp=temp0xf0;whiletemp!=0xf0{delay5;temp=P3;temp=temp0xf0;whiletemp!=0xf0{temp=P3;switchtemp{case0xe7:num=12;break;case0xd7:num=13;break;case0xb7:num=14;break;case0x77:num=15;break;}whiletemp!=0xf0{temp=P3;temp=temp0xf0;}}}ifkey==0〃每输入一个数,执行一次{ifshu==k{dk=k;shu++;ifnum10〃只可以输入0--9即为输入的密码的数值由于程序的问题,密码的numl=10*numl+num;//numl第一位不可以为零}}ifnum2==10〃确认键接下来进行密码的对比{shul=numl;〃将输入数字赋给shul ifshul==〃输入密码正确,执行下面语句{〃开定时器password TRO=1;ifaa=20〃绿灯亮一秒〃具体是不是绿灯亮需根据自己的跑马灯调整〃一Pl=0x7f;else Pl=Oxff;秒后熄灭}〃密码输入错误,则执行下面语句{〃开启定时器else TRO=1;ifaa=60〃禁止输入〃红灯亮{key=l;Pl=0xfb;ifdk==k〃再次禁止输入{aa=0;〃重新计时,红灯亮三秒TH0=65536-50000/256;使不等于跳出止匕语句}}大TL0=65536-50000%256;dk=99;//dk kif elsePl=Oxff;//于3秒后,灯全灭key=0;/何以重新输入密码}}ifnum==ll〃删除键{num=20;bz—;numl=numl/10;num2=0;key=0;}ifnum==13//重设密£马{password=numl;num=20;numl=0;num2=0;bz=0;}}void timerOQinterruptl〃定时器{TH0=65536-50000/256;TL0=65536-50000%256;aa++;}void displayO〃显示程序{ifbz==O〃没有输入时,数码管全熄灭{P0=0x00;P2=0xff;}ifbz==l〃输入一位时,一个数码管亮{P0=0xff;P2=0xfe;delay5;}ifbz==2⑸〃输入两位时,两个数码管亮{P0=0xff;P2=0xfe;delay;P0=0xff;P2=0xfd;delay⑸〃;}ifbz==3***********{P0=0xff;P2=0xfe;delay5;P0=0xff;P2=0xfd;delay5;P0=0xff;P2=0xfb;delay5;}ifbz==4〃⑸⑸****************{P0=0xff;P2=0xfe;delay;P0=0xff;P2=0xfd;delay;PO=Oxff;P2=0xfb;delay5;P0=0xff;P2=0xf7;delay5;}ifbz==5{P0=0xff;P2=0xfe;delay5;P0=0xff;P2=0xfd;delay5;P0=0xff;P2=0xfb;delay5;P0=0xff;P2=0xf7;delay5;P0=0xff;P2=0xef;delay5;}ifbz==6{P0=0xff;P2=0xfe;delay5;P0=0xff;P2=0xfd;delay5;P0=0xff;P2=0xfb;delay5;P0⑸;=0xff;P2=0xf7;delay5;P0=0xff;P2=0xef;delay5;P0=0xff;P2=0xdf;delay}ifbz==7{P0=0xff;P2=0xfe;delay5;P0=0xff;P2=0xfd;delay5;P0=0xff;P2=0xfb;delay5;P0=0xff;P2=0xf7;delay5;P0=0xff;P2=0xef;delay5;P0=0xff;P2=0xdf;delay5;P0=0xff;P2=0xbf;delay5;}ifbz==8{P0=0xff;P2=0xfe;delay5;P0=0xff;P2=0xfd;delay5;P0=0xff;P2=0xfb;delay5;P0=0xff;P2=0xf7;delay5;P0=0xff;P2=0xef;delay5;P0=0xff;P2=0xdf;delay5;P0=0xff;P2=0xbf;delay5;P0=0xff;P2=0x7f;delay5;}}C、程序调试及仿真本程序通过Keil单片机开发平台实现程序的编译,链接,生成HEX文件程序再编译过程中可以发现错位,并及时改正,在设计时非常重要,使错误被扼杀在摇篮中通过Keil和硬件仿真平台Proteus的联合,可以将设计效果仿真出来,根据效果,有目的的改变设计,优化程序c、1利用Keil软件实验过程截图1,建一个工程,并设定与仿真相关的参数语言程序,并生成文件、利用Proteus2,c HEXc2Proteu画原理图
五、实验总结及感想学习单片机是我们小学期的任务,刚接到课题的时候有点迷茫,感觉单片机这种东西,很高深不是几天就能够学好的,信心不足可是之后我们以小组为单位,以小组学习的方式一同学习,共同分享探讨学习单片机,发现单片机并没有想象的那么难它是以为软件平台,以单片机为硬件平台,经过编程控制单片机实keil AT89S52现各种功能一分耕耘一分收获,我们搜索了大量的资料,网上的教学视频,图书馆的单片机的教程等等对单片机渐渐有了柳暗花明又一村的效果,也收集了大量关于密码锁的资料随着涉猎的点滴积累,我对电子密码锁的设计方案已经慢慢酝酿而成有了方向和不少知识储备后,在接下来的几天,几乎每天都有突破,虽然有时只是一句程序的修改或诞生,但那种收获的感觉很暖人心通过自主学习,从实践中真正学到了知识,也认识到了自己的学习能力的缺陷,对今后的学习积累了经验同时,也对单片机功能的强大有了更深的理解,产生了浓厚的兴趣每一次的进步,即使是小小的跑马灯按照自己的意愿亮了,受自己控制了,也让自己颇有成就感因为,付出获得了收获是人生之快事当然在实践中也遇到了不少的问题,接下来总结一下,共同探讨按键问题在密码锁的设计中,按密码的功能选择是通L过按键开关实现的实际在按按键时,有时按键反应太快,按一次,跳了几下,很是纠结后来通过学习知道开关可以通过使用软件消抖和硬件消抖来避免这种情况发生后来,我采取了软件消抖硬件消抖并不适合,板子已经固定无法使用硬件消抖,所以,在编程时多了几行代码(延时函数等)成功解决了这个问题在实际电路调试中,按键反应没有出现过于灵敏的问题,基本可控制,
2、密码设定问题这也是该程序的一个缺陷就是输入的第一个数字密码不能是0,否则会出错因为在编程中把输入的密码看成是一个多数字(这是从计算器的实现移植过来的方法),比较容易实现所以造成了这样的缺陷要是把密码看成是一组数组,就可以成功解决这个问题,由于时间的原因,就没去实践了以上便是此次学习的一些心得虽然在学习中遇到了不少问题,基本上都找到了相应的解决之道,也还存在未解决的问题不过整个实验的过程就是一个解决问题的过程,每天都解决一些问题,我的实验也就解决了,当然结果不重要,功利化的追求结果,会使人浮躁,还是享受那份疑难迎刃而解的快感吧!。