电子密码锁的设计.doc_第1页
电子密码锁的设计.doc_第2页
电子密码锁的设计.doc_第3页
电子密码锁的设计.doc_第4页
电子密码锁的设计.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

结合51单片机设计电子密码锁【一】 实验目的电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁。其特点如下:1) 保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。2) 密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。3) 误码输入保护,当输入密码多次错误时,报警系统自动启动。4) 无活动零件,不会磨损,寿命长。5) 使用灵活性好,不像机械锁必须佩带钥匙才能开锁。6) 电子密码锁操作简单易行,一学即会。本次课程要求电子密码锁的设计是要求实验者具备了解和熟悉电子密码锁的功能和基本实现方法,具备一些电子时代操作人的基本素质。【二】实验原理本设计从实用的角度出发,采用单片机AT90C52RC作为主控芯片,AT24C02作为数据库存储单元,与外围的键盘输入、开锁、显示、报警等电路相结合,用C语言编写控制程序,设计的是一款不但具有报警功能而且能够多次更改密码的电子密码锁。本次设计使用的AT90C52RC芯片实现的基于单片机的电子密码锁的设计,其主要功能如下:(1) 使用数码管显示器来显示密码输入的相关消息及提示。(2) 设置5位数字(0-9)密码,密码通过3 x 4矩阵键盘输入,若密码正确,则将锁打开,初始化密码为(00000)。(3) 密码可以由用户自己修改设定(5位密码),锁打开后才能修改密码。再次输入密码,在输入新密码。(4) 密码输入正确则有相应的提示音,蜂鸣器会发出滴声响 。(5) 密码输入错误,数码管显示会出现错误提示,若密码输入3次错误,蜂鸣器报警并且自动锁定键盘。 (6) 密码输入功能:按下一个数字键,实现隐藏功能。(7) 密码清除功能:当清除键被按下时,清除前面输入的一个值,并可以清除所有示。(8) 断电后密码仍然存在(保存在24C02中)。【三】实施方案及本人承担的工作项目名称为电子密码锁,是利用单片机开发板数码管模块,键盘输入模块来实现。由于此次试验程序比较长,所以在开始编写程序的时候,我们计划一个模块一个模块编写,在开发板上一个一个实现之后再通过调用进主函数来完成,具体思路很清晰,但是具体实现就有点困难了。这次实验我主要负责的是键盘扫描和主程序的编写,说实话我的单片机学的并不是很好,但是这并不影响我设计键盘扫描和主程序的代码.键盘扫描要的就是找到相关联的那两根线,然后通过输出的端口进行判断到底代码应该是多少.然后进行编写就是不是件困难的事了.在原来显示驱动试验中做过相应的程序,所以模块写入的过程倒不是很难。主程序的代码由于是用c语言做的,因此在我们理解上而言还是通俗易懂的,我们比较吃力的地方也就是几个循环的位置商讨的较多,除此之外一切还是挺顺利的.还有在程序中扫描函数用的比较多,在扫描函数运用上分歧还是比较大,最后还是统一了。【四】程序框本系统共有两部分构成,即硬件部分与软件部分。其中硬件部分由键盘输入部分、密码存储部分、显示部分、开锁部分组成,软件部分对应的由主程序、初始化程序、键盘扫描程序、启动程序、关闭程序、密码设置程序等组成。具体原理框图如附录图所示。AT90C52键盘输入电源显示电路开锁电路【五】实验结果在keil软件上输入完成程序之后运行逻辑没有错误,然后将程序下载如开发板。完成之后,依次输入5个数字密码,由于程序中设有原始密码,输入后将与设定好的密码对比,若5个数字相同进入in界面,说明密码正确。若5个数字不与设定密码相同,系统返回help界面,说明密码不正确。 最后用户在3次内都没能输入正确的密码,则蜂鸣器长时间报警,结束之后开始60秒倒计时,在这一分钟之内用户不能在键盘上进行任何操作,直至60S结束才能重新进行操作。在输入密码的时候,输入的数字不显示,密码只有操作者自己知道。在一段时间确认没有键盘输入时,*键上锁或者一段时间后自动上锁,时间由确定的j的大小决定,自动上锁的时间不会很长。修改密码的时候,密码输入成功之后进入in界面之后才能修改。【六】设计中遇到的问题及解决方法这次密码锁设计遇到的最大的两个问题一个是错误三次锁死无法实现,一个是定时器功能无法实现。一个问题产生的主要原因是因为早期将键盘扫描程序mat_keyget()写在了错误是否小于3次的判断语句之前,导致即使错误3次仍然能执行键盘扫描,未能达到锁死键盘的效果。后来将mat_keyget ()写在了主程序判断错误语句的里面,这样一旦错满3次,自动跳到外面,脱离了键盘扫描,从而达到了锁死键盘的效果。 实习中还遇到了其他些许问题,如定时12s,使用户若未能在12s内输入完密码并且按下确认键,即使密码输入正确也会被判为无效,即错误一次。在实际操作过程中,t自加一次用时50ms,所以定时12s应为:50*20*12。而在实际操作过程中,由于晶振误差和操作误差,实际时间长于12s,因此最后将数值设为200,在循环内进行操作,减小了误差。【七】总结实践是检验真理的唯一标准,当然也是检验学习成果的标准。在经过一段时间的学习之后,我们需要了解自己的所学应该如何应用在实践中,因为任何知识都源于实践,归于实践,所以要将所学的知识在实践中来检验。从这次试验如果要一个人来做,我想也是做不了这么快的,因此我们不得不归功于集体的力量,分配合作对于这种近乎于模块化设计的东西来说是非常有利的,当然我们也碰到过问题,这在调试错误这一节中也说得很是明白了,但是我们也并没有灰心丧气,也是把问题一点一点地克服了下来.在这个之中我也是深切的感受到了理论知识的重要性,不能光是从手头上从硬件上找问题,我们也要从软的例如程序上或是设计思路上思考这样的解决方案是不是有较大的缺陷. 通过这个不难也不是很简单的实验我们认识到了团结协作,互帮互助的好处,这次课程设计也可以说是考完试后通过实践检验真理的一次宝贵机会,我们都为能够顺利完成本次实验感到无比的骄傲和自豪。附录:主要源程序以及原理实现框图程序代码:main.c#includereg52.h#includestring.h#includedisplay.h#includemat_keyget.h#include24c02.h#includestatus.hunsigned char digital_display=16,16,16,16,16,16,16,16;unsigned char e2prom_addr=0x00,0x01,0x02,0x03,0x04;unsigned char code cipher=2,2,3,4,5;unsigned char cipher_temp6,password5;unsigned char error_num=0;unsigned char code digital_lock=26,26,17,18,19,26,26,26; /-OUT-unsigned char code digital_open=26,26,20,21,22,23,26,26; /-OPEN-unsigned char code digital_help=26,26,20,22,25,21,26,26;/-HELP-unsigned char code digital_in=26,26,26,24,25,26,26,26 ;/-IN-void lock(void)/ 关锁unsigned char i;for(i=0;i8;i+)digital_displayi=digital_locki;buzzer_on();delay_500us(200);buzzer_off();void open(void)/开锁unsigned char i;for(i=0;i0)i-;digital_displayi=23;elseif(j=12); /#键无效elsecipher_tempi=j;digital_displayi=27;/隐藏密码i+;while(mat_keyget()!=10)digital_tube(digital_display);/松手检测digital_tube(digital_display);while(mat_keyget()!=12)digital_tube(digital_display); for(j=0;j5;j+)wrbyte_24c02(e2prom_addrj,cipher_tempj);for(j=0;j5;j+)passwordj=rdbyte_24c02(e2prom_addrj); /读取密码for(j=0;j8;j+) /显示成功界面digital_displayj=digital_inj;while(j0) i-; digital_displayi=23; elseif(j=12); /无效按键elsecipher_tempi=j;digital_displayi=27; /隐藏密码i+;while(mat_keyget()!=10)digital_tube(digital_display);digital_tube(digital_display);while(mat_keyget()!=12)digital_tube(digital_display);if(memcmp(cipher_temp,password,5)=0) /密码相同,开锁open();j=0;while(j500)if(mat_keyget()=11) /*键上锁digital_tube(digital_display);if(mat_keyget()=11)lock();break; /#键修改密码if(mat_keyget()=12)digital_tube(digital_display);if(mat_keyget()=12)while(mat_keyget()!=10)digital_tube(digital_display);cipher_change();break;digital_tube(digital_display); /界面显示j+; /一段时间后自动上锁lock();else /错误报警 for(j=0;j8;j+)/显示错误界面digital_displayj=digital_helpj;for(j=0;j250;j+)digital_tube(digital_display);lock();error_num+;if(error_num=3)/错误 超过三次长报警error_num=0;buzzer_on();for(j=0;j8;j+)digital_displayj=digital_helpj;for(j=0;j0) digital_display6=j/10;digital_display7=j%10;for(i=0;i150;i+) digital_tube(digital_display); j-;lock();void init(void)unsigned char i;for(i=0;i0;i-)for(j=110;j0;j-);void digital_tube(unsigned char display)unsigned char i; for(i=0;i8;i+)P2=digital_weii; /打开第i个COM口 P0=digital_duandisplayi; /送入显示数据delay_500us(1); #ifndef _DISPLAY_H#define _DISPLAY_H#include reg52.hvoid delay_500us(unsigned int nms);void digital_tube(unsigned char display);#endif蜂鸣器模块:#includestatus.hsbit buzzer=P37;void buzzer_off(void) /蜂鸣器打开buzzer=1;void buzzer_on(void)/蜂鸣器关闭buzzer=0;#includereg52.h#ifndef _STATUS_H#define _STATUS_Hvoidbuzzer_on(void);voidbuzzer_off(void);#endif24c02存储模块:#include 24c02.hvoid iic_start(void) SDA = 1; _nop_(); SCL = 1; somenop; SDA = 0; somenop; SCL = 0;void iic_stop(void) SDA = 0; _nop_(); SCL = 1; somenop; SDA = 1;void iic_ack(bit ackbit) if(ackbit) SDA = 0; else SDA = 1; somenop; SCL = 1; somenop; SCL = 0; SDA = 1; somenop;bit iic_waitack(void) SDA = 1; somenop; SCL = 1; somenop; if(SDA) SCL = 0;iic_stop();return 0; else SCL = 0;return 1; void iic_sendbyte(unsigned char byt) unsigned char i; for(i=0;i8;i+) if(byt&0x80) SDA = 1;else SDA = 0;somenop;SCL = 1;byt = 1;somenop; SCL = 0; unsigned char iic_recbyte(void) unsigned char da; unsigned char i; for(i=0;i8;i+) SCL = 1;somenop;da = 1;if(SDA) da |= 0x01;SCL = 0;somenop; return da;void wrbyte_24c02(unsigned char add,unsigned char dat) iic_start(); iic_sendbyte(0xa0); iic_waitack(); iic_sendbyte(add); iic_waitack(); iic_sendbyte(dat); iic_waitack(); iic_stop(); delay(10);unsigned char rdbyte_24c02(unsigned char add) unsigned char da; iic_start(); iic_sendbyte(0xa0

温馨提示

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

评论

0/150

提交评论