单片机课程设计-电子密码锁-实验报告-

上传人:沈*** 文档编号:115224592 上传时间:2022-07-01 格式:DOC 页数:22 大小:672.50KB
收藏 版权申诉 举报 下载
单片机课程设计-电子密码锁-实验报告-_第1页
第1页 / 共22页
单片机课程设计-电子密码锁-实验报告-_第2页
第2页 / 共22页
单片机课程设计-电子密码锁-实验报告-_第3页
第3页 / 共22页
资源描述:

《单片机课程设计-电子密码锁-实验报告-》由会员分享,可在线阅读,更多相关《单片机课程设计-电子密码锁-实验报告-(22页珍藏版)》请在装配图网上搜索。

1、单片机课程设计电子密码锁实验报告学院:电子信息工程学院班级:自*姓名:* 学号:*指导教师:*单片机课程设计电子密码锁实验报告(一)实验目的1、了解电子密码锁工作原理和八段LED数码管显示原理。2、掌握LED数码管显示器与单片机接口电路设计方法。3、掌握实现密码锁功能的编程方法。(二)设计实现功能(1) 由程序设定初始密码,密码输入正确时锁打开,指示灯亮,发出“叮咚”的声音;密码输入不正确时,指示灯闪亮四次,发出“嘀嘀嘀滴”报警声。(2) 具有保护密码的功能,输入密码在数码管上显示可改为“88888”的方式,防止别人偷窥密码。(3) 具有修改密码的功能,密码输入错误可按DEL键进行删除。(4)

2、 具有防止多次试探密码的电子密码锁并加报警功能,密码输入错误超过三次,将一直发出“滴滴滴滴。”报警声。(5) 具有设定新密码的功能,输入密码后按CHG键,密码将被重新设定。(三)整体电路设计思路核心用单片机AT89S52来实现此实验的要求。用4*4键盘来输入密码。 每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的

3、抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。 用8个7段数码管来显示密码。数码管的显示用扫描的方式,利用动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。 在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。 对于显示的字形码数据我们采用查表方法来完成。(四)设计总框图89S52单片机数码管显示电路

4、矩阵键盘控制报警电路复位电路电源LED指示电路图1总体设计框图(五)按键说明按键键名功能说明19键数字输入密码C键退格键DEL取消刚才输入的密码D键清除密码键CLEAR将数码管上显示的数据清空E密码重置键CHG密码更改F确认键ENTER密码输入完成(六)仿真原理图(七)程序框图开始系统初始化提示输入密码键盘扫描有键按下数字键09退格键C密码重置D确认键E灯亮紧接着发出开门的声“叮咚”存储键值刷新LED输出数据清楚上次数字键输入灯闪四次,发出报警声“滴”错误3次报警,并锁定键盘密码判断正确?YYNNNYNYYNNY(八)制作过程中所遇到的问题及解决办法 调试时发现数码管一闪一闪的显示,程序刚开始

5、的是扫描8次数码管才显示,最后改成扫描4次数码管才显示,这样动态显示的数码管显示看起来不会晃眼睛了。 (九)体会与总结通过本次实验,我对单片机有了更一步的认识,以前学习的都只是书本上的知识,对单片机的认识也只是停留课本。这次单片机课程设计,从选题,查资料,画电路图,编程,Proteus仿真,焊板子,调试。在这段单片机课程设计时间里,觉得自己很忙碌但很充实,有时很抓狂,因为程序的设计但很快乐。在实验过程中遇到一些困难,比如蜂鸣器不按照设定的程序发出声音,最后经过和同学的帮忙,发现是蜂鸣器的控制三极管接错了,应该接PNP9012接成了NPN9013。以前模拟电路仿真用的是Multisum,这次单片

6、机课程设计显然不再适合,因为有很多元器件Multisum都不包括,接着我开始学习Proteus仿真软件,最后利用Proteus画出了自己仿真图。最后密码锁设计成功。这次实验我动手能力得到很大的锻炼,受益匪浅,呼吁学校应该多开设类似课程,锻炼学生的能力。(十)附件:主要程序#include unsigned char ps5=1,2,3,4,5;/程序预先设定的密码 unsigned char code dispbit=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; /数码管显示位unsigned char code dispcode=0x3f,0x06,0x

7、5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71, 0x00,0x40,0x73,0xff; /每个数码管显示码 共阴极字形码unsigned char dispbuf8=18,16,16,16,16,16,16,16; /显示缓冲 unsigned char dispcount; /数码管显示计数unsigned char flashcount; /扫描次数计数unsigned char temp; unsigned char key; /按键(0 1 2 3 4 5 6 7 8 9 ENTER DEL

8、)unsigned char keycount1;/按键计数 unsigned char keycount2;/按键计数 unsigned char pslen=5; /密码位数unsigned char getps5;/键盘输入密码储存数组 bit keyoverflag; /键值溢出标志bit errorflag; /错误标志位bit rightflag; /正确标志位unsigned int second3;/声音unsigned int aa,bb; unsigned int cc,dd; bit okflag; /ok标志位bit alarmflag; /报警标志位unsigned

9、char oka,okb; void main(void) unsigned char i,j; TMOD=0x01;/to工作方式1 /重置定时500us TH0=(65536-500)/256; TL0=(65536-500)%256; TR0=1; /启动计数器0 ET0=1; EA=1; while(1) if(dd0;i-) for(j=248;j0;j-); /延时2.48ms temp=P3; temp=temp & 0x0f;/取出低4位 if (temp!=0x0f) /有按键按下 temp=P3; temp=temp & 0x0f;/取出低4位 switch(temp) c

