资源描述
实训设计报告:电子数码锁一、 课题名称: 电子数码锁 二、 课题功能描述: 随着电子技术的发展,具有防盗报警等功能的电子密码锁代替密码量少、安全性差的机械式密码锁已是必然趋势。电子密码锁与普通机械锁相比,具有许多独特的优点:保密性好,防盗性强,可以不用钥匙,记住密码即可开锁等。电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁,其特点如下:1保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。2密码可变。 用户可以经常更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。3误码输入保护。当输入密码多次错误时,报警系统自动启动。4. 电子密码锁操作简单易行。三、 电路原理: 1. 电原理图2. 电路各单元原理说明、理论计算结果1. AT89C51引脚图2. AT89C51引脚功能介绍 单片机芯片AT89C51为40引脚双列直插式封装。其各个引脚功能介绍如下:(1) VCC:供电电压;(2) GND:接地;(3) P0口P0口为一个8位漏级开路双向I/O口,每个管脚可吸收8TTL门电流。当P1口的管脚写”1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。(5) P2口P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写”1”时,其管脚电位被内部上拉电阻拉高,且作为输入。作为输入时,P2口的管脚电位被外部拉低,将输出电流,这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址”1”时,它利用内部上拉的优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。(6) P3口P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入”1”后,它们被内部上拉为高电平,并用作输入。作为输入时,由于外部下拉为低电平,P3口将输出电流(ILL)。(7) RST:复位输入端。当振荡器复位时,要保持RST脚两个机器周期的高电平时间。(8) ALE / PROG当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。(9) PSEN外部程序存储器的选通信号。在由外部程序存储器取址期间,每个机器周期PSEN两次有效。但在访问外部数据存储器时,这两次有效的PSEN信号将不出现。(10) EA/VPP当EA保持低电平时,访问外部ROM;注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,访问内部ROM。(11) XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。(12) XTAL2:来自反向振荡器的输出。3. 复位电路复位电路采用手动复位与上电复位相结合的方式。当按下按键时,VCC通过R2阻给复位输入端口一个高电平,实现复位功能,即手动复位。上电复位就是VCC和电容C构成回路,该回路是一个对电容C充电和放电的电路,所以复位端口得到一个周期性变化的电压值,并且有一定时间的电压值高于CPU复位电压,实现上电复位功能。4. 晶振电路XTAL1(X1)为反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2(X2)是来自反向振荡器的输出。按照理论上AT89C51使用的是12MHz的晶振,但实测使用11.0592MHz。所以设计者通常用的是11.0592MHz。5. 七段数码管数码管使用条件:a、段及小数点上加限流电阻b、使用电压:段:根据发光颜色决定;小数点:根据发光颜色决定c、使用电流:静态:总电流80mA(每段10mA);动态:平均电流4-5mA峰值电流100mA上面这个只是七段数码管引脚图,其中共阳极数码管引脚图和共阴极的是一样的。数码管使用注意事项说明:()数码管表面不要用手触摸,不要用手去弄引角;()焊接温度:度;焊接时间:()表面有保护膜的产品,可以在使用前撕下来。这类数码管可以分为共阳极与共阴极两种,共阳极就是把所有LED的阳极连接到共同接点com,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点);共阴极则是把所有LED的阴极连接到共同接点com,而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点),如下图所示。图中的8个LED分别与上面那个图中的ADP各段相对应,通过控制各个LED的亮灭来显示数字。那么,实际的数码管的引脚是怎样排列的呢?对于单个数码管来说,从它的正面看进去,左下角那个脚为1脚,以逆时针方向依次为110脚,左上角那个脚便是10脚了,上面两个图中的数字分别与这10个管脚一一对应。注意,3脚和8脚是连通的,这两个都是公共脚。还有一种比较常用的是四位数码管,内部的4个数码管共用adp这8根数据线,为人们的使用提供了方便,因为里面有4个数码管,所以它有4个公共端,加上adp,共有12个引脚,下面便是一个共阴的四位数码管的内部结构图(共阳的与之相反)。引脚排列依然是从左下角的那个脚(1脚)开始,以逆时针方向依次为112脚,下图中的数字与之一一对应。3. 电路仿真结果与数据 (单片机仿真电路截图、仿真结果截图) 单片机仿真电路使用的程序初始密码001输入显示密码正确,七段数码管显示YES,绿灯亮输入错误密码200密码错误,七段数码管显示no,错误次数为14. 软件框图、主程序流程图、关键子程序代码说明图一:软件框图图二:主程序流程图关键子程序代码说明charge():比较密码choose():检测S11键,对值+1Delay_1ms(uchar i):1ms延子程序void display(m,n):/显示子函数,m为显示的字数,n为相应显示的位选信号void end():/密码错三次的状态void give():/赋予相应的比较密码值void shaomiao(): /比较密码时按位显示功能void Time0_Init(): /计数器0的初值void Time0_Int() interrupt 1:/设定中断产生时的状态void weixuan(): /检测S21按下,对原密码值位选择void xchoose() /检测S11键,检测到S11按下,对于修改密码的数+1;void xgive()/赋予相应修改后的密码值void xshaomiao()/比较密码修改后按位显示功能void xweixuan()/检测S21按下,对修改密码值位选择四、 电路调试与测试数据1. 调试过程 发生问题及其解决1) 延时时间分配问题;解决:经过不断地计算、调试和实验验证得到了一个准确的延时时间分配。2) 状态跳转问题;解决:通过翻阅C语言教程和资料,以及在网络上不断地查找相关案例和程序语言,得到了一个相对理想的语言组合。3) 数组赋值问题(当程序已成功的在硬件上成功实现的情况下,发现七段数码管在仿真中因为是动态扫描,会产生以确定数值显示的数会跟随之后的其他数码管显示的数进行变化);解决:在通过对数码管的动态扫描时间进行修改范围从20us至20s,但发现不能解决;后来在经过老师的回答后了解了锁存器的作用,对于代码进行了修改。4) 检测问题;解决:首先通过肉眼进行检查对于电路板上硬件的焊接处是否存在虚焊和假焊,其次通过对万用表的使用以确定电子元器件性能和功能上可靠性。2. 参数测试记录 l 9012放大器参数9012 结构:PNP集电极-发射极电压 -30V集电极-基电压-40V射极-基极电压 -5V集电极电流 0.5A耗散功率0.625W结温150特怔频率 最小 150MHZ放大倍数:D64-91 E78-112 F96-135 G122-166 H144-220 I190-300l 七段数码管位选通信号数码管动态扫描显示,是将所用数码管的相同段(ag和p)并联在一起,通过选位通信号分时控制各个数码管的公共端,循环依次点亮各个数码管。当切换速度足够快时,由于人眼的“视觉暂留”现象,LED灯会被全部点亮。图5-4 位选信号时序波形图 数码管选通控制信号分别对应3个数码管的公共端,当某一位选通控制信号为高电平时,其对应的数码管被点亮,因此通过控制选通信号就可以控制数码管循环依次点亮。一个数码管稳定显示要求的切换频率要大于50Hz,那么3个数码管则需要503150Hz以上的切换频率才能看到不闪烁并且持续稳定显示的字符。五、 实验结论及改进方案1. 实验结论我们组的电子密码锁实验是基于89C51芯片内的比较器模块以及RAM存储器的功能上实现的。我们将初始密码001放入RAM,将其与输入密码进行比较,相同电子锁打开,不同电子锁不打开。2. 改进方案因原始方案中没有设计结果显示,以至于输入密码后不易判断电子锁是否开启。因此,我们在设计中加入了密码反馈的内容。在输入密码正确时,绿灯亮,七段数码管显示出YES的字样;错误时,红灯亮,七段数码管显示NO的字样,蜂鸣器发出警报。六、 实验收获与体会我们专业上学期开设了单片机课程,对单片机这门课程有了初步的了解,这次的单片机课程设计短学期给了我们进一步了解并掌握单片机的机会,我们都感到非常的兴奋。学习的过程中,帮助最大之一无疑是来自网络。很多时候,通过网络,我们都可以获取到所需要的学习资料。但是,随着我们学习的深入,我们会发现,网络提供的东西是有限度的,好像大部分的资料都差不多,或者说是适合大部分的初学者所需,而当我们想进一步提高时,却发现能够获取到的资料越来越少,单片机资料中大部分不好使流水灯就是LED,液晶,而且只是功能性的演示。因此,我们小组四人都非常珍惜这次的单片机设计短学期,因为小组我们四人都对单片机的学习产生了浓厚的兴趣,认为单片机对自己在电子技术方面的学习有很大的帮助。虽然这次短学期只有短短的两周的时间,但是我想只要我们小组用心学习,认真准备,共同探讨,齐心协力,一定会有所收获,希望老师也能对我们有所期待。以下是对这次单片机学习的总结:(1) 学习单片机没有捷径,不能指望两三天就学会,要坚持不懈,重在积累。(2) 单片机是一门应用性和实践性很强的学科,要多动手,多做实验。(3) 要学会参考别人的程序,减少自己琢磨的时间,迅速提高自己的编程能力。(4) 碰到问题可以借助网络来搜寻答案和对自己有帮助的问题,一定会有所收获。(5) 小组要团结,小组之间要多交流。技术是靠不断的积累和交流才会进步的,封闭自守只会更加落后。致谢:感谢黄老师和余老师的细心指导附录1. 参考资料1 陈梓城实用电子电路设计与调试 ;中国电力出版社20062 高吉祥全国大学生电子设计大赛培训教程 ;电子工业出版社2007.53 阎石 数字电子技术基础(第四版) ;高等教育出版社;19984 高吉祥 模拟电子技术基础(第四版) ;电子工业出版社出版社;20072. 程序代码 (要有注释)#include #include#define uint unsigned int#define uchar unsigned charuchar code table = 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;sbit S11 = P24; /选数字键sbit S21 = P25; /位选键sbit RED = P10; /红灯sbit LED = P16; /绿灯键sbit Bell = P17; /蜂鸣器uchar a=0; /类似汇编语言中的A寄存器功能uchar c=0; /设定双键按下时的延时时间c=5秒;uchar enter=0; /设定信号wronguchar V1,V2,V3; /输入的密码uchar W1=0,W2=0,W3=1; /默认密码uchar wrong=0; /设定信号wronguchar right=0; /设定信号rightuchar keyi=0; /设定信号keyiuint l=0; /设定延时循环值luint h=0; /设定延时循环值huint Count=0; /设定void Time0_Init() /计数器0的初值TMOD = 0x01; /设定计数器0工作方式1TH0 = 0x4c; /TH=0x4c00;TL0 = 0x00;IE = 0x82; /设定中断,EA=1;时钟中断TR0 = 1; /开启计数器0void Time0_Int() interrupt 1/设定中断产生时的状态TH0 = 0x4c; TL0 = 0x00; /TH值重新载入Count+; /没计完一次载入,Count加一if(Count=20)Count=0;c+; /长度加1void Delay_1ms(uchar i) /1ms延时函数uchar x,j;for(j=0;ji;j+)for(x=0;x=148;x+);void display(m,n) /显示子函数 P0=0xFF;P2=0xFF;P0=tablem; P2=n;Delay_1ms(5);void choose() /检测S11键,检测到S11按下,变数 P2=0xF7;if(!S11 & S21) Delay_1ms(20); P2=0xF7; if(!S11 & S21) Delay_1ms(20); P2=0xF7; if(!S11 & S21) Delay_1ms(20); a+; if(a=10) a=0; Delay_1ms(200); void xchoose() /检测S11键,检测到S11按下,变数 P2=0xF7;if(!S11) Delay_1ms(20); P2=0xF7; if(!S11) Delay_1ms(20); P2=0xF7; if(!S11) Delay_1ms(20); a+; if(a=10) a=0; Delay_1ms(200); void weixuan() /检测S21,对原密码值位比较 P2=0xF7;if(!S21 & S11) Delay_1ms(20); P2=0xF7; if(!S21 & S11) Delay_1ms(20); P2=0xF7; if(!S21 & S11) Delay_1ms(20); enter+;keyi=1; Delay_1ms(200); void xweixuan()/修改值位检测 P2=0xF7;if(!S21) Delay_1ms(20); P2=0xF7; if(!S21) Delay_1ms(20); P2=0xF7; if(!S21) Delay_1ms(20); enter+;keyi=1; Delay_1ms(200); void give()/赋予相应的值 if(enter=1 & keyi=1) V1=a;keyi=0;a=0; if(enter=2 & keyi=1) V2=a;keyi=0;a=0; if(enter=3 & keyi=1) V3=a;keyi=0;a=0;void xgive()/赋予相应的密码 if(enter=1 & keyi=1) W1=a;keyi=0;a=0; if(enter=2 & keyi=1) W2=a;keyi=0;a=0; if(enter=3 & keyi=1) W3=a;keyi=0;a=0;void shaomiao() /显示功能 if(enter=0) display(a,0xFE); if(enter=1) display(V1,0xFE); display(a,0xFD); if(enter=2) display(V1,0xFE); display(V2,0xFD); display(a,0xBF); if(enter=3) display(V1,0xFE); display(V2,0xFD); display(V3,0xBF); void xshaomiao()/显示 if(enter=0) display(a,0xFE); if(enter=1) display(W1,0xFE); display(a,0xFD); if(enter=2) display(W1,0xFE); display(W2,0xFD); display(a,0xBF); if(enter=3) display(W1,0xFE); display(W2,0xFD); display(W3,0xBF); void end()/密码错三次的状态 while(1) P2=0xBC; P1=0xF0; P0=0xBF; void charge()/比较密码 if(enter=4) if(V1=W1 & V2=W2 & V3=W3) right=1; a=0;wrong=0; while(l100) P0=0x91; P2=0xFE; Delay_1ms(4); P0=0x86; P2=0xFD; Delay_1ms(4); P0=0x92; P2=0xBF; Delay_1ms(4); l+; l=0; while(l1000) Delay_1ms(3); l+; LED=0; P2=0xFF; l=0; LED=1; else right=0;wrong+; while(l100) P0=0xC8; P2=0xFE; Delay_1ms(5); P0=0xC0; P2=0xFD; Delay_1ms(5); P0=tablewrong; P2=0xBF; Delay_1ms(5); l+; RED=0;P2=0xFF; l=0; while(l1000) Bell=!Bell ;Delay_1ms(3);l+; l=0;RED=1; if(wrong=3) end(); enter=0; void main()start:while(1) choose(); weixuan(); give(); shaomiao(); charge(); if(right=1) /修改密码键检测 P2=0xF7; if(!S21 & !S11) Delay_1ms(20);P2=0xF7; if(!S21 & !S11) Delay_1ms(20); P2=0xF7; if(!S21 & !S11) Delay_1ms(200); Time0_Init(); if(c=5) Delay_1ms(20); P2=0xF7; if(!S21 & !S11) c=0;TR0=0;P2=0xFF;P0=0xFF;goto next; next:while(1) /进入修改界面 P2=0xF7; while(!S21 & !S11) Delay_1ms(20); P2=0xF7; while(!S21 & !S11) a=0;enter=0; Delay_1ms(200); while(l3) while(h100) P0=0xC6; P2=0xFE; Delay_1ms(5); P0=0xF0; P2=0xFD; Delay_1ms(5);h+; h=0; while(h100) P0=0xC6; P2=0xFE; Delay_1ms(5); P0=0xF0; P2=0xBF; Delay_1ms(5);h+; h=0; l+; l=0; xchoose(); xweixuan(); xgive(); xshaomiao(); if(enter=4) right=0;a=0;enter=0;goto start; /输完密码,结束,进入密码输入界面 22 / 22
展开阅读全文