资源描述
- .
学 号:202114040215
HEBEI UNITED UNIVERSITY
单片机课程设计说明书
设计题目:简易电子密码锁
学生:红辉
专业班级:测控技术及仪器2
学 院:电气工程学院
指导教师:晓华
2021年06月05日
成绩评定表
指导教师评语:
答 辩 成 绩:〔占总成绩60%〕
说明书 成 绩: 〔占总成绩40%〕
摘 要
在日常的生活和工作中, 住宅与部门的平安防、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的方法来解决。假设使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丧失后平安性即大打折扣。随着科学技术的不断开展,人们对日常生活中的平安保险器件的要求越来越高。为满足人们对锁的使用要求,增加其平安性,用密码代替钥匙的密码锁应运而生。密码锁具有平安性高、本钱低、功耗低、易操作等优点。
在平安技术防领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克制了机械式密码锁密码量少、平安性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。随着大规模集成电路技术的开展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的平安性、可靠性,应用日益广泛。
本课程设计介绍了基于单片机电子密码锁的设计,该设计硬件主要由AT89C52最小系统、矩阵电路、1602LCD显示电路、电源电路和报警电路等几局部组成。软件主要由C语言编程。该密码锁由单片机技术,通过矩阵电路设置、修改密码、保护密码,并由LCD显示密码输入,从而实现对密码的设置、保护。
关键词: 单片机, 密码锁, 1602,最小系统,矩阵键盘
. word.zl.
- .
Abstract
In daily life and work, the department of housing and security, unit documents, financial statements and some personal information to save more in order to lock the ways to solve. If use the traditional mechanical key to open the lock, people often need to carry multiple keys, use very convenient, and the key missing after security is promised. With the continuous development of science and technology, people in daily life the demand is higher and higher safety insurance device. To meet the requirements of people on the use of the lock, increase its safety, use the password instead of the key bination lock arises at the historic moment. bination lock with high safety, low cost, low power consumption, easy operation, etc.
In the field of security technology to guard against, with electronic bination lock anti-theft alarm function gradually replace the traditional mechanical bination lock, overing the mechanical bination lock password quantity is little, the shortings of poor safety performance, make the bination lock both in technology and step in performance are improved greatly. With the development of large scale integrated circuit technology, especially the single chip microputer, appeared with the intelligent bination of the microprocessor, it besides has the function of electronic bination lock, also introduced the intelligent management, expert analysis system, and other functions, so that the bination lock of high security, reliability, and increasingly widely used.
The course design of electronic bination lock based on MCU is introduced, the design of the hardware is mainly posed of AT89C52 minimum system, matrix circuit, 1602 LCD display circuit, power circuit and alarm circuit and so on several parts. Software is mainly posed of C language programming. The bination lock by the single chip microputer technology, through the matrix circuit setting, change passwords, password protection, and by the LCD display password input, so as to realize the password Settings, protection.
Key words: single chip microputer, trick lock, the 1602, the smallest system, matrix keyboard
目 录
摘 要I
ABSTRACTII
第1章 绪论7
1.1电子密码锁的现状与开展7
1.1.1电子密码锁的现状7
1.1.2电子密码锁的开展7
1.2电子密码锁的特色7
第2章 电子密码锁的工作原理及总体设计..............................................................8
2.1电子密码锁的工作原理8
2.2总体构造的设计8
第3章 硬件系统设计9
3.1单片机最小系统和数据输入9
3.1.1单片机最小系统9
3.1.2矩阵键盘的设计与初始数据的输入11
3.2 数据的输出与显示12
3.3报警电路16
3.4硬件电路图17
第4章仿真与调试19
4.1 程序流程...........................................................................................................................19
4.2 仿真结果...........................................................................................................................20
总结23
参考文献25
附件
第1章 绪论
1.1电子密码锁的现状和开展
1.1.1电子密码锁的现状
当今智能电子密码锁开展已经到了非常高的境界,由于电子元件特别是单片机应用在这几年得到空前开展,无论功能性,稳定性都比拟全面,在方面已做到人眼识别,指纹识别,人声识别根本上电影上有的现实也有。在国外开展比拟早,所以应用也比拟广泛,主要在家庭装较贵重地方,银行,保险柜等应用较多,在国这方面开展也较快,不管自己开发或是引进都有,在重要地方应用也较多,由于价钱比普通弹子锁较贵,早几年应用较少,现在越来越普及到平常化,未来的开展也会越来越被群众采用,由于它的功能、平安是弹子锁无法相比的。开展前境是非常大的。
1.1.2电子密码锁的开展
现在,电子密码锁适用于各个领域,尤其在国民建立,和军事领域具有突出奉献。现在的密码锁的信息包括了数字、字符、图形图像、人体生物特征和时间等,对电子锁的要求也越来越高。电子技术必是各国开展的优先技术。
1.2电子密码锁的特色
性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。密码可变。 用户可以经常更改密码,防止密码被盗,同时也可以防止因人员的更替而使锁的密级下降。误码输入保护。当输入密码屡次错误时,报警系统自动启动。电子密码锁操作简单易行,一学即会。干扰码功能 在输入正确密码前可输入任意码。出门时无需其他操作,只需一次的把手动作,可机械的开启门,所以遇到火灾等应急状况下也迅速,平安的开启门。
第2章 电子密码锁的工作原理及总体设计
2.1 电子密码锁的工作原理
本设计采用STC89C52单片机为主控芯片,结合外围电路矩阵键盘、液晶显示器LCD1602和密码存储AT24C02等局部组成。其中矩阵键盘用于输入数字密码和进展各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进展比照,从而判断密码是否正确,然后控制引脚的上下电平传到开锁电路或者报警电路控制开锁还是报警,组成的电子密码锁系统,能够实现:
1.完全正确输入四位密码的前提下,有开锁提示;
2.错误输入密码情况下,开锁密码错3次要报警,报警期间输入密码无效。
3.用户可以自行设定和修改密码;
STC89c52
晶振电路
矩阵键盘
显示电路
报警电路
复位电路
图2-1 总体框图
2.2 电子密码锁的总体框图
第三章 硬件系统设计
3.1 单片机最小系统和数据输入
3.1.1 单片机最小系统
选用单片机作为系统的核心部件,实现控制与处理的功能。单片机具有资源丰富、速度快、编程容易等优点。利用单片机部的随机存储器〔RAM〕和只读存储器〔ROM〕及其引脚资源,外接液晶显示〔LCD〕,键盘输入等实现数据的处理传输和显示功能,根本上能实现设计指标。
本设计采用AT89c52单片机,89C52是INTEL公司MCS-51系列单片机中根本的产品,它采用ATMEL公司可靠的CMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。它结合了CMOS的高速和高密度技术及CMOS的低功耗特征,它基于标准的MCS-51单片机体系构造和指令系统,属于89C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。89C52置8位中央处理单元、512字节部数据存储器RAM、8k片程序存储器〔ROM〕32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断构造,一个全双工串行通信口,片时钟振荡电路。此外,89C52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停顿,同时停顿芯片其它功能。
图3-11 P0口外接排阻
图3-12 最小系统电路图
如图3-12为单片机最小系统,硬件最小系统:由电源、主板和CPU、存组成.在这个系统中,没有任何信号线的连接,只有电源到主板的电源连接.由于设计本电路图所使用的软件为Protues,且电源和电源地脚为自动隐藏所以电源局部也是在其中的。如图3-11所示。51单片机的P0 端口为开漏输出,部无上拉电阻。所以在当做普通I/O 输出数据时,由于V2 截止,输出级是漏极开路电路,要使“1〞信号〔即高电平〕正常输出,必须外接上拉电阻。
图3-13
在单片机系统中,复位电路是非常关键的,当程序跑飞〔运行不正常〕或死机〔停顿运行〕时,就需要进展复位。MCS-5l系列单片机的复位引脚RST〔第9管脚〕出现2个机器周期以上的高电平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。复位操作通常有两种根本形式:上电自动复位和开关复位。图3-13中所示的复位电路就包括了这两种复位方式。上电瞬间,电容两端电压不能突变,此时电容的负极和RESET相连,电压全部加在了电阻上,RESET的输入为高,芯片被复位。随之+5V电源给电容充电,电阻上的电压逐渐减小,最后约等于0,芯片正常工作。并联在电容的两端为复位按键,当复位按键没有被按下的时候电路实现上电复位,在芯片正常工作后,通过按下按键使RST管脚出现高电平到达手动复位的效果。一般来说,只要RST 管脚上保持10ms 以上的高电平,就能使单片机有效的复位。图中所示的复位电阻和电容为经典值,实际制作是可以用同一数量级的电阻和电容代替,读者也可自行计算RC 充电时间或在工作环境实际测量,以确保单片机的复位电路可靠。
3.1.2 数据的输入
鉴于单片机的I/O口的限制,本次选用矩阵键盘的输入,如下列图所示:
图3-21矩阵键盘
阵式键盘由行线和列线组成,按键位于行、列的穿插点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,单片机通过检测行或列线上的电平变化可以确定哪个按键被按下。矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。矩阵键盘的检测方法有多种,常见的有:逐点扫描法、逐行扫描法、全局扫描法。
在本实例中我们采用逐行扫描法来实现按键检测,其中P3.0-P3.3作为行线,P3.4-P3.7作为列线。识别过程如下
1、判断键盘中是否有键按下。设置所有行线为输出口,并输出低电平;设置列线为输入口,读取列线上的电平状态,只要有一列的电平为低,就表示有按键按下,并且被按下的键位于电平为低的列线与4跟行线相穿插的4个按键中,假设所有列线都为高电平,表示没有按键按下;
2、判断被按下按键所在的位置。在确认有键按下后〔进展按键消抖处理后〕,接下来就是确定具体哪个案件被按下,方法是:依次将每根行线设置为输出口,并输出低电平〔同时剩余行线输出高电平〕,然后逐列检查每根列线的电平状态,假设某列为低电平,那么该列线与设置为输出低电平的行线穿插处的按键就是被按下的按键。
3、按键位置确定后,接下来就要给矩阵键盘中的每个按键进展编号,也就是进展按键编码,程序设计中常用计算法和查表法两种方式对按键进展编码。,程序设计中常用计算法和查表法两种方式对按键进展编码。
本实例采用计算法编码。从上面的电路图中我们可以看到,键盘的所有行线接到了P3.0-P3.3口,51单片机上电后为高电平,这是确保在没有按键按下的时候,I/O口的电平状态始终为高电平,从而消除外界干扰。对于51单片机来说,我们可以将P3.4-P3.7口分别不同置为低电平,当有按键按下时可以比拟P3.0-P3.7的压值,那么可以得出是哪个键按下并且可以赋予相应的值。并可以读入单片机中,继续相应的操作。
3.2 数据的输出和显示
在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比拟常用,软硬件都比拟简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器〔CRT〕那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来到达显示的目的,在重量上比一样显示面积的传统显示器要轻得多。功耗低相对而言,液晶显示器的功耗主要消耗在其部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
图3-2LCD1602显示电路
如图3-21所示,本次设计采用的是LCD1602,工业字符型液晶,能够同时显示16x02即32个字符。〔16列2行〕
注:为了表示的方便 ,后文皆以1表示高电平,0表示低电平。
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由假设干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形〔用自定义CGRAM,显示效果也不好〕。1602LCD是指显示的容为16X2,即可以显示两行,每行16个字符液晶模块〔显示字符和数字〕。市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全一样的,因此基于HD44780写的控制程序可以很方便地应用于市面上大局部的字符型液晶。
1602采用标准的16脚接口,其中:
第1脚:GND为电源地
第2脚:VCC接5V电源正极
第3脚:V0为液晶显示器比照度调整端,接正电源时比照度最弱,接地电源时比照度最高〔比照度过高时会 产生“鬼影〞,使用时可以通过一个10K的电位器调整比照度〕。第4脚:RS为存放器选择,高电平1时选择数据存放器、低电平0时选择指令存放器。第5脚:RW为读写信号线,高电平(1)时进展读操作,电平(0)时进展写操作。第6脚:E(或EN)端为使能(enable)端,高电平〔1〕时读取信息,负跳变时执行指令。
第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。
特性:
3.3V或5V工作电压,比照度可调
含复位电路
提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能
有80字节显示数据存储器DDRAM
建有192个5X7点阵的字型的字符发生器CGROM
8个可由用户自定义的5X7的字符发生器CGRAM
1602液晶模块部的字符发生存储器〔CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比方大写的英文字母“A〞的代码是01000001B〔41H〕,显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A〞。
在单片机编程中还可以用字符型常量或变量赋值,如'A’。因为CGROM储存的字符代码与我们PC中的字符代码是根本一致的,因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1=‘A’这样的方法。PC在编译时就把'A'先转换为41H代码了。
CGROM中字符码与字符字模关系对照表
字符代码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。
0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。
以下是1602的16进制ASCII码表地址:读的时候,先读左边那列,再读上面那行,如:感慨号!的ASCII为0x21,字母B的ASCII为0x42〔前面加0x表示十六进制〕。本设计将1602的数据/命令端接到单片机的P1.5端,使能端接到P1.4口,读写端直接接地,本次使用只用其写的功能。1602的数据端接到单片机的P0端。通过程序即可将单片机从矩阵键盘读入的数据显示到1602上面。
3.3 报警电路
本次设计使用的蜂鸣器作为警报装置,电路图如下:
图3-3 报警电路
由于自激蜂鸣器是直流电压驱动的,不需要利用交流信号进展驱动,只需对驱动口输出驱动电平并通过三极管放大驱动电流就能使蜂鸣器发出声音,很简单,这里就不对自激蜂鸣器进展说明了。这里只对必须用1/2duty 的方波信号进展驱动的他激蜂鸣器进展说明。
单片机驱动他激蜂鸣器的方式有两种:一种是PWM 输出口直接驱动,另一种是利用I/O 定时翻转电平产生驱动波形对蜂鸣器进展驱动。
PWM 输出口直接驱动是利用PWM 输出口本身可以输出一定的方波来直接驱动蜂鸣器。在单片机的软件设置中有几个系统存放器是用来设置PWM 口的输出的,可以设置占空比、周期等等,通过设置这些存放器产生符合蜂鸣器要求的频率的波形之后,只要翻开PWM 输出,PWM 输出口就能输出该频率的方波,这个时候利用这个波形就可以驱动蜂鸣器了。比方频率为2000Hz 的蜂鸣器的驱动,可以知道周期为500μs,这样只需要把PWM 的周期设置为500μs,占空比电平设置为250μs,就能产生一个频率为2000Hz 的方波,通过这个方波再利用三极管就可以去驱动这个蜂鸣器了。
而利用I/O 定时翻转电平来产生驱动波形的方式会比拟麻烦一点,必须利用定时器来做定时,通过定时翻转电平产生符合蜂鸣器要求的频率的波形,这个波形就可以用来驱动蜂鸣器了。比方为2500Hz 的蜂鸣器的驱动,可以知道周期为400μs,这样只需要驱动蜂鸣器的I/O 口每200μs 翻转一次电平就可以产生一个频率为2500Hz,占空比为1/2duty 的方波,再通过三极管放大就可以驱动这个蜂鸣器了。本次设计采用的是通过三极管来驱动蜂鸣器,并且有单片机延时产生脉冲电流来让蜂鸣器实现报警功能。
3.4 硬件总体电路图
本次设计采用89c52单片机作为主控芯片,结合矩阵键盘,蜂鸣器电路,LCD1602显示,做成的简易密码锁设计的总电路图如下所示:
图3-4
第四章 仿真与调试
4.1 程序流程
本次设计的总体思路为:开机后有1602显示电路提示输入密码,密码初始化为“0123〞,然后可以通过矩阵键盘输入,并通过1602显示所输入的密码的容,当密码输入4位后,自动进入比拟函数,如果密码正确那么通过1602显示“Wele back〞,如果密码输入错误,那么再次显示输入密码,并且记错一次,记错到达三次后,开场报警,并且输入无效。修改密码设置独立按键,按下后可以改密码,输入4位密码后自动保存,由于本设计没有用到掉电后数据不丧失的存储芯片,所以修改后只有在程序运行时有效。程序流程图如下:
开场
修改密码
承受新密码
密码是否正确
检测是否有输入密码
密码锁开启
错误次数相加
次数是否>3
报警且其它输入无效
是
否
否 是
否
是
否图4-1 程序流程图
4.2 仿真结果
当开场仿真时那么1602液晶显示为“pass word!〞如下列图4-21所示:
图4-21 仿真开场显示
其中液晶显示后面【1】,代表第几次输入。
当密码输入正确时仿真结果如图4-22:
图4-22 密码输入正确
当密码输入错误时,那么再次显示输入密码,并且液晶后面的数字显示会加1,如图4-23所示:
图4-23 密码输入错误时
当输入密码连续错3次后,那么会报警,如图4-24:
图4-24 报警仿真
当按下修改密码键的时候,液晶那么会显示修改密码,并且显示你所修改的密码,如图4-25所示:
图4-25 修改密码仿真
密码修改成功后,回到输入密码界面。
第五章 总结
通过此次课程设计,使我更加扎实的掌握了有关单片机方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经历缺乏。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获龋最终的检测调试环节,本身就是在践行“过而能改,善莫大焉〞的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在教师的指导下,终于游逆而解。在今后社会的开展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进展解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了常用元件的识别和测试;熟悉了常用仪器、仪表;了解了电路的连线方法;以及如何提高电路的性能等等,掌握了焊接的方法和技术,通过查询资料,也了解了密码锁的构造及原理。
我认为,在这一周的课设时间,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实践中,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰辛奋斗一样,我们都可以在实验完毕之后变的更加成熟,会面对需要面对的事情。
回忆起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以稳固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会效劳,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。
本次设计让我认识到了,做事不能马虎,一件事的全部可能问题就出现在某一点上面。在本次课程设计中,由于时间较短,来不及搭建硬件,就使用了开发板进展程序调试,由于开发板的端口限制,矩阵键盘和液晶显示的控制有一样的端口,这就导致有些功能完成不了,例如在调试用液晶显示输入的密码时,由于同时使用的P3.4和P3.5,导致了输入密码是液晶无法显示输入的东西,并且按键按下时液晶的光标也乱跑。由于我的粗心,没有仔细想这个原因,就在程序的时序语句上修改,结果修改的半天也是没有进展白白的浪费了时间。后来仔细思考才发现是端口共用的结果,于是我就把液晶的端口改到别的地方去了。再调试程序,当然是符合自己的想法了。
此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。
参考文献
1 、郭天祥主编,51单片机C语言教程,电子工业。2021.1
2、丁元杰主编.单片微型计算机.:机械工业.2003
3、广第主编.单片机根底.:航天工业.2002
4、单片机原理及应用,鑫等,电子工业
5、MCS51单片机应用设计,毅刚等,工业大学
6、MCS51系列单片机实用接口技术,华等,航天航空大学
7、PROTEL2004电路原理图及PCB设计,清源科技,机械工业
8、基于MCS-51系列单片机的通用控制模块的研究,卫芳,科技大学,
9、单片机应用技术选编,何立民,航空航天大学,2000
附录
程序代码:
主程序〔密码锁.c〕:
#include <reg52.H>
#define uc unsigned char
#define ui unsigned int
#include "key.c"
#include "yejing.c"
#include"head.h"
sbit beep=P2^3;
sbit key=P2^0;
uc code table1[]="pass word!";
uc table[4]={'0','1','2','3'} ; //密码
uc table2[]="Wel back!";
uc table4[]="ALARM!";
uc table5[]="chang mima!";
uc m,ronum,flag,mitu,miro;
void chushi()
{
write_zhiling(0x80+2);
for(m=0;m<10;m++)
{
write_date(table1[m]);
delay(5);
}
write_date('[');
write_date(table3[ronum+1]);
write_date(']');
write_zhiling(0x0e);
write_zhiling(0x80+40);
}
void alrm()
{
beep=0;
delay(500);
beep=1;
delay(500);
}
void bijiao()
{
if(mima[0]==table[0]&&mima[1]==table[1]&&mima[2]==table[2]&&mima[3]==table[3])
{mitu=1;}
else
{miro=1;ronum++;P1=0xff;}
}
void panduan() //输入密码
{
if(ronum<3)
{
if(a<4) //密码位数
{
keyscan();
flag=1;
}
else
{
if(flag==1)
{
bijiao(); //比拟密码
flag=0;
}
}
if(mitu==1) //密码正确
{
write_zhiling(0x01); //清屏
delay(50);
write_zhiling(0x80+2);
for(m=0;m<12;m++)
{
write_date(table2[m]); //欢送
delay(5);
}
ronum=0;
mitu=0;
}
if(miro==1) //密码错误
{
write_zhiling(0x01);
csh();
chushi(); //初始化
a=0;
miro=0;
}
}
if(ronum>=3)
{
write_zhiling(0x01); //错误超过三次,警报
write_zhiling(0x80+4);
for(m=0;m<6;m++)
{
write_date(table4[m]);
delay(5);
}
alrm();
}
}
void change() //修改密码
{
if(b<4)
{
keyscan();
}
else //修改成功
{
xiugai=0;
write_zhiling(0x01);
csh();
chushi();
}
}
void main()
{
csh();
chushi();
while(1)
{
if(key==0) //修改密码键
{
delay(10);
if(key==0)
{
xiugai=1; //修改判断
}
while(!key);
write_zhiling(0x01);
write_zhiling(0x80+2);
for(m=0;m<11;m++)
{
write_date(table5[m]);
delay(5);
}
write_zhiling(0x80+40);
}
if(xiugai==0)
panduan(); //比照输入密码
if(xiugai==1)
change(); //修改密码
}
}
键盘扫描程序〔key.c〕
#include"head.h"
uc mima[4];
uc a,b,xiugai;
uc table[4];
uc code table3[]={'0','1','2','3','4','5','6','7','8','9'};
void delay(ui x)
{
ui y ,z;
for(y=x;y>0;y--)
for(
展开阅读全文