10、ase 0x0e: key=1; break; case 0x0d: key=5; break; case 0x0b: key=9; break; case 0x07: key=12; break; temp=P3; if(key=0) & (key10) if(keycount15) getpskeycount1=key; keycount1+; if(keycount26) keycount2=6; keyoverflag=1;/key overflow 键值溢出 输入密码长度超过 else if(key=12)/delete key 删除键值 if(keycount10)&(keycou

11、nt20) keycount1-;keycount2-; getpskeycount1=0; /最近1次数入的数值清0 dispbufkeycount2+2=16; else keyoverflag=1; /未输入密码,按到功能键,报错!嘀一声。 else if(key=13)/clear 密码for(i=0;i6;i+)dispbufi+2=16; else if(key=14)/change ps 修改密码for(i=0;i5;i+)psi=getpsi;getpsi=0;keycount1=0;keycount2=0; else if(key=15)/enter key 进入键值 if(

12、keycount1!=pslen) errorflag=1; rightflag=0; second3=0; keycount1=0; keycount2=0; dd+; else for(i=0;i0;i-) for(j=248;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=2; break; case 0x0d: key=6; break; case 0x0b: key=0; break; case 0x07: key=13;

13、 break; temp=P3; if(key=0) & (key10) if(keycount15) getpskeycount1=key; keycount1+; if (keycount26) keycount2=6; keyoverflag=1;/key overflow 键值溢出 else if(key=12)/delete key 删除键值 if(keycount10)&(keycount20) keycount1-; keycount2-; getpskeycount1=0; dispbufkeycount2+2=16; else keyoverflag=1; else if(k

14、ey=13)/clear 密码for(i=0;i6;i+)dispbufi+2=16; else if(key=14)/change ps 修改密码for(i=0;i5;i+)psi=getpsi; getpsi=0; keycount1=0;keycount2=0; else if(key=15)/enter key 进入键值 if(keycount1!=pslen) errorflag=1; rightflag=0; second3=0; keycount1=0; keycount2=0; dd+; else for(i=0;i0;i-) for(j=248;j0;j-); temp=P3

15、; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=3; break; case 0x0d: key=7; break; case 0x0b: key=10; break; case 0x07: key=14; break; /开始处 temp=P3; if(key=0) & (key10) if(keycount15) getpskeycount1=key; keycount1+; if(keycount26) keycount2=6; keyoverflag=1

16、;/key overflow 键值溢出 else if(key=12)/delete key 删除键值 if(keycount10)&(keycount20) keycount1-; keycount2-; getpskeycount1=0; dispbufkeycount2+2=16; else keyoverflag=1; else if(key=13)/clear 密码for(i=0;i6;i+)dispbufi+2=16; else if(key=14)/change ps 修改密码for(i=0;i5;i+)psi=getpsi;getpsi=0;keycount1=0;keycou

17、nt2=0; else if(key=15)/enter key 进入键值 if(keycount1!=pslen) errorflag=1; rightflag=0; second3=0; keycount1=0; keycount2=0; dd+; else for(i=0;i0;i-) for(j=248;j0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=4; break; case 0x0d: key=8; break; ca

18、se 0x0b: key=11; break; case 0x07: key=15; break; temp=P3; if(key=0) & (key10) if(keycount15) getpskeycount1=key; keycount1+; if(keycount26) keycount2=6; keyoverflag=1;/key overflow 键值溢出 else if(key=12)/delete key 删除键值 if(keycount10)&(keycount20) keycount1-; keycount2-; getpskeycount1=0; dispbufkeyc

19、ount2+2=16; else keyoverflag=1; else if(key=13)/clear 密码for(i=0;i6;i+)dispbufi+2=16; else if(key=14)/change ps 修改密码for(i=0;i5;i+)psi=getpsi;getpsi=0;keycount1=0;keycount2=0; else if(key=15)/enter key if(keycount1!=pslen) errorflag=1; rightflag=0; second3=0; keycount1=0; keycount2=0; dd+; else for(i=

20、0;i5;i+) if(getpsi!=psi) i=keycount1; errorflag=1; rightflag=0; second3=0; keycount1=0; keycount2=0;dd+; goto a2; /开始处 errorflag=0; rightflag=1; keycount1=0; keycount2=0;a2: i=keycount1; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; keyoverflag=0;/? elsebb+; if(bb=8000) bb=0; P1_7=P

21、1_7; /定时器0中断服务程序void t0(void) interrupt 1 using 0 /重置定时500us TH0=(65536-500)/256; TL0=(65536-500)%256; flashcount+; if(flashcount=4)/扫描8次 数码管才显示第一个按下的密码 flashcount=0; P0=dispcodedispbufdispcount; P2=dispbitdispcount; /数码管显示密码 dispcount+; /数码管显示计数 if(dispcount=8) dispcount=0; if(errorflag=1) & (right

22、flag=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; /LED发光二极管闪 second3+; if(second3=6400) /闪4次后(8次变换),自动复位到按ENTER前的状态 second3=0; errorflag=0; rightflag=0; alarmflag=0; bb=0; aa=0; else if(errorflag=0) & (rightflag=1) /发出叮咚声 P1_0=0;/LED发光二极管亮 cc+;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!