还剩56页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
单片机课程设计说明书电子密码锁控制系统设计专业电气工程及其自动化学生姓名张海啸班级B电气104学号1010601410指导教师张兰红完成日期2013年6月15日摘要:锁是指加在门、箱子、抽屉等物体上的封缄器,要用专用的钥匙才能打开自古以来锁都是人们财产安全乃至生命安全的一种重要保障伴随着人类历史的发展和人们对自身财产安全和人生安全的重视,各种各样的多功能的锁具也相继出现,人们使用的锁具也由传统的机械式锁逐渐发展为安全性能更好,功能更多的电子密码锁在现代社会,电子密码锁已是一个被大家所熟识的名词相信很多人的小区大门上的锁都用的是电子密码锁本文中将要介绍的电子密码锁是一种通过判断密码输入是否正确来控制电路或是芯片的工作状态,进而控制锁的打开和闭合,从而完成开锁、闭锁任务的电子锁装置本设计是基于AT89C51单片机为控制核心的密码锁设计方案在本次基于单片机的电子密码锁设计中,将采用AT89C51单片机作为控制核心,配合相应的电路和软件程序,实现密码的输入和修改、信息的显示、键盘的锁定、系统报警、开锁和闭锁等功能在设计中,利用识别密码是否正确来开锁或报警,通过串行存储器AT24C02来实现密码的修改和存储关键词:单片机;密码锁;矩阵键盘;掉电存储TheDesignOfElectronicCodeLockBasedOnSingleChipMicrocomputerAbstract Assealeddevicethelockaddedtosuchobjectslikedoorboxdraweretccanbeopenedwithspecifiedkey.Sincetheancienttimelockisakindofsecurityguaranteeingpeople’spropertysafetyevenlifesafety.Withthedevelopmentofhumanhistoryandmoreattentionpaidtopropertysafetyandlifesafetyvariousmulti-functionallockscanbeseenintheworld.Traditionalmechanicallockspeopleuseinlifearegraduallyreplacedbyelectroniccombinationlockcharacterizedwithbettersafetyperformanceandmorefunctions.Inthemodernsocietyelectroniccombinationlockisanounfamiliartoeveryone.Usuallythedoorofcommunityisequippedwithelectroniccombinationlock.Thispaperwillintroduceanelectroniccombinationlock.Thislockcontrolstheelectriccircuitsandtheperformanceofchipsbyidentifyingpassword.Thustheopennessandclosenessofthelockcanbecontrolledandthetaskofelectroniclockdevicecanbecompleted.ThisdesignisaboutcombinationlockbasedontheAT89C51single-chipmicrocomputerasthecoreofcontrollinggoals.ThisdesigninwhichtheAT89C51single-chipmicrocomputerasthecoreofthecontrollinggoalscooperatedwithrelevantcircuitsandsoftwareprogramscanachievesuchfunctionslikepasswordinputandmodificationinformationdisplaykeyboardlockingwarningsystemandtheopennessandclosenessofthelocketc.InthisdesigntheopennessoflockandalarmingareaccordingtoidentifyingthepasswordandpasswordrevisionandstorageisachievedbythefunctionoftheAT24C02serialstorage.Keywords:Single-chipmicrocomputerCombinationlockElectroniclockMatrixkeyboardPowerloststorage目录TOC\o1-3\h\z\u绪论4电子密码锁简介5电子密码锁设计的背景及意义5电子密码锁的现状及发展趋势61课题设计目标62总体设计方案
62.1设计思路
62.2方案确立73硬件电路方框图
73.1单片机及其最小系统
73.
1.1复位电路的设计
83.
1.2时钟电路的设计
93.2密码锁电路
103.
2.1按键电路的设计
103.
2.2LCD显示电路
113.
2.4开锁机构
123.
2.5报警机构134程序设计
144.1软件总体设计
144.2键盘扫描子程序
154.3显示模块子程序
184.4掉电存储子程序
194.
4.1写操作方式
194.
4.2读操作方式
204.5定时器中断子程序
214.6密码输入子程序
214.7报警子程序235课程设计总结236参考文献257附录25附录一总电路原理图26附录二电子密码锁的PCB图27附录三电子密码锁的实物图27附录四元器件清单30附录五源程序清单31绪论电子密码锁简介什么是电子密码锁?“一种通过密码输入来控制电路或者是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品”——百度百科上是这样解释的简单来说,电子密码锁就是能够实现密码等信息的设置、存贮、识别和显示,以及报警信号的接收和发送等功能的电子器件电子密码锁相对传统机械锁有以下几个优势1密码可更改用户可以随时更改密码,以确保密码锁的安全性和可靠性可以更改密码这一功能同时也避免了人员的更替而使锁的安全性降低,这是传统钥匙锁所不具备的功能2操作简单无论是开锁还是更改密码,只要识字的人都能够直接使用,使用方法简单而不繁琐3能够报警报警功能无疑更增加了锁的安全性4无法“技术”破解不知道密码就无法打开锁,即使是惯偷也只能望“锁”兴叹电子密码锁设计的背景及意义在现代文明社会,虽然人们的道德素质越来越高,“梁上君子”、“三只手”等人群相对旧社会大大减少,但是像“某某小区遭入室行窃,居民损失XXXX”之类的新闻我们还是经常能够在报纸上看到的随着人们生活水平和自身防范意识的提高,个人财产安全和人身安全的问题也越来越受到人们的重视,拥有一把能够有效保证居民财产安全和人身安全的锁具也越发的重要起来锁具的起源可以追朔到人类社会财产私有化的出现,锁具从其出现到发展至今天的高科技化、信息化,已经有若干年的历史了经过若干年的使用和研究,人们对锁具的结构、机理也了解得相当透彻了,因此,不使用钥匙就能将锁打开的方法也层出不穷特别是传统的机械锁,由于其构造简单,在惯偷面前,甚至能够只用一根铁丝就直接将其打开,使其失去了保障用户个人财产安全的意义那么,如何才能提高锁具保障用户财产安全的有效性呢?在信息现代化的今天,锁具也应该向高精度、高安全性的智能化、信息化发展自20世纪70年代第一块单片机芯片TMS-1000于美国德克萨斯仪器公司面世以来,基于其体积小、价格低廉、个性突出等特点,越来越多的电子产品开始采用单片机芯片作为核心控制部件在这样的大环境下,基于单片机的电子密码锁也应运而生这种电子密码锁是以单片机为核心,配以相应的硬件电路和软件程序,实现密码的设置、存贮、识别和显示,以及报警信号的接收和发送等功能,具有操作快、修改密码简单、安全性高、功耗低等优点基于单片机的电子密码锁的面世使人们的自身财产安全有了更多的保障,同时也促进了安全信息系统的发展,是安全信息系统的一大进步基于单片机的电子密码锁的出现,在一定程度上解决了用户私人财产安全的问题但是,时代在发展,社会在进步,任何事物只有不断地进步才能适应时代发展的需求电子密码锁虽然有安全性高、操作简单等优点,但是却不如机械锁价格低廉,因此,在市场上的主流产品还是机械锁电子密码锁要想取代机械锁成为市场上的主流,就必须不断改进,在具有更多功能的同时向更智能化和更低成本化发展这就需要我们不断研究电子密码锁的设计方法和实现原理因此,研究基于单片机的电子密码锁的设计是很有必要且具有现实意义的电子密码锁的现状及发展趋势目前,和西方发达国家相比,我国的电子密码锁技术还相对落后在西方发达国家,电子密码锁的种类已经很齐全,技术也比较先进,且在各个领域得到了广泛应用在我国,电子密码锁技术却才相当于国际上七十年代的水平,相对来说还很落后20世纪80年代以来,随着各种电子集成电路的出现,特别是单片机的面世,电子密码锁得到了很大的发展相对于笨重而构造简单的传统机械锁来说,电子密码锁具有体积小,可靠性高的优势但是就目前而言,电子密码锁的价格相对较高且需要有电源提供能量,使得其使用还局限在一定范围,特别是在国内,各种条件的制约使得电子密码锁暂时难以普及尽管电子密码锁还存在着一些缺陷,但是其安全性高、方便易用、能够智能报警的优势却是传统钥匙锁取代不了的,而且随着电子信息技术的发展和各种电子器件的价格的不断降低,电子密码锁也将往低成本、多功能的方向发展1课题设计目标本设计采用MCS-51系列单片机AT89S52作为主控芯片,结合外围电路,设计密码锁控制系统,能够实现2总体设计方案
2.1设计思路该电路是一种采用以AT89S52为核心的单片机控制方案利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还能根据实际需要添加调电存储、声光提示功能
2.2方案确立1为了实现密码的保密性,采用一个4×4的矩阵式键盘可以任意设置用户密码,从而提高了密码的保密性2采用LCD显示单元,提高了可读性提供良好的人机界面3硬件电路方框图电路由两大部分组成AT89S51单片机及其外围电路和密码锁电路密码锁电路包含矩阵键盘输入、LCD指示电路、报警控制电路、AT24C02掉电存储电路其原理方框图如图3-1所示图3-1原理图框图
3.1单片机及其最小系统单片机最小系统是单片机正常工作的基础,任何一个单片机系统设计都是基于单片机最小系统的基础上来完成的,而在单片机系统实物设计中,最应该首先解决的也应该是单片机最小系统问题,只有保证了单片机最小系统的正确性,才能保证接下来的其他模块的正确设计图3-2是单片机最小系统的完整仿真图图3-2单片机最小系统的完整仿真图
3.
1.1复位电路的设计复位是单片机的初始化操作单片机启运运行时,都需要先复位,其作用是使CPU和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作因而,复位是一个很重要的操作方式但单片机本身是不能自动进行复位的,必须配合相应的外部电路才能实现该复位电路采用按键电平复位式复位电路当单片机已在运行当中时,按下复位键S后松开,在复位引脚RET(9脚)脚持续出现24个振荡器脉冲周期(即2个机器周期)的高电平信号将使单片机复位也能使RST为一段时间的高电平,从而实现上电或开关复位的操作如图3-3所示图3-3复位电路
3.
1.2时钟电路的设计时钟电路为单片机产生时序脉冲,单片机所有运算与控制过程都是在统一的时序脉冲的驱动下的进行的,如果单片机的时钟电路停止工作(晶振停振),那么单片机也就停止运行了当采用内部时钟时,连接方法如下图所示,在晶振引脚XTAL1(19脚)和XTAL2(18脚)引脚之间接入一个
11.0592MHZ晶振,两个引脚对地分别再接入一个电容即可产生所需的时钟信号,电容的容量一般在几十皮法,如20PF如图3-4所示图3-4时钟电路
3.2密码锁电路
3.
2.1按键电路的设计为了加强密码的保密性,采用一个4×4的矩阵式键盘可以任意设置用户密码(1-16位长度),从而提高了密码的保密性,同时也能减少与单片机接口时所占用的I/O口线的数目,节省了单片机的宝贵资源,在按键比较多的时候,通常采用这种方法其原理图如图3-5所示图3-5矩阵键盘电路每一行与每一列的交叉处不相同,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N根行线与M根列线,即可组成具有N×M个按键的矩阵键盘在这种行列式矩阵键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段当确认有按键按下后,下一步就是要识别哪一个按键被按下对键的识别方法通常有两种一种是通用的组行扫描查询法;另一种是速度较快的线反转法此系统中,我们采用线反转法首先辨别键盘中有无按键被按下,在单片机I/O口向键盘送全扫描字,然后读入行线状态来判断具体方法是向行线输出全扫描字00H,把全部列线置成低电平,然后将列线的电平状态读入累加器A中如果有按键被按下,总会有一根行线电瓶被拉至低电平从而使行线不全为1判断键盘中哪一个按键被按下通常是通过将列线逐列至低电平后,检查行输入状态来实现的方法是依次给列线送低电平,然后检查所有行线状态,如果全为1,则所按下的按键不在此列;如果不全为1,则所按下的按键必在此列,而且是在与零电平行线相交的交点上的那个按键实现功能如图3-
53.
2.2LCD显示电路本系统设计的显示电路是为了给使用者以提示而设置的因为系统具有账户管理系统,使用LCD可以为用户提供更友好的人机界面,故选用LCD1602作为显示器件开锁时,按下键盘上的开锁按键后,利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*当密码输入完成时,按下确认键,如果输入的密码正确的话,LCD显示“OK”,单片机其中P
3.0引脚会输出低电平,使三极管T2导通,电磁铁吸合,继电器开关跳转,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“youarethief!”,P
3.0输出的是高电平,电子密码锁不能打开通过LCD显示屏,可以清楚地判断出密码锁所处的状态图3-6显示器电路使用LCD1602可以轻松的实现所有字母和符号显示,显示功能丰富,驱动程序简单能提高系统的安全行,使系统更人性化,更有可扩展性下面几幅图是本课题用到的显示和提示语图3-
7.
1.初始化图3-
7.2密码输入正确图3-
7.3密码输入错误第一次图3-
7.4密码输入错误第二次图3-
7.5密码输入错误第三次图3-
7.6修改密码图3-
7.7输入新密码图3-
7.8清屏
3.
2.3AT24C04存储电路AT24C02是Atmel公司生产的AT24CXX系列串行E2PROM中的一种,是具有I2C总线接口功能的电可擦除串行存储器AT24C02内部含有256个字节,通过I2C总线接口进行操作,有一个专门的写保护功能(WP=1时即为写保护)电路如下图3-8图3-8AT24C04存储电路
3.
2.4开锁机构在基于单片机的电子密码锁设计中,用户需要输入密码,密码正确则发出开锁信号开锁因为在设计中是以发光二极管代替电磁锁,二极管亮代表锁开,因此可以设计一个简单的可以点亮二极管的电路系统代替电磁锁开锁机构如图3-9所示图3-9开锁显示电路由于单片机I/O口默认为高电平,故初始时二极管不亮,代表锁是闭着的当用户输入密码并验证正确时,发出开锁信号(使P
2.4=0)
3.
2.5报警机构在这次基于单片机的电子密码锁设计中,通过控制蜂鸣器的发音来实现系统的报警功能蜂鸣器是一种采用直流电压供电的电子讯响器图3-10是用蜂鸣器模拟的报警机构仿真图图3-10报警机构模拟仿真图当P
3.7口有脉冲信号输入时,蜂鸣器SPEAKER即会发音通过控制输入脉冲的频率还能控制蜂鸣器的发音频率当用户输入密码错误次数达到预设警告次数时,系统调用报警子程序,使蜂鸣器发出报警音,同时禁止键盘输入
3.
2.6密码初始化电路密码初始化是有个相当于超级用户的功能电路当用户密码忘记时可以点击按键实现密码的初始化123456当然要有一定的权限的啦仿真图如下图3-11图3-11密码初始化电仿真图4程序设计
4.1软件总体设计根据电子密码锁的实际应用要求和其应该具有的功能,本次设计的主程序流程图如图4-1所示图4-1主程序流程图此次基于单片机的电子密码锁设计的软件设计方面的主要问题是如何实现键盘输入、信息显示、密码的掉电存储以及密码的比较和处理本设计接下来将分步解决这几个问题
4.2键盘扫描子程序矩阵键盘扫描子程序应该具有以下2个基本的功能1能判断是否有键按下;2能确定是哪个键被按下其软件管理主要分为以下三步来完成1判断整个键盘是否有键按下让所有的行为0,然后读列的数值如果列的数值全部为1,说明没有键被按下,否则说明有键被按下2识别被按下的键的位置采用一行一行的扫描方法,逐行输出0,然后读列的值如果列的数值全部为1,说明不是这一行的按键被按下,扫描下一行,如果列的数值不全为1,则说明被按下的按键时在这一行3查键值表,返回键值对应信息,以便确定各按键应该完成的功能采用某种算法,将被按下的键所在的行和列的信息合并成为一个信息,该信息即为此键的键值用相同的方法给每一个键确定键值在给按键确定键值时必须采用同一种算法,并且计算出来的键值应该是互不相同的本设计中各按键对应键值如表4-1所示表4-1按键键值表按键名称键值按键名称键值10x7e90x7d20xbe00xbb30xdeA0xdb40xeeB0xeb50x7dC0x7760xbdD0xb770xddE0xd780xedF0xe7键盘扫描子程序的流程图如图4-2所示图4-2键盘扫描程序流程图从流程图可以看出,此键盘识别程序是通过逐行扫描来确定是否有键按下,当确定某一行有键按下时,再在该行中确定被按下的是哪一个按键在本设计中,P
1.0~P
1.3为行输出口,P
1.4~P
1.7为列输出口初始时将P
1.0~P
1.3值赋为0,P
1.4~P
1.7赋为1,CPU始终扫描P1端口,当P1值不为0xf0时,有按键被按下,否责没有按键被按下在实际应用中,为了防止因为按键的抖动而使得一次按键按下被当做2次或者2次以上处理,应该进行按键消抖程序设计,只要方法是当有键闭合时,延时一段时间再确定是否还有键闭合,若有,则为键有效闭合,若无则为键无效闭合,返回重新扫描图4-3为CPU扫描第一行键盘的程序流程图单行键盘扫描能够准确确定被按下键所在的位置图4-3单行键盘扫描流程图在本设计中,各按键的功能与图3-5一样详见图
4.3显示模块子程序由于设计中要求能够显示密码输入界面、密码输入信息、密码正确后提示界面、密码错误后提示界面和修改密码相关界面等信息,故要用到很多个显示子程序来显示不同的内容虽然显示子程序很多,但是由于其显示原理都一样,所以我就不一一介绍各个子程序了,只要能够熟练使用LCD1602各个指令,这些大同小异的子程序也就不在话下了以下是LCD1602从第一行第一列开始显示N(0N≤16)个字符的程序流程图图4-4显示字符程序流程图显示模块子程序主要指根据LCD1602的命令和引脚功能来编写,程序逻辑相当简单
4.4掉电存储子程序掉电存储子程序就是将初始密码写进AT24C04,单片机每次复位后从AT24C04中读取密码用来和输入的密码进行比较,以判断输入的密码的正确性当密码修改成功后,将新密码写入AT24C04,以便单片机下次复位后使用掉电存储模块子程序主要涉及AT24C04的写操作方式和读操作方式AT24C04有2种不同的写操作形式和3种不同的读操作方式
4.
4.1写操作方式两种写操作方式为字节写和页写1字节写字节写模式下,主机发送(R/位置为0)起始命令和器件地址信息,主机在收到AT24C04的应答信号后,发送1~8位字节地址,写入AT24C04的地址指针中对于高于8位的地址,主机连续发送两个8位字节地址写入AT24C04中,主机在收到AT24C04的另外一个应答信号后再发送数据到被寻址的存储单元,AT24C04再次应答,并在主机发出停止信号后开始内部数据的擦写AT24C04在内部擦写过程中不响应主机的任何请求,因此在两次写操作之间应该留有足够的反应时间字节写的时序是这样的地址只有8位开始→器件地址→响应→8位字节地址→响应→数据→响应→停止地址高于8位开始→器件地址→响应→高8位字节地址→响应→低8位字节地址→响应→数据→响应→停止
(2)页写页写和字节写所不同的是字节写一次只能写入一个字节数据,页写一次可以写入8个或16个字节数据页写的时序是这样的地址只有8位开始→器件地址→响应→8位字节地址→响应→数据1→响应→……→数据N→响应→停止地址高于8位开始→器件地址→响应→高8位字节地址→响应→低8位字节地址→响应→数据1→响应→……→数据N→响应→停止三种不同的读操作方式为读当前地址内容(立即地址读取)、读随机地址内容(随机地址读取)和读顺序地址内容(顺序地址读取)
4.
4.2读操作方式1读当前地址内容AT24C04的地址计数器内容为最后操作字节的地址加1,所有如果上次读写操作的地址为N,采用读当前地址内容方式读地址应该从N+1地址处开始AT24C04接收到器件地址信号并且I2C总线允许接收数据(R/=1),则首先发送一个应答信号然后输出数据数据输出完毕后,主机发送停止信号,读操作完毕2读随机地址内容这种读操作方式允许主机读出AT24C04的任意字节主机置通过R/位为0,发送开始信号、AT24C04地址和欲读取的字节数据地址来执行一次伪操作,在AT24C04应答后,主机再一次发送开始信号和AT24C04的地址,此时R/位置1,AT24C04响应并应答信号,然后输出字节数据,最后主机以一个停止信号结束数据的读取3读顺序地址内容读顺序地址内容操作方式通过立即读或随机地址读操作来启动,主机在AT24C04发送完一个8位数据后产生一个应答信号,告知AT24C04主机要求更多数据AT24C04收到主机的应答信号后继续发送数据,直到主机不发送应答信号响应而发送停止信号后操作结束下面是三种不同的读操作方式时序对比读当前地址内容开始→读器件地址→响应→数据→无响应→停止读随机地址内容开始→写器件地址→响应→要读的字节地址→响应→开始→读器件地址→响应→数据→无响应→停止读顺序地址内容开始→写器件地址→响应→要读的字节地址→响应→开始→读器件地址→响应→数据1→响应→……→数据N→无响应→停止本次设计中采用的是读随机地址内容操作方式
4.5定时器中断子程序为了防止户主以外的“借用”户主的密码,当没有任何按键被按下的状态持续一段时间后(比如20S内),应该马上关闭显示器屏幕,同时禁止按键的输入这样做可以避免因为户主忘记退出系统而使他人有机可乘程序中,使定时器0每50毫秒产生一次中断,因此中断每产生20次为1秒,当秒数为20时(每次有键输入时都执行50毫秒数和秒数清0操作),关闭屏幕,并禁止键盘输入当定时/计数器工作在定时方式时,定时时间的计算公式为定时时间=(216—计数初值)×定时周期晶振频率为12MHz时,定时/计数器的定时周期为1µs,所以定时50ms的定时/计数器初值为计数初值=216—
500004.6密码输入子程序当从键盘输入密码时,应当将输入的密码存放,以便用做密码的相关操作(判断,修改和保存等),同时每输入一位密码应相应地在显示器上显示一个“*”号图4-8是密码输入子程序的流程图图4-5密码输入程序流程图输入密码时,当输入的密码位数小于6位的时候,每按下一次数字键,就将此数字存入数组当输入的密码位数不小于6位时,再次按下数字键,程序就不进行任何处理,继续扫描键盘,此时只有按下确定键或者取消键程序才做出相应反应取消键的功能是退格当不小心输错密码时,可以退格将输错的位清除,退格一次密码的位数减一位,同时显示器上的“*”个数也减1当输入的密码位数变为0时,取消键不再起作用
4.7报警子程序报警子程序的原理很简单,即当输入密码错误次数超过规定的最高允许次数时,不断给蜂鸣器脉冲,使其不断发音同时,由于CPU一直在给蜂鸣器提供脉冲,故无暇处理诸如密码扫描等事件,也就是说,在蜂鸣器报警的同时也屏蔽了键盘的输入图4-6学校·报警子程序流程图本次设计中,密码输入错误次数不得高于3次5课程设计总结本系统由单片机系统、矩阵键盘、LCD显示和报警系统组成系统能完成开锁、错误报警,超次锁定、修改用户密码,恢复初始密码基本的密码锁的功能除上述基本的密码锁功能外,还有声音提示等功能,依据实际的情况还可以添加遥控功能本系统利用单片机控制,LCD显示,配合蜂鸣器提示,系统成本低廉,功能强大实用但是在系统调试过程中,还是发现一些问题,系统不稳定情况时有发生,经过反复调试发现下列问题按键效果不好,产生较大状况的抖动,使软件消抖不完全;另外一个就是单片机本身不问题,引起系统跑飞或者卡死;还有就是由于电路板制作的原因,线路之间产生干扰,系统发生错误,比如液晶显示错误等等经过反复调试和修改,最好终于达到一个比较满意的水平本系统设计还做的不是太人性化,比如说能够加上语音提示和遥控开锁功能,将可能会更加有生命力!6参考文献
[1]张天凡.完全手册--51单片机C语言开发详解[M].电子工业出版社,2008
[2]李群芳.单片微型计算机与接口技术[M].北京电子工业出版社,2008
[3]彭伟单片机C语言程序设计实训100例—基于8051+Proteus仿真[M]北京电子工业出版社
2010.6
[4]张大明.单片机控制实训指导及综合应用实例[M].北京清华大学出版社,2004
[5]张齐,朱宁西.单片机应用系统设计技术—基于C51的Proteus仿真[M].北京化学工业出版社,
2004.
[6]沈光斌,刘冬,姚志成.单片机系统实用抗干扰设计.[M].北京人民邮电出版社,2004
[7]冯育长.单片机系统设计与实例分析.[M].西安西安电子科技大学出版社,2007
[8]晁阳.单片机MCS-51原理及应用开发教程[M].北京清华大学出版社,
2009.
[9]黄惟公邓成中王燕.单片机原理与应用技术[M].西安西安电子科技大学出版社,2009
[10]张萌和湘姜斌.单片机应用系统开发综合实例[M].北京:清华大学出版社,20097附录附录一总电路原理图附录二电子密码锁的PCB图附录三电子密码锁的实物图附录四元器件清单名称型号数量备注单片机AT89S521含双列直插插座电阻10K6电阻2202排阻9x10k1液晶显示器LM16021瓷片电容33pF2电解电容10uF1按键轻触按键18晶振
11.0592MHz1单排插针1x84发光二极管2红绿各一个直流插座1下载口1存储器At24c021三极管1附录五源程序清单#includereg
52.h#includestring.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedint#defineLCDIOP0#definedelay4us_nop_;_nop_;_nop_;_nop_;ucharbuffer
[6]={0};sbitsda=P3^4;sbitscl=P3^3;sbitbeep=P3^7;sbitrelay=P2^3;sbithuifu=P2^6;bitflag=0aa;//用户zi定时溢出标志位ucharDSY_BUFFER
[16]=;ucharDSY_BUFFER1
[16]=;ucharUserpassword
[6]={0};ucharMem
[6]={0};sbitrs=P2^0;sbitrd=P2^1;sbitlcden=P2^2;sbitled=P2^4;sbitled1=P2^7;ucharcodetable2[]=123456;ucharcodetable[]=Inputyourcode:;voiddelaymsuintz{uintxy;forx=z;x0;x--fory=110;y0;y--;}voiddelay//短延时,两个机器周期做总线的延时用{;;}voidwrite_comucharcom{rs=0;rd=0;lcden=0;P0=com;delayms3;lcden=1;delayms3;lcden=0;}voidwrite_dateuchardate{rs=1;rd=0;lcden=0;P0=date;delayms3;lcden=1;delayms3;lcden=0;}voidDisplay_Stringuchar*pucharcom{uchari;write_comcom;fori=0;i16;i++{write_datep[i];}}voidinit_lcd{lcden=0;write_com0x38;write_com0x0c;write_com0x06;write_com0x01;write_com0x80;Display_Stringtable0x80;Display_String===LockOK!======0xc0;}voidstart{sda=1;scl=1;delay4us;sda=0;delay4us;scl=0;}voidstop{sda=0;scl=1;delay4us;sda=1;delay4us;scl=0;}voidinit//初始化{sda=1;delay;scl=1;delay;}voidack{sda=0;scl=1;delay4us;scl=0;sda=1;}voidnoack{sda=1;scl=1;delay4us;scl=0;sda=0;}ucharrecbyte{ucharird;rd=0x00;sda=1;fori=0;i8;i++{scl=1;rd=1;rd|=sda;delay4us;scl=0;delay4us;}scl=0;delay4us;returnrd;}ucharsendbyteucharwd{uchari;bitack0;fori=0;i8;i++{sda=bitwd0x80;_nop_;_nop_;scl=1;delay4us;scl=0;wd=1;}delay4us;sda=1;scl=1;delay4us;ack0=!sda;scl=0;delay4us;returnack0;}ucharRecstringucharslaveucharsubaddruchar*bufferucharn{uchari;start;if!sendbyteslavereturn0;if!sendbytesubaddrreturn0;start;if!sendbyteslave+1return0;fori=0;in-1;i++{buffer[i]=recbyte;ack;}buffer[n-1]=recbyte;noack;stop;return1;}ucharSendstringucharslaveucharsubaddruchar*bufferucharn{uchari;start;if!sendbyteslavereturn0;if!sendbytesubaddrreturn0;fori=0;in;i++{if!sendbytebuffer[i]return0;}stop;return1;}voidclear_password{uchari;fori=0;i6;i++{Userpassword[i]=;}fori=0;i16;i++{DSY_BUFFER[i]=;}}ucharKeys_Scan{uchartempkeynum;P1=0x0F;delayms5;temp=P1^0x0F;//扫描行线值switchtemp{case1:keynum=1;break;case2:keynum=4;break;case4:keynum=7;break;case8:keynum=10;break;break;}P1=0xF0;delayms5;temp=P14^0x0f;switchtemp{case8:keynum+=0;break;case4:keynum+=1;break;case2:keynum+=2;break;case1:keynum+=12;break;break;}delayms600;returnkeynum;}voidmain{uchartempi=0j=0k=0nm=0flayerrorne=1;ucharIS_valid_user;relay=1;init;init_lcd;delayms5;P1=0x0f;while1{if!huifu==1{aa=Sendstring0xa01table26;delayms10;aa=Recstring0xa01buffer6;}elseaa=Recstring0xa01buffer6;ifP1!=0x0f{delayms10;ifP1!=0x0f{temp=Keys_Scan;switchtemp{case11:temp=0;case1:case2:case3:case4:case5:case6:case7:case8:case9:ifi=5//密码限制在6位以内{Userpassword[i]=temp;DSY_BUFFER[i]=*;Display_StringDSY_BUFFER0xc0;i++;}break;case19://按F键清除一位ifi!=0{i--;forn=0;ni;n++{DSY_BUFFER1[n]=temp+*;}}Display_StringDSY_BUFFER10xc0;break;case12://按Enter键开锁fork=0;k6;k++{ifbuffer[k]==Userpassword[k]+48flag=1;elseflag=0;}ifflag==1{flag=0;i=0;led=0;//点亮LEDrelay=0;//开锁clear_password;Display_StringOPENOK!0xc0;IS_valid_user=1;j=0;error=0;}else{j++;error++;led=1;//关闭LEDclear_password;Display_StringERROR!Retry:0xc0;write_com0xcf;write_date0x30+j;IS_valid_user=0;}i=0;break;case10://按Lock键上锁led=1;relay=1;//关闭锁clear_password;Display_Stringtable0x80;Display_String===LockOK!=====0xc0;i=0;IS_valid_user=0;break;case13://按C键设置新密码//如果是合法用户则提示输入新密码if!IS_valid_user{i=0;Display_String==Norights!==0xc0;delayms1000;Display_StringYourPassword...0x80;Display_String===LockOK!====0xc0;}else{i=0;newcode:Display_StringNewPassword:0x80;Display_String0xc0;}break;case16://按D键保存新密码if!IS_valid_user{i=0;Display_String==Norights!==0xc0;delayms1000;Display_StringYourPassword...0x80;Display_String===LockOK!====0xc0;}else{i=0;init;flay=1;//密码校验位置1delayms5;ifm0//在第二次输入密码{fork=0;k6;k++{flay=flayMem[k]==Userpassword[k]+48;//将第二次的密码与第一次的密码进行比较}}ifflay//如果校验位为1则第二次密码放入存储器{fork=0;k6;k++{Userpassword[k]=Userpassword[k]+48;}fork=0;k6;k++{Mem[k]=Userpassword[k];//密码放入缓冲区便于比对ne=neUserpassword[k+1]==Mem[k];}ifne{Display_StringCodeissamenum0x80;//Display_String0xc0;delayms1000;Mem
[6]=0;DSY_BUFFER
[6]=0;m=0;gotonewcode;}else{clear_password;Display_Stringtable0x00;Display_StringPasswordSaved!0xc0;delayms1000;m++;ifm2gotonewcode;//如果没有到第二次就继续输入else{aa=Sendstring0xa01Mem6;delayms5;aa=Recstring0xa01buffer6;delayms5;Display_StringNewcodeconfirm0x80;Display_StringWilllockagain……0xc0;Mem
[6]=0;m=0;}}}else//如果两次密码输入不一致,显示错误提示,密码不保存{Display_StringCodeiswrong0x80;Display_StringCodenotbesaved0xc0;Userpassword
[6]=0;Mem
[6]=0;DSY_BUFFER
[6]=0;m=0;aa=Sendstring0xa01Mem6;delayms5;aa=Recstring0xa01buffer6;delayms5;break;}}break;case22://按E键消除所有输入i=0;clear_password;Display_String0x80;Display_String0xc0;break;}P1=0x0f;}}ifj==3//错误三次报警1S并显示{Display_StringYouarethief!0x80;Display_StringTHIEF!!!THIEF!!!0xc0;relay=1;fori=0;i200;i++{beep=!beep;led1=0;delayms5;}iferror5//如果错误次数达到五次长鸣报警,并清除显示while1{Display_String0x80;Display_String0xc0;relay=1;while1{led1=!led1;beep=!beep;delayms2;}}}}}初始化显示输入密码界面输入密码密码正确?开锁扫描功能键有键输入?是改密键?进行改密操作显示界面是闭锁键?进行闭锁操作YNYNNY开启定时中断次数3?调用报警子程序YNYN确定被按下的键在第二行?YN确定被按下的键在第三行?YN确定被按下的键在第四行中确定被按下的键返回对应的按键号在第一行?开始扫描键盘有键按下?YN开始扫描端口YN有键闭合?延时有键闭合?查表确定按键YNI/O口初始化返回按键值结束开始调用写数据函数YN显示N个字符了吗?LCD初始化结束开始N有键输入?扫描键盘Y是数字键?输入的密码长度小于6?将输入的数放入数组在显示器上显示“*”是取消键?输入的密长度大于0?清除数组中的最后一位数清除显示器上的最后一个“*”是确认键?结束YNNNNYYYNY。