毕业设计(论文)基于单片机的电子密码锁的设计.doc
本科生毕业设计基于单片机的电子密码锁A Electron Cipher Lock Based on MCU学生姓名xxx所在专业电子信息工程所在班级电子1033班申请学位工学学士指导教师xxxx职称讲师副指导教师职称答辩时间2007年 06 月 8 日目 录设计总说明IDESIGN INTRODUCTIONIII第1章 绪论11.1背景11.2电子锁11.3电子密码锁的特点11.4电子密码锁的发展趋势2第2章 系统总体设计32.1系统结构32.2 系统组成32.3 系统可行性分析3第3章 硬件电路设计53.1单片机AT89C51简介5 3.1.1 主要特性5 3.1.2 管脚说明5 3.1.3 震荡特性7 3.1.4 芯片擦除73.2 4×4矩阵键盘73.3复位电路83.4 振荡电路83.5 数码管93.6 发光二极管LED103.7 电动锁103.8 蜂鸣器113.9 完整电路图12第4章 软件程序设计144.1软件设计流程图154.2 具体功能软件实施16第5章 结束语及展望21第6章 鸣谢22第7章 参考文献23附 录22设计总说明在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。加上其成本较高,一定程度上限制了这类产品的普及和推广。鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。基于以上思路,本次设计使用ATMEL公司的AT89C51实现一基于单片机的电子密码锁的设计,其主要具有如下功能:(1) 设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。(2) 密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。(3) 报警、锁定键盘功能。密码输入错误数码显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。电子密码锁的设计主要由三部分组成:4×4矩阵键盘接口电路、密码锁的控制电路、输出八段显示电路。另外系统还有LED提示灯,报警蜂鸣器等。密码锁设计的关键问题是实现密码的输入、清楚、更改、开锁等功能:(1) 密码输入功能:按下一个数字键,一个“”就显示在最右边的数码管上,同时将先前输入的所有“”向左移动一位。(2) 密码清除功能:当按下清除键时,清除前面输入的所有值,并清除所有显示。(3) 密码更改功能:将输入的值作为新的密码。(4) 开锁功能:当按下开锁键,系统将输入与密码进行检查核对,如果正确锁打开,否则不打开。主要的设计实施过程:首先,选用ATMEL公司的单片机AT89C51,以及选购其他电子元器件。第二步,使用DXP 2004设计硬件电路原理图,并设计PCB图完成人工布线(后因PCB板损坏决定采用万能板焊接的方法)。第三步,使用Keil uVision3软件编写单片机的C语言程序、仿真、软件调试。第四部,使用PROTEUS软件进行模拟软、硬件调试。最后,联合软、硬件调试电路板,完成本次毕业设计。关键词:4×4矩阵键盘;AT89C51;密码锁;密码二次确基于单片机的电子密码锁电子信息工程,xxxxx,xxxx指导教师:xxxxx第1章 绪论1.1 背景随着社会物质财富的日益增长,安全防盗已成为社会问题。而锁自古以来就是把守门户的铁将军,人们对它要求甚高,既要安全可靠地防盗,又要使用方便,这也是制锁者长期以来研制的主题。目前国内,大部分人使用的还是传统的机械锁。然而,眼下假冒伪劣的机械锁泛滥成灾,互开率非常之高。所谓互开率,是各种锁具的一个技术质量标准,也就是1把钥匙能开几把锁的比率。经国家工商局、国家内贸局、中国消协等部门对锁具市场的调查,发现个别产品的互开率居然超标26倍。为何弹子锁的“互开率”会如此之高?据有关专家人士剖析,弹子锁质量好坏主要取决于弹子数量的多少以及弹子的大小,而弹子的多少和大小受一定条件的限制。此外,即使是一把质量过关的机械锁,通过急开锁,甚至可以在不损坏锁的前提下将锁打开。机械锁的这些弊端为一种新型的锁-电子密码锁,提供了发展的空间。1.2 电子锁电子锁是采取电子电路控制,以电磁铁或者卫星电机和锁体作为执行装置的机电一体化锁具,相比传统的机械锁具,电子锁不使用金属钥匙,保密性、精度都有很大提高。 电子锁的发明思路,源自古代发明的自动机械,例如古希腊数学家赫伦的液压自动门,中国古代诸葛亮的木牛流马,它们以重力或蒸汽压力驱动,最广泛的用途乃是用在古代墓道的地下机关。电子工业的诞生,使得以微小电量驱动机械成为可能,于是有了电子锁一日千里的跃进。1.3 电子密码锁的特点电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁,主要特点如下:1 保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。2 密码可变。 用户可以经常更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。3 误码输入保护。当输入密码多次错误时,报警系统自动启动,防止试探密码。1.4 电子密码锁的发展趋势从目前的技术水平和市场认可程度看,使用最为广泛的是键盘式电子密码锁,该产品主要应用于保险箱、保险柜和金库,还有一部分应用于保管箱和运钞车。键盘式电子密码在键盘上输入,与打电话差不多,因而易于掌握,其突出优点是“密码”是记在被授权人脑子里的数字和字符,既准确又可靠,不会丢失(除了忘记),难以被窃(除非自己泄露)。但是密码不能太简单,太简单了就容易被他人在键盘上试探出来,或者可能被旁观者窥测出来,造成保密性不足。当然,密码又不能太复杂,太复杂了可能自己都糊涂了,或者输入密码操作成功率低,造成使用不便。因此,为了发扬优点、克服弱点,键盘式电子密码也在不断发展中,如“任意设定密码”技术使得被授权人可以根据自己的需要或喜好设定密码,常用常新;而“自动更改密码”技术使得本次输入的密码将自动更改成下次应输入的密码,更改的规律不为他人所知,因而不怕旁观者窥测;独出心裁的“键盘乱序显示”技术使得键盘上的固定键位每次显示出的字符不固定,并且显示的窄小角度只能由操作者正面看得到,因而即使旁观者看见操作动作也难以窥测出密码;“多重密码设定”技术使得单组密码不一定有效,适合多人分权使用,需要输入两组以上的密码才被认可,大大提高了保密性,如果限定输入这些密码的先后顺序或时间区段,则保密性还可提高。在输入密码的过程中,为了限制试探密码的企图,通常输入错误码若干次或若干时间内输入不正确,即“封锁”键盘,不再接受输入操作。总之,尽管新式电子防盗锁层出不穷,但键盘式电子密码防盗锁不仅在市场上居于主流地位,而且,还经常作为其他类型电子防盗锁的辅助输入手段。第2章 系统总体设计2.1 系统结构电源 AT89C51数码管蜂鸣器LED4×4键盘复位电路图212.2 系统组成如图21所示系统主要由AT89C51(51系列)、八位数码管、蜂鸣器、LED、4×4矩阵键盘、复位电路等组成。2.3 系统可行性分析系统工作原理分析:使用AT59C51单片机、4×4矩阵键盘、LED、蜂鸣器等。矩阵键盘分别为0、1、2、3、4、5、6、7、8、9、*、CLE、Enter、MODIFY。系统开始显示“INPUT”提示输入密码;输入密码时,LED显示电路显示为“-”,当密码输入完毕按下Enter键时,对输入密码与设定的密码进行比较,若密码正确则LED显示电路显示为“PASS”提示锁打开;若密码不正确,LED显示电路显示提示“ERROR”,若连续3次输入不正确,则发出警报声同时锁定键盘。在输入正确密码后,按下修改键时,LED显示电路显示“old”提示“输入旧密码”,此时输入正确的旧密码,则显示电路会有提示输入新密码在输入新密码后,显示电路会再次提示“再次输入新密码”若两次输入密码不一致,则修改密码失败,一致则成功。在修改密码的过程中,如果一开始输入的旧密码错误显示电路会显示提示,同时系统返回到开始。若在“再次输入新密码”的时候输入新密码与前次不一致,则会返回到系统开始。修改密码完成后,系统自动清零上锁。要再次开锁则需要输入正确的密码。 系统中CEL键用于退格,在输入密码时,若输入错误且未按下Enter键,按下CLE可以删除刚输入的密码,然后再次输入。 为了防止恶意尝试,系统才用若连续输入3次错误密码则发出报警声,且锁定键盘,可以提高系统的安全系数,同时也能够保护合法用户的正常使用。第3章 硬件电路设计3.1 单片机AT89C51简介AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4K bytes的可反复擦写的只读程序存储器(EPROM)和128bytes的随机存取数据序存器(RAM),器件采用ATMEL公司的高密度/非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和FLASH存储单元,AT89C51单片机为许多嵌入式控制系统提供了一种灵活行高且价廉的方案。3.1.1 主要特性· 8031 CPU与MCS-51 兼容· 4K字节可编程FLASH存储器(寿命:1000写/擦循环)· 全静态工作:0Hz-24KHz· 三级程序存储器保密锁定· 128*8位内部RAM· 32条可编程I/O线· 两个16位定时器/计数器· 6个中断源· 可编程串行通道· 低功耗的闲置和掉电模式· 片内振荡器和时钟电路 图313.1.2 管脚说明VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。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”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下表所示:管脚 备选功能: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端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。3.1.3 震荡特性XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。3.1.4 芯片擦除整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。 此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。3.2 4×4矩阵键盘如图所示,本系统采用4×4矩阵键盘,16个按键分为输入数字键:*、0、#、1、2、3、4、5、6、7、8、9;功能键lock、modify、cel、Enter。矩阵键盘。图323.3 复位电路图33时钟电路工作后,在REST管脚上加两个机器周期的高电平,芯片内部开始进行初始复位(如图33)。3.4 振荡电路图34本设计晶振选择频率为12MHZ,电容选择30pF如图(34)。经计算得单片机工作胡机器周期为:12×(1÷12M)=1us。3.5数码管图35本设计采用两个4位8段共阴极数码管。由于由单片机直接驱动的直流电流不够,数码管亮度显得不足,所以加上三极管S9013用以放大电流。因为LED数码管合适的驱动电流大约为9mA到20mA左右,为了适LED数码管工作电流在10mA左右,具体计算如下:Ib=(5V-1.4V-0.7V)/27K=0.1×10-3AIe= Ib×(+1)=10 mA 使用的9013的放大倍数为100. 图63.6 发光二极管LED图3由于LED使用P0口驱动要加上上拉电阻如图37。3.7 电动锁图3由于电动锁使用P0口驱动要加上上拉电阻如图38。3.8 蜂鸣器图39由于蜂鸣器使用P0口驱动要加上上拉电阻如图39。3.9完整电路图图39·3.10 使用到的元器件列表元器件规格/型号数量四位八段共阴数码管3461AFR1-B101四位八段共阴数码管SR420361三极管SR90138三极管S9651电阻27k8电阻10k电阻1k电解电容0.47uF/50V1瓷片电容30pF2单片机AT89C511 表31第4章 软件程序设计本系统程序部分使用C语言编写,C语言是一种高级程序设计语言,它的优点是简洁明了、可移植性高。主要完成,开始时数码管显示提示“INPUT”输入密码。输入密码后按下确认键,系统会将所输入与系统密码进行比对。若输入密码正确则显示“PASS”开锁。然后可以选择上锁或者修改密码。开锁后,按下上锁“LOCK”键,系统上锁并返回;选择修改密码则可以对系统进行修改密码操作。在修改密码前要输入正确旧的密码。正确输入旧密码之后,会有提示输入两次新密码,若两次密码一致,则修改成功。期间操作出现失误,系统会返回初始状态,操作错误超过3次,系统会锁定键盘,并报警用以防止恶意试探密码。4.1 软件设计流程图开始输入密码正确否?开锁判断按键LOCKModify键上锁结束输入密码正确否?输入新密码再次输入一致否?修改密码YesNoNoYesNoYes图414.2 具体功能软件实施·4.2.1 开始等待流程 系统开始一直显示提示“INPUT”,并判断有否按键,当有键按下跳出等待。 开始显示“INPUT”判断是否有按键?结束NoYes图42·4.2.2 密码检查功能本系统使用数组PASSWORD6存储密码,系统初始化对数组负值PASSWORD65,6,7,9,10,11相当于键盘上的1,2,3,4,5,6。输入密码的时候,先将输入的每一位密码分别放置在数组check6中,然后再将check6与PASSWORD6的每一位分别对照。若每一位都相等,密码检查通过。开始输入一位密码,数码管显示“”K=6?k=0按键为CEL?结束YesNoNoYes图43·4.2.3 显示功能4位数码管上的管脚单片机输出管脚a11P3.7b7P3.2c4P3.1d2P3.5e1P3.6f10P3.3g5P3.0h3P3.4 本系统使用共阴极数码管显示(如图35)。选码由P3口输出高电平有效,选位由P1口输出低电平有效。显示原理如下图及下表: 图4 表4显示方式分别有静态显示与动态显示两种。在显示提示信息如:输入密码“INPUT”,操作通过“PASS”,操作错误“ERROR”,输入旧密码“OLD”,输入新密码“NE”,再次输入“AGAIN”等信息时使用的是动态显示。由于8个显示器的段码同名端是连接在一起的,如果选码的管脚(本系统中为P1)都为0,那么8个显示器则显示同一字符。要使各个数码管出现不同字符必须采用“分时动态扫描”的方法显示。即每次点亮一个LED显示器,延时一段时间再点亮下一个LED显示器周而复始,8个LED显示器轮流动态扫描。利用人视觉余辉的暂留效应,看起来好像几个显示器上“同时”显示不同的字符。如子程序view_input_password():void view_input_password(void) for(i=0;i<200;i+) P3=0X48;P1=0XFe;/第四个显示器显示I for(i=0;i<200;i+) P3=0X43;P1=0X7F;/第五个显示器显示N for(i=0;i<200;i+) P3=0XCD;P1=0XBF;/第六个显示器显示P for(i=0;i<200;i+) P3=0X62;P1=0XDF;/第七个显示器显示U for(i=0;i<200;i+) P3=0X69;P1=0XEF;/第八个显示器显示T 静态显示应用在输入密码时数码管的显示进行输入密码操作时,每输入一位密码数码管显示一个“”,实施方法为:当有第一个按键时,第八个数码管的片选信号为低电平,其他为高。当有第二个按键时,第八、第七个数码管的片选信号为低,其他为高,如此类推。如子程序input_view():void input_view(void) /k为判断输入第几位的变量switch(k) case 0:P1=0XEF;P3=0X01;/显示由右至左1个“” case 1:P1=0XcF;P3=0X01;/显示由右至左2个“” case 2:P1=0X8F;P3=0X01;/显示由右至左3个“” case 3:P1=0X0F;P3=0X01;/显示由右至左4个“” case 4:P1=0X0E;P3=0X01;/显示由右至左5个“” case 5:P1=0X0A;P3=0X01;/显示由右至左6个“” ·4.2.4 键盘扫描如图3-2,本系统使用4×4矩阵键盘当没有键按下时,行线和列线之间是不相连的,若第N行与第M列的键被按下,那么第N行与第M列的线就被接通。根据上述原理,本系统的键盘扫描方法是利用P2口的低四位作为行扫描线,P2口的高四位作为列回扫线。具体实施方法为:先使P2.0口输出低电平,P2口其他口输出高电平,然后对P2.4、P2.5、P2.6、P2.7四个口分别作判断。若此四口都为高电平,则没有键按下;若有键按下,P2.4、P2.5、P2.6、P2.7四个口必定有一个口输入为低电平,再判断P2.4、P2.5、P2.6、P2.7哪个口为低电平则可判断按键在哪列上。如P2.4、P2.5、P2.6、P2.7没有低电平,再使P2.1为低电平,其他口为高电平,依次扫描下去,找到按键所在的行,再判断P2口的高四位哪一位为低,便可知道键在哪一列上。键盘扫描子程序key()如下:/*加上行扫描信号后,判断P2口高四位同时给标记变量falg赋值并跳出循环*/void key(void)while(1) P2=0XFE;if(P2_4=0)falg=1;break; if(P2_5=0)falg=2;break; if(P2_6=0)falg=3;break; if(P2_7=0)falg=4;break; P2=0XFd;if(P2_4=0)falg=5;break; if(P2_5=0)falg=6;break; if(P2_6=0)falg=7;break; if(P2_7=0)falg=8;break; P2=0XFb;if(P2_4=0)falg=9;break; if(P2_5=0)falg=10;break; if(P2_6=0)falg=11;break; if(P2_7=0)falg=12;break; P2=0XF7;if(P2_4=0)falg=13;break; if(P2_5=0)falg=14;break; if(P2_6=0)falg=15;break; if(P2_7=0)falg=16;break; ·4.2.5 修改密码本系统设定的修改密码过程为,在输入正确的密码后,按modify,此时提示输入旧密码“old”,输入正确的旧密码后,可以输入新密码。此时键入的六位新密码将保存到数组check6中。然后显示器提示再次输入,输入完毕后,第二次输入的密码将保存在check26中,然后将check6中六位分别与check26中的六位比对,若两次密码输入一直,即将新的密码,也就是check26和check26中的六位赋值到PASSWORD6中。此时修改密码工作完成,系统将跳翻到开始,即提示输入密码“INPUT”。第5章 结束语及展望通过这次毕业设计,让我复习了很多学过的旧知识,同时锻炼了自己的动手能力和查阅资料。尤其是解决在实际中解决排查问题的能力。1、 通过这次的设计,我熟悉了使用Protel的技巧,学会了制作电路板的一些技巧,并且熟悉了如何选购使用电子元器件。2、 在设计中,我学到了如何使用C语言对单片机进行编写程序,熟悉了使用KEIL C软件,并且加深了对单片机的编程技巧。3、 在做这个设计的过程中,我遇到了不少的问题。这锻炼了我筛选、查阅资料,并将理论结合到自己的设计中的能力。一步一步的排除故障原因,找到故障的原因并解决故障。4、 这次的设计使我对模拟电子、数字电子知识加深了了解,尤其是在对电路进行调试的时候,出现了很多这些方面的问题,通过对以往知识的复习巩固,将问题解决。这次的设计有很多的不足,和市场上的产品有一定的差距,例如没有使用液晶显示屏,电动锁的部分在实物中使用一个LED代替等,还可以做得更好,还请老师同学们提出宝贵意见!第6章 鸣谢在本次设计完成之际,在这里要衷心感谢我的毕业设计知道老师xxx老师在设计中对我的指导、帮助,并且提出了很多非常宝贵的意见。感谢在本次设计中给予我帮助的xxx、xxx等各位同学。还要感谢大学四年来教导我的各位老师,不计较浪费自己学习时间帮助我的同学。感谢答辩小组的老师百忙之中对我本次设计的阅览与指导!第7章 参考文献1 当方微型计算机控制技术M中国水利水电出版社,2001年2 胡汉才单片机原理及其借口技术M清华大学出版社,1996年3 赵新民智能仪器设计基础M哈尔滨工业大学出版社,1999年4 潘新,民王,燕芳微型计算机控制技术M电子工业出版社,2003年5 李钟实实用电子报警器精选百例M北京:科技技术文献出版社,2002年6 陈爱弟Protel99se实用培训教程M人民邮电出版社,2000年。7 阎石数字电子技术基础M高等教育出版社,1998年8 童诗白模拟电子技术基础M高等教育出版涉,1998年9 候振鹏嵌入式C语言程序设计M北京:人民邮电出版社,2006年10 徐士良C语言程序设计教程M北京:人民邮电出版社,2001年11 附 录电子密码锁源程序:#include<REGX51.H>void view_input_password(void);void view_input_error(void);void key1(void);void key2(void);void key3(void);void newpassword(void);void again(void);void key(void);void input_view(void);void voice(void);void view_again(void);void oldpassword(void);unsigned int x,y,i,j,k,falg;unsigned int counter=0;unsigned int password6=5,6,7,9,10,11;unsigned int check6;unsigned int check26;void delay();void newpassword(void);main() P0=0;EA=0;start:falg=0; delay(); while(1) P0=0; key1(); if(counter>=3) /输入错误超过3次报警 P0_1=1;P0_2=0; voice(); counter=0; for(i=0;i<255;i+) for(j=0;j<255;j+) view_input_error(); P3_0=1; goto start; for(k=0;k<6;k+) key(); checkk=falg; if(falg=8)k=0;P1=0xFF;goto start;/取消 if(falg=4) /输入未够6位都视作错误k=0;P1=0xFF;counter+;P0_1=1;P0_2=0;voice(); for(y=0;y<100;y+) view_input_error();goto start; input_view(); delay(); key(); if(falg=8)k=0;P1=0XFF;continue; if(falg=4)/按下确认键盘,密码开始比对 for(k=0;k<6;k+) if(checkk=passwordk)falg=1;continue; if(checkk!=passwordk) falg=0;counter+;P0_1=1;P0_2=0;voice(); for(i=0;i<100;i+) view_input_error();goto start; if(falg=1)/6位都正确,开锁 P0_1=0;P0_2=1;voice(); for(k=0;k<100;k+) for(i=0;i<200;i+) P3=0Xcd;P1=0X7F;/P for(i=0;i<200;i+) P3=0Xcf;P1=0XBF;/A for(i=0;i<200;i+) P3=0Xab;P1=0XDF;/S for(i=0;i<200;i+) P3=0Xab;P1=0XEF;/S break; if(falg!=1)P0_1=1;P0_2=0;voice();for(i=0;i<100;i+) view_input_error();goto start; while(1) P1=0XFF;voice(); key(); if(falg=16)P3=0xff;P1=0X00;P0_2=0;delay();goto start;/上锁键 if(falg=12)/修改键 delay(); key2(); for(k=0;k<6;k+) key(); checkk=falg; input_view(); delay(); if(falg=8)k=0;continue; if(falg=4)k=0;counte