1、山东商业职业技术学院毕业设计(论文)电子密码锁设计姓 名 崔洪运 专 业 应用电子技术 班 级 电子1301 指导老师 袁科新 二零一五年十一月三十日山东商业职业技术学院毕业设计(论文)任务书学 生 姓 名 崔洪运指 导 教 师 袁科新设计(论文)题目电子密码锁设计设计(论文)工作内容采用单片机、LCD等芯片,设计电子密码锁,能随时修改密码,输入密码时可以使用删除键对输入密码进行修改;具有防多次试探功能,连续输入密码达到一定次数,发出光声报警密码输入错误时有光声报警,连续输入3次错误,键盘自锁,等待管理解锁;开锁后或修改密码后可以选择退出,返回开锁前状态。设计(论文)的主要技术指标1) 能多次
2、修改密码; 2) 能防多次试探; 3) 带报警和锁键盘功能 4) LCD1602显示方式: 5) 开锁前显示:please input6) 输入密码正确时显示:WELCOME 7) 输入密码错误时显示:ERORR 8) 用户连续输入密码3次错误显示:Close 9) 第一次输入修改密码时显示:Revision 10) 第二次输入修改密码时显示:input again 11) 修改密码成功时显示:Changed设计(论文)的基本要求1) 掌握Proteus软件的基本应用,用于设计与仿真; 2) 需要用protel软件绘制电路原理图及局部原理图; 3) 掌握单片机编程语言,可选用汇编语言或C语言;
3、 4) 掌握焊接电路的步骤与技巧。应收集的资料及主要参考文献1江晓安,董秀峰.模拟电子技术.第3版.西安:西安电子科技大学出版社2001.p34-392陈明荧.8051单片机课程设计.第2版.北京:清华大学出版社,2003.p45-673邢敏华. 模拟、数字及电力电子技术.第4版.北京:机械工业出版社,2013.p56-764陈中平.51单片机C语言程序设计经典实例.第5版.北京:电子工业出版社,2012.p67-895胡宴如.模拟电子技术.耿苏燕.第4版.北京;高等教育出版社,2013:p83-936杨志忠.数字电子技术.第4版.北京:高等教育出版社,2013:p240-2447陆国和.电路
4、与电工技术.顾永杰.第3版.北京:高等教育出版社,2010:p253-2858王静霞.单片机应用技术.杨宏丽.第2版.北京:电子工业出版社,2014:p141-1509朱岩.工业用微型计算机.2011年版.北京:机械工业出版社,2011:p182-227摘要本论文研究的是如何进行电子密码锁的设计,本系统由单片机系统、矩阵键盘、LED显示和报警系统组成。系统能完成开锁、超时报警、超次锁定、管理员解密、修改用户密码基本的密码锁的功能。本设计是基于AT89C51单片机为控制核心的密码锁设计方案。在本次基于单片机的电子密码锁设计中,将采用AT89C51单片机作为控制核心,配合相应的电路和软件程序,实现
5、密码的输入和修改、信息的显示、键盘的锁定、系统报警、开锁和闭锁等功能。在设计中,利用识别密码是否正确来开锁或报警,通过串行存储器AT24C02来实现密码的修改和存储关键词: AT89C51单片机,密码锁,矩阵键盘AbstractThe thesis tell us that How to made a eletronic coded lock,the system was composed of mcu systems ,matrix keyboard,LED display and alarm system.they can open lock,alarm,lock,decrypt and
6、change password.Thisdesignisaboutcombinationlock,basedontheAT89C51single-chipmicrocomputerasthecoreofcontrollinggoals.ThisdesigninwhichtheAT89C51single-chipmicrocomputerasthecoreofthecontrollinggoalscooperatedwithrelevantcircuitsandsoftwareprogramscanachievesuchfunctionslikepasswordinputandmodificat
7、ion,informationdisplay,keyboardlocking,warningsystem,andtheopennessandclosenessofthelocketc.Inthisdesign,theopennessoflockandalarmingaaccordingtoidentifyingthepassword,andpasswordrevisionandstorageisachievedbythefunctionoftheAT24C02serialstorage.Keywords:AT89C51SCM,Combinationlock,Electroniclock,Mat
8、rixkeyboard目录第1章 电子密码锁简介11.1电子密码锁的概念11.2 电子密码锁设计的背景及意义11.3电子密码锁的现状及发展趋势11.4设计内容2第2章 硬件设计22.1系统设计框图22.2 AT89S52单片机介绍32.3键盘电路设计62.4报警电路设计72.5 显示电路设计72.6开锁电路设计8第3章 软件设计94.1工具软件介绍94.1.1 Kell软件介绍94.1.2Proteus仿真软件介绍104.2程序设计调试114.3程序仿真11第4章设计总结125.1设计总结12致谢13附录156第1章 电子密码锁简介 1.1电子密码锁的概念什么是电子密码锁?“一种通过密码输入来
9、控制电路或者是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。”百度百科上是这样解释的。简单来说,电子密码锁就是能够实现密码等信息的设置、存贮、识别和显示,以及报警信号的接收和发送等功能的电子器件。1.2 电子密码锁设计的背景及意义基于单片机的电子密码锁的出现,在一定程度上解决了用户私人财产安全的问题。但是,时代在发展,社会在进步,任何事物只有不断地进步才能适应时代发展的需求。电子密码锁虽然有安全性高、操作简单等优点,但是却不如机械锁价格低廉,因此,在市场上的主流产品还是机械锁。电子密码锁要想取代机械锁成为市场上的主流,就必须不断改进,在具有更多功能的同时向更智能化和更低成本化
10、发展。这就需要我们不断研究电子密码锁的设计方法和实现原理。因此,研究基于单片机的电子密码锁的设计是很有必要且具有现实意义的。1.3电子密码锁的现状及发展趋势目前,和西方发达国家相比,我国的电子密码锁技术还相对落后。在西方发达国家,电子密码锁的种类已经很齐全,技术也比较先进,且在各个领域得到了广泛应用。在我国,电子密码锁技术却才相当于国际上七十年代的水平,相对来说还很落后。20世纪80年代以来,随着各种电子集成电路的出现,特别是单片机的面世,电子密码锁得到了很大的发展。相对于笨重而构造简单的传统机械锁来说,电子密码锁具有体积小,可靠性高的优势。但是就目前而言,电子密码锁的价格相对较高且需要有电源
11、提供能量,使得其使用还局限在一定范围,特别是在国内,各种条件的制约使得电子密码锁暂时难以普及。尽管电子密码锁还存在着一些缺陷,但是其安全性高、方便易用、能够智能报警的优势却是传统钥匙锁取代不了的,而且随着电子信息技术的发展和各种电子器件的价格的不断降低,电子密码锁也将往低成本、多功能的方向发展。1.4设计内容本设计研究的是如何进行电子密码锁的设计,本系统由单片机系统、矩阵键盘、LED显示和报警系统组成。系统能完成开锁、超时报警、超次锁定、管理员解密、修改用户密码基本的密码锁的功能。本设计是基于AT89C51单片机为控制核心的密码锁设计方案。在本次基于单片机的电子密码锁设计中,将采用AT89C5
12、1单片机作为控制核心,配合相应的电路和软件程序,实现密码的输入和修改、信息的显示、键盘的锁定、系统报警、开锁和闭锁等功能。在设计中,利用识别密码是否正确来开锁或报警,通过串行存储器AT24C02来实现密码的修改和存储 第2章 硬件设计2.1系统设计框图电子密码锁的组成框图,它是以51系列单片机(AT89s51)为核心,配以相应硬件电路,完成密码的设置、存贮、识别和显示、驱动电磁执行器并检测其驱动电流值、接收传感器送来的报警信号、发送数据等功能。 单片机接收键入的代码,并与存贮在EEPROM中的密码进行比较,如果密码正确,则驱动电磁执行器开锁;如果密码不正确,则允许操作人员重新输入密码,最多可输
13、入三次;如果三次都不正确,则单片机通过通信线路向智能监控器报警。单片机将每次开锁操作和此时电磁执行器的驱动电流值作为状态信息发送给智能监控器,同时将接收来自传感器接口的报警信息也发送给智能监控器,作为智能化分析的依据。系统结构框图和仿真电路如下。图1 系统结构框图图2 系统仿真电路2.2 AT89S52单片机介绍AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系
14、统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O 口线,看门狗定时器,2 个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。图3 单片机引脚图图3单片机引脚图引脚介绍如图3所示
15、Vcc;电源GND;接地P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。P1口:P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)
16、。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表3-1所示。在flash编程和校验时,P1口接收低8位地址字节。P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVXDPTR)时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上发送1。在使用
17、8位地址(如MOVXRI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89S52特殊功能(第二功能)使用,如表3-2所示。在flash编程和校验时,P3口也接收一些控制信号。RST:复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,R
18、ST脚输出96个晶振周期的高电平。ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。EA/VPP:访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。为了执行内部程
19、序指令,EA应接VCC。在flash编程期间,EA也接12伏VPP电压。XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。XTAL2:振荡器反相放大器的输出端。2.3键盘电路设计每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有NM个按键的键盘。在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。对照图4所示的44键盘,说明线
20、反转个工作原理。首先辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。方法是:向行线输出全扫描字00H,把全部列线置为低电平,然后将列线的电平状态读入累加器A中。如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键。图4键盘电路图2.4报警电路设计声音的产生是一种音频振动的效果,振动的频率高则为高音,频率底则为低音。音频
21、的范围为20Hz200kHz之间,人类耳朵比较容易辨识的声音大概是200Hz20kHz。一般音响电路是以正弦波信号驱动喇叭,产生悦耳的音乐的,而在数字电路中,则是以脉冲信号驱动喇叭以产生声音。本系统使用的蜂鸣器产生的声音是利用程序产生频率,送到输出端口。利用LED灯表示输入密码正确与否,红色表示密码错误,蜂鸣器发出报警声,密码正确时,绿色LED灯亮。图5报警电路2.5 显示电路设计本系统设计的显示电路是为了给使用者以提示而设置的,使用LCD可以为用户提供更友好的人机界面,故选用LCD1602作为显示器件。开锁时,按下键盘上的开锁按键后,利用键盘上的数字键09输入密码,每按下一个数字键后在显示器
22、上显示一个*,输入多少位就显示多少个*。当密码输入完成时,按下确认键,如果输入的密码正确的话, LCD显示“”,单片机其中P3.0引脚会输出低电平,使三极管T2导通,电磁铁吸合,继电器开关跳转,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“you are thief!”,P3.0输出的是高电平,电子密码锁不能打开。通过LCD显示屏,可以清楚地判断出密码锁所处的状态。2.6开锁电路设计因为在设计中是以发光二极管代替电磁锁,二极管亮代表锁开,因此可以设计一个简单的可以点亮二极管的电路系统代替电磁锁开锁机构。开锁显示电路如图6所示 由于单片机I/O口默认为高电平,故初始时二极管不亮,代表锁是
23、闭着的。当用户输入密码并验证正确时,发出开锁信号(使P2.4=0)。 图6开锁电路第3章 软件设计4.1工具软件介绍4.1.1 Kell软件介绍Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(Vision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果使用C语言编程,那么Keil几乎就是不二之
24、选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍Keil C51开发系统基本知识系统概述Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil的优势。下面详细介绍Keil C51开发系统各部分功能和使用。Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,Vision与Ishell分别是C51 for Windows 和for Dos 的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用ID
25、E本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.obj)。目标文件可由LIB51 创建生成库文件,也可以与库文件一起经L51 连接定位生成绝对目标文件(.abs)。abs文件由OH51 转换成标准的hex 文件,以供调试器dScope51 或tScope51 使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。使用独立的Keil仿真器时,注意事项仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。仿真器上的复位按钮只复位仿真芯片,不复位目标系统,仿真芯片的31脚(/EA
26、)已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用。4.1.2Proteus仿真软件介绍Proteus软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。P
27、roteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。 4.2程序设计调试图7程序框图4.3程序仿真本设计经过kell的编辑,反复修改后,
28、生成hex文件通过proteus进行仿真,调试过程主要包括两方面:测试和调整,调试的整个过程就是一系列的测量、判断、调整、再测量的反复进行过程。本系统调试采用的是先分调再总调。调试过程中,要依照信号流程,分步逐级进行调试,并取得了预期的结果。第4章设计总结5.1设计总结 本系统由单片机系统、矩阵键盘、LCD显示和报警系统组成。系统能完成开锁、错误报警,超次锁定、修改用户密码,恢复初始密码基本的密码锁的功能。除上述基本的密码锁功能外,还有声音提示等功能,依据实际的情况还可以添加遥控功能。本系统利用单片机控制,LCD显示,配合蜂鸣器提示,系统成本低廉,功能强大实用。但是在系统调试过程中,还是发现一
29、些问题,系统不稳定情况时有发生,经过反复调试发现下列问题: 按键效果不好,产生较大状况的抖动,使软件消抖不完全;另外一个就是单片机本身不问题,引起系统跑飞或者卡死;还有就是由于电路板制作的原因,线路之间产生干扰,系统发生错误,比如液晶显示错误等等。经过反复调试和修改,最好终于达到一个比较满意的水平。本系统设计还做的不是太人性化,比如说能够加上语音提示和遥控开锁功能,将可能会更加有生命力!致谢我非常感谢我的导师袁科新老师。这篇论文是在袁科新老师的精心指导和亲切关怀下完成的。从最初的定题,到收集资料,到论文修改,袁科新老师始终悉心指导、无私帮助。袁科新老师严谨的治学态度,科学的学习方法以及无私奉献
30、的敬业精神将使我终身受益。在此,谨向袁科新老师致以深深的敬意和诚挚的感谢。本论文的完成,还得到了信息工程学院其他老师的关怀和指导,在此向所有给予我帮助和关怀的老师们说一声:谢谢!毕业论文的收尾,也意味着我在袁科新大学的三年学习生活即将结束,自己最宝贵的青春时光能在这样的校园中,能在这些学富五车、才华横溢的老师们得熏陶下度过,我在思想和学业上受益匪浅。最后,再次向关心和帮助我的老师,亲人,同学和朋友表示我最真挚的谢意。谢谢你们!参考文献1 江晓安,董秀峰.模拟电子技术.第3版.西安:西安电子科技大学出版社2001.p34-392 陈明荧.8051单片机课程设计.第2版.北京:清华大学出版社,20
31、03.p45-673 邢敏华. 模拟、数字及电力电子技术.第4版.北京:机械工业出版社,2013.p56-764 陈中平.51单片机C语言程序设计经典实例.第5版.北京:电子工业出版社,2012.p67-895 胡宴如.模拟电子技术.耿苏燕.第4版.北京;高等教育出版社,2013:p83-936 杨志忠.数字电子技术.第4版.北京:高等教育出版社,2013:p240-2447 陆国和.电路与电工技术.顾永杰.第3版.北京:高等教育出版社,2010:p253-2858 王静霞.单片机应用技术.杨宏丽.第2版.北京:电子工业出版社,2014:p141-1509 朱岩.工业用微型计算机.2011年版
32、.北京:机械工业出版社,2011:p182-227附录源程序代码#include#include#include#define uchar unsigned char#define uint unsigned int#define LCDIO P0#define delay4us() _nop_();_nop_();_nop_();_nop_();uchar buffer6=0; sbit sda=P34;sbit scl=P33;sbit beep=P37;sbit relay=P23;sbit huifu=P26;bit flag=0,aa;/用户zi定时溢出标志位uchar DSY_BU
33、FFER16= ;uchar DSY_BUFFER116= ;uchar Userpassword6=0;uchar Mem6=0;sbit rs=P20; sbit rd=P21;sbit lcden=P22;sbit led=P24;sbit led1=P27;uchar code table2=123456;uchar code table=Input your code:;void delayms(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void delay()/短延时,两个机器周期,做总线的延时用;void write_com(u
34、char com)rs=0;rd=0;lcden=0;P0=com;delayms(3);lcden=1;delayms(3);lcden=0;void write_date(uchar date)rs=1;rd=0;lcden=0;P0=date; delayms(3);lcden=1;delayms(3);lcden=0;void Display_String(uchar *p,uchar com) uchar i; write_com(com); for(i=0;i16;i+) write_date(pi);void init_lcd()lcden=0;write_com(0x38);w
35、rite_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80); Display_String(table,0x80);Display_String(=Lock OK! = ,0xc0);void start()sda=1;scl=1;delay4us();sda=0;delay4us();scl=0;void stop()sda=0;scl=1;delay4us();sda=1;delay4us();scl=0;void init()/初始化sda=1;delay();scl=1;delay();void ack()sda=0;s
36、cl=1;delay4us();scl=0;sda=1;void noack()sda=1;scl=1;delay4us();scl=0;sda=0;uchar recbyte()uchar i,rd;rd=0x00;sda=1;for(i=0;i8;i+)scl=1;rd=1;rd|=sda;delay4us();scl=0;delay4us();scl=0;delay4us();return rd;uchar sendbyte(uchar wd)uchar i;bit ack0;for(i=0;i8;i+)sda=(bit)(wd&0x80);_nop_();_nop_();scl=1;d
37、elay4us();scl=0;wd=1;delay4us();sda=1;scl=1;delay4us();ack0=!sda;scl=0;delay4us();return ack0;uchar Recstring(uchar slave,uchar subaddr,uchar *buffer,uchar n) uchar i; start(); if(!sendbyte(slave) return 0; if(!sendbyte(subaddr) return 0; start(); if(!sendbyte(slave+1) return 0; for(i=0;in-1;i+) buf
38、feri=recbyte();ack(); buffern-1=recbyte(); noack(); stop(); return 1;uchar Sendstring(uchar slave,uchar subaddr,uchar *buffer,uchar n)uchar i;start();if(!sendbyte(slave) return 0;if(!sendbyte(subaddr) return 0;for(i=0;in;i+)if(!sendbyte(bufferi) return 0;stop();return 1;void clear_password()uchar i;
39、for(i=0;i6;i+) Userpasswordi= ;for(i=0;i40x0f;switch(temp)case 8:keynum+=0;break;case 4:keynum+=1;break;case 2:keynum+=2;break;case 1:keynum+=12;break;break;delayms(600); return keynum;void main() uchar temp,i=0,j=0,k=0,n,m=0,flay,error,ne=1;uchar IS_valid_user;relay=1;init(); init_lcd();delayms(5);
40、P1=0x0f; while(1) if(!huifu=1)aa=Sendstring(0xa0,1,table2,6); delayms(10); aa=Recstring(0xa0,1,buffer,6); else aa=Recstring(0xa0,1,buffer,6); if(P1!=0x0f)delayms(10); if(P1!=0x0f) temp=Keys_Scan(); switch(temp) case 11:temp=0; case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: i
41、f (i=5) /密码限制在6位以内 Userpasswordi=temp; DSY_BUFFERi=*; Display_String(DSY_BUFFER,0xc0); i+; break; case 19: /按F键清除一位 if(i!=0)i-; for(n=0;ni;n+) DSY_BUFFER1n=temp+*; Display_String(DSY_BUFFER1,0xc0); break; case 12: /按Enter键开锁for(k=0;k6;k+) if(bufferk=(Userpasswordk+48) flag=1; else flag=0; if (flag=1) flag=0; i=0;