1、本科生学年论文(设计)(2011级)论文(设计)题目基于protues的电子密码锁设计 作 者姚晓强系 专业电气信息工程班 级 电子1102指导教师(职称)孙亚萍(讲师)字 数6280成果完成时间 2013-1226杭州师范大学钱江学院教学部制基于protues的电子密码锁设计电气信息专业1102班姚晓强 指导教师孙亚萍摘要:本文以AT89C51单片机为核心器件,结合按键电路、LED数码管显示电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的基本功能,其主要具有如下功能:密码通过键盘输入,若密码正确,则将锁打开密
2、码输入错误,蜂鸣器将报警提示用户可以自由设定密码本密码锁具有设计方法合理,简单易行成本低,安全实用等特点,具有一定的推广价值。关键词:AT89C51;电子密码锁;功能The design ofelectroniclockon the ProtuesYao XiaoqiangInstructor:Sun YapingAbstract: Based on the AT89C51 singlechip microcomputer as the core device, combining with the key circuit, LED digital tube display circuit,
3、an alarm circuit and unlocking mechanism, design the whole system to achieve the basic functions of electronic cipher lock by its flexible programming , rich I / O port, and accuracy basing on the software program 。 With the following functions :Input password through the keyboard, if the password i
4、s correct, lock will open If the password is error, the buzzer will alarm Users can freely set the password The lock has some features like a reasonable design methods,simple to work,low cost and security,it also has some promotion value.Key words: AT89C51 ; Electronic lock ; Function目录第一章引言11.1 研究背
5、景11.2 应用现状12。1 Protues软件概述22.2 Protues软件的功能和特点2第三章电子密码锁电路的设计23。1 电子密码锁的工作原理23.2系统的总体思路设计33.3主要元器件介绍33。3.1 AT89C51介绍33。3.2 LED数码管介绍53。3。3 LED矩阵键盘介绍6第四章电子密码锁的仿真分析64。1 Protues原理图设计64.1.1单片机主控制模块(含晶振、复位基本工作电路)74.1。2键盘输入模块74。1。3显示模块84。1。4报警模块和开锁模块94。2仿真效果总图10总结10参考文献10附录11基于protues的电子密码锁设计电子信息专业1102班姚晓强
6、指导教师孙亚萍第一章引言1。1研究背景电子线路的设计需要经过设计方案提出、方案验证和修改三个阶段,有时甚至需要经过多次的反复.传统的设计方法一般是采用搭接实验电路的方法进行,这种方法费时、费用高、效率低。随着计算机技术水平的不断提高,电子线路设计仿真软件迅速发展起来,EDA1(Electronic Design Automation 电子设计自动化)技术应运而起,功能日益强大,运行速度快,使得电子线路设计人员能在计算机上完成电路的功能设计、逻辑设计、性能分析等等。Protues软件是英国Labcenter electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,
7、还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具.虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。1。2应用现状现今常见的密码锁设计主要有两种方案,一种是中规模集成电路控制的方案,另一种是单片机控制的方案.对于采用集成电路控制的方案,其中的编码电子锁电路分为编码电路、控制电路、复位电路、解码电路、防盗报警电路、门铃电路,而电子锁主要由输入元件、电路(包括电源)以及锁体三部分组成。显然此种方案的物理实现结构较为复杂且重新设置密码、输入密码的操作过程也会给用户带来一定的不方便;而利用单片机控制的方案,由于单片机灵活的编程
8、设计和丰富的I/O端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加掉电存储、声光提示甚至添加遥控控制功能,但其也有一定的局限性,就在于其控制原理的复杂以及要求设计人员具有更加良好的程序设计能力,调试较为繁琐,否则程序一旦跑飞将造成意想不到的损失。通过对这两种方案的优缺点比较,再考虑到本人自己对单片机设计具有一定的基础,所以此次选择利用单片机来进行密码锁的设计。第二章Protues软件包介绍2。1Protues软件概述Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计.迄今为止是
9、世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型.在编译方面,它也支持IAR、Keil和MATLAB等多种编译.2。2 Protues软件的功能和特点Protues软件具有其它EDA工具软件(例:multisim)的功能。这些功能是:(1)原理布图(2)PCB自动或人工布线(3)SPICE电路仿真第三章 电子密码锁电路的设计3.1 电子密码锁的工作原理以A
10、T89C51单片机为主控制单元,键盘为主要输入单元,结合开锁装置、报警器和显示器完成整个系统设计。它的系统结构图如图。3.1所示:图。3.1系统结构图3。2系统的总体思路设计系统的运行过程大致如下:假设初始状态为闭锁,此时整个系统只等待按键输入,数码管也不显示。先按除号键修改密码,每按下一个数据键(即每输入一个密码),数码管相应的显示一个“”标志,当密码全部输入完成后,需按下确认键“ON/C”。设置密码后,先按“+”复位,然后输入密码,输入完毕后按下确认键“ON/C”,此时系统判断密码是否正确,正确则开锁(仿真中以数码管显示全8、绿色LED灯亮为标志),错误则报警,此后数码管熄灭继续等待按键.
11、3.3主要元器件介绍3。3.1AT89C51介绍AT89C51是一种带4K字节FLASH存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS51指令集和输出管脚相兼容.由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。图3.3。1。1AT89C
12、51封装图 图3。3.1。2 AT89C51引脚图AT89C51主要特性: 1。 与MCS-51 兼容2. 4K字节可编程FLASH存储器3. 寿命:1000写/擦循环4。 数据保留时间:10年5。 全静态工作:0Hz-24MHz6. 三级程序存储器锁定7. 1288位内部RAM832可编程I/O线9。 两个16位定时器/计数器105个中断源11可编程串行通道12. 低功耗的闲置和掉电模式13. 片内振荡器和时钟电路AT89C51单片机引脚: VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入
13、。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收. P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1时,其管脚被内部上拉电阻拉高,且作为输入。并因此作
14、为输入时,P2口的管脚被外部拉低,将输出电流.这是由于内部上拉的缘故.P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流.当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故. P3口也可作为AT89C51的一些特殊功能口,如
15、下表所示: 口管脚 备选功能 P3.0 RXD(串行输入口) P3。1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3。3 /INT1(外部中断1) P3。4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3。6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制信号. RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节.在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以
16、不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6.因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0.此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用.另外,该引脚被略微拉高.如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000HFFFFH)
17、,不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP). XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 振荡器特性: XTAL1和XTAL2分别为反向放大器的输入和输出.该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用.如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度.3。3。2 LED数码管介绍
18、图3。3。2数码管LED数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。当数码管特定的段加上电压后,这些特定段就会发亮,以形成我们眼睛看到的样子。 以“2”为例,应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮.LED数码管有一般亮和超亮等不同之分,也有0。5寸、1寸等不同的尺寸.小尺寸数码管的显示笔画常用一个发光二极管组成,而大尺寸的数码管由二个或多个发光二极管组成,一般情况下,单个发光二极管的管压降为1.8V左右,电流不超过30mA。发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接
19、到电源负极的称为共阴数码管。常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。3。3.3 LED矩阵键盘介绍在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成44=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。矩阵式结构的键盘显然比直
20、接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入.这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。本设计采用Protues库中KEYPADSMALLCALC作为键盘。第四章 电子密码锁的仿真分析4。1 Protues原理图设计4。1。1单片机主控制模块(含晶振、复位基本工作电路)图4。1.1主控制模块4。1。2键盘输入模块本设计中采用Protues库中KEYPADSMALLCALC作为键盘,与
21、AT89C51的P3口相连,提供按键输入,如图4。1.2:图4.1.2 键盘输入模块按键键名功能说明19键数字键输入密码键重设密码键设定新密码+键复位键密码全部一次删除=键密码删除键一次删除一位密码ON/C键确定键确认密码输入完毕表4。1.2按键功能4.1。3显示模块图4.1.3显示模块此设计中,使用了四个共阳极数码管,使用动态显示技术控制数码管。其6个位选信号与P2.0P2。5相连,当其中某位为低电平时表示选中该位;8段段选信号与P0口相连,当其中某段为高电平时导通该段,特殊的,由于AT89C51的P0口的驱动能力较弱,不足以驱动数码管点亮,故在此又引入上拉电阻以驱动数码管.关于上拉电阻有如
22、下介绍:1、当TTL电路驱动CMOS电路时,如果电路输出的高电平低于CMOS电路的最低高电平(一般为3。5V), 这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。 2、OC门电路必须加上拉电阻,以提高输出的高电平值。3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。4、在CMOS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗, 提供泄荷通路.5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。6、提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰 .7、长线传输中电阻不匹配容易引起反射波干
23、扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。4.1。4报警模块和开锁模块图4。1。4报警和开锁模块4.2仿真效果总图图4.2输入正确密码时仿真效果总图总结通过上述设计电路的仿真分析,不难发现使用单片机制作的电子密码锁具有软硬件设计简单,易于开发,成本较低,安全可靠,操作方便等特点.正是由于单片机的众多优良特性的吸引,最终从经济实用的角度出发,采用单片机AT89C51作为主控芯片,结合外围的键盘输入、显示、报警、开锁等电路,用C语言编写主控芯片的控制程序,设计了一款可以多次更改密码具有报警功能的电子密码锁。参考文献1于殿泓,王新年。单片机原理与程序设计实验教程M.西安电子科技大学出版社,2
24、007。127-151页。2赵文博,刘文涛。单片机语言C51程序设计M人民邮电出版社,2005。258-294页。附录includeat89x51.h#define uchar unsigned chardefine uint unsigned intuint num=10;/开始让数码管什么都显示bit set=0;/定义设置密码的位char count=1;/开始让COUNT=1,方便后面显示数码管sbit Beep=P12; /蜂鸣器uchar temp;uchar pws6=8,8,8,8,8,8;/原始密码uchar pwx6;/按下的数字存储区bit rightflag;/密码正确
25、标志位uchar workbuf6;uchar code tabledu=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40;/段选码,共阴极uchar code tablewe=0xfe,0xfd,0xfb,0xf7,0xef,0xdf;/位选码uint keyscan();void delay(uchar z)/延时,ms级uchar y;for(;z0;z)for(y=120;y0;y-);void setpw()/设置密码函数keyscan();uint keyscan()/键盘扫描函数P3=0xfe;temp=P3;
26、temp=temp0xf0;if(temp!=0xf0)delay(5);/键盘去抖,最好20ms以上,这里用了5mstemp=P3;temp=temp0xf0;if(temp!=0xf0)count+;/按键计数加1temp=P3;switch(temp)case 0xee: num=7;if(count6)/六位密码,所以COUNT6if(set=0)/设置密码键没有按下时pwxcount=num; /存储按下的数字elsepwscount=num; /设置密码键按下时,设置新密码workbufcount=tabledu11; /相应位的数码管显示”,不显示相应的数字,密码是保密的brea
27、k;case 0xde: num=8;if(count6)/以下扫描键盘的原理差不多同上if(set=0)pwxcount=num;elsepwscount=num;workbufcount=tabledu11;break;case 0xbe: num=9;if(count6)if(set=0)pwxcount=num;elsepwscount=num;workbufcount=tabledu11; break;case 0x7e:/设置密码键按下set=1;/设置密码标志位置1P1_3=0;/设置密码指示灯亮workbuf0=0x00;/数码管第一位不显示workbuf1=0x00;/.。.
28、。.workbuf2=0x00;/。.workbuf3=0x00;workbuf4=0x00;workbuf5=0x00;/。count=1;/按键计数复位为1if(count6)/密码没有设置完,继续设置密码setpw();/设置密码break;while(temp!=0xf0) /按键抬起检测temp=P3;temp=temp&0xf0;P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0)delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0)count+;temp=P3;switch(temp)case 0xed:
29、 num=4;if(count6)if(set=0)pwxcount=num;elsepwscount=num;workbufcount=tabledu11;break;case 0xdd: num=5;if(count6)if(set=0)pwxcount=num;elsepwscount=num;workbufcount=tabledu11;break;case 0xbd:num=6;if(count6)if(set=0)pwxcount=num;elsepwscount=num;workbufcount=tabledu11;break;while(temp!=0xf0)temp=P3;t
30、emp=temp0xf0;P3=0xfb;temp=P3;temp=temp0xf0;if(temp!=0xf0)delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0)count+;temp=P3;switch(temp)case 0xeb: num=1;if(count6)if(set=0)pwxcount=num;elsepwscount=num;workbufcount=tabledu11;break;case 0xdb: num=2;if(count6)if(set=0)pwxcount=num;elsepwscount=num;workbufco
31、unt=tabledu11;break;case 0xbb: num=3;if(count6)if(set=0)pwxcount=num;elsepwscount=num;workbufcount=tabledu11;break;while(temp!=0xf0)temp=P3;temp=temp0xf0;P3=0xf7;temp=P3;temp=temp0xf0;if(temp!=0xf0)delay(5);temp=P3;temp=temp0xf0;if(temp!=0xf0)count+;temp=P3;switch(temp)case 0xd7:num=0;if(count6)if(s
32、et=0)pwxcount=num;elsepwscount=num;workbufcount=tabledu11;break;case 0xe7: num=20;break;/确定键按下检测case 0x77: /复位键或者输入密码全部一次删除P1_1=0;/锁关P1_3=1;/密码设置指示灯灭set=0;/不设置密码num=10;/num复位count=1;/COUNT复位workbuf0=tabledu10;/第一位数码管不显示workbuf1=tabledu10;/第二位数码管不显示workbuf2=tabledu10;workbuf3=tabledu10;workbuf4=table
33、du10;workbuf5=tabledu10;/。P1_0=1;/锁关break;case 0xb7:/输入密码删除键(一位一位删除)count-;workbufcount=0x00;/因确定键按下时,COUNT也会加1,而确定键不是密码,所以这里是COUNT,而不是COUNT+1count;/因确定键按下时,确定键不是密码,COUNT也会加1,这里COUNT再自减1if(count=1)count=1;break;while(temp!=0xf0)temp=P3;temp=temp0xf0;return(num);void init()/利用定时显示数码管TMOD=0x01;TH0=(65
34、536500)/200;TL0=(65536500)%200;ET0=1;EA=1;TR0=1;bit compare()/密码比较函数if((pwx0=pws0)(pwx1=pws1)(pwx2=pws2)(pwx3=pws3)(pwx4=pws4)(pwx5=pws5)) rightflag=1;elserightflag=0;return(rightflag);void main()uint i,j;init();P0=0;P1_1=0;/锁关while(1)keyscan();if(num=20)/如果确定键按下(修改密码和输入密码共用的确定键)if(count=6)if(set=1)
35、/修改密码确定P1_3=1;workbuf0=0;workbuf1=0;workbuf2=0;workbuf3=0;workbuf4=0;workbuf5=0;else/输入密码确定set=0;compare();if(rightflag=1)/如果密码正确P1_0=0;/锁开P1_1=1;workbuf0=tabledu8;/数码管第一位显示”8”workbuf1=tabledu8;/数码管第二位显示”8”workbuf2=tabledu8;workbuf3=tabledu8;workbuf4=tabledu8;workbuf5=tabledu8;/。.。elseP1_1=0;/锁仍然是关w
36、orkbuf0=0X71;/数码管第一位显示”F”workbuf1=0X71;workbuf2=0X71;workbuf3=0X71;workbuf4=0X71;workbuf5=0X71;/。.。for(i=0;i1000;i+)/密码错误报警for(j=0;j80;j+);Beep=Beep;break;else /若输入的密码位数不为6位时P1_1=0;/锁仍然关workbuf0=0X71;/数码管第一位显示”F”workbuf1=0X71;workbuf2=0X71;workbuf3=0X71;workbuf4=0X71;workbuf5=0X71;for(i=0;i1000;i+)for(j=0;j80;j+);Beep=Beep;break; void timer0() interrupt 1/显示数码管uchar i;TH0=(65536500)/200;TL0=(65536500)%200;for(i=0;i6;i+)P0=workbufi;P2=tablewei;delay(5);P0=0;18