1 引 言
1.1 电子密码锁简介
电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已经大大超过了机械锁。其特点如下: (1)保密性好,编程量多,远远大于弹子锁。随机开锁成功率几乎为零。 (2)密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免
人员的更替而使锁的密级下降。
(3)误码输入保护,当当输入密码多次错误时,报警系统自启动。 (4)无活动零件,不会磨损,寿命长。
(5)使用灵活性好,不像机械锁必须佩带钥匙才能开锁。 (6)电子密码锁操作简单易行,一学即会。
1.2 电子密码锁的发展趋势
在日常生活和工作中,住宅与部门的安全防患、单位的文件档案、财务报表
以及一些个人资料的保存多以加锁的方法解决。目前门锁主要用弹子锁,其钥匙容易丢失;保险箱主要用机械密码锁,其结构较为复杂,制造精度要求高,成本高,且易出现故障,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。针对这些所具给人们带来的不便若使用机械式钥匙开锁,为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。它的出现为人们的生活带来了很大的方便,有很广阔的市场前景。由于电子器件所限,以前开发的电子密码锁,其种类不多,保密性差,最基本的就是只依靠最简单的模拟电子开关来实现的,制作简单但很不安全,在后为多是基于EDA来实现的,其电路结构复杂,电子元件繁多,也有使用早先的20引脚的2051系列单片机来实现的,但密码简单,易破解。随着电子元件的进一步发展,电子密码也出现了很多的种类,功能日益强大,使用更加方便,安全保密性更强,由以前的但密码输入发展到现在的,密码加感应元件,实现了真正的电子加密,用户只有密码或电子钥匙中一样,是打不开锁的,随着电子元件的发展及人们对保密性需求的提1高出现了越来越多的电子密码锁。
1
出于安全、方便等方面的需要许多电子密码锁已相继问世。但这类产品的特点是针对特定有效卡、指纹或声音有效,且不能实现远程控制,只能适用于保密要求高且供个人使用的箱、柜、房间等。由于数学、字符、图形图像、人体生物特征和时间等要素均可成为钥匙的电子信息,组合使用这些信息能够使电子防盗锁获得高度的保密性,如防范森严的金库,需要使用复合信息密码的电子防盗锁,这样对盗贼而言是“道高一尺,魔高一丈”、组合使用信息也能够使电子防盗锁获得无穷扩展的肯,是产品多样化,对用户而言是“千挑百选、自得其所\"。可以看出组合使用电子信息是电子密码锁以后的发展的趋势。
1.3设计目的与任务:
学生通过理论设计和实物制作解决相应的实际问题,巩固和运用在《单片机技术》中所学的理论知识和实验技能,掌握单片机应用系统的一般设计方法,提高设计能力和实践动手能力,为以后从事电子电路设计、研发电子产品打下良好的基础。
1.4设计内容与要求
设计一个具有特定功能的密码锁。该密码锁上电或按键复位后能自动显示系统提示符“P.”, 进入准备工作状态。该密码锁具有系统原始密码888888,用户可以设定并存储用户密码,密码输入时应处于保密显示状态,密码输入正确时应显示密码输入正确提示信息,否则,显示密码输入错误提示信息。
1.5本设计所要实现的目标
本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,该电子密码锁有个管理员密码和三个用户密码,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误有提示,为了提高安全性,当密码输入错误三次将报警。密码可以由用户自己修改设定,锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。当用户不记得密码时可通过专业认证服务用管理员密码使密码锁恢复出厂设置。
1.6设计总体方案及工作原理说明
采用以单片机为核心的控制方案,总体框图见图1.1.
由于单片机总类繁多,各种型号都用一定的应用环境,因此在选用时要多加比较,合理选择,以期获得最佳的性价比。一般来说在选择单片机时下面几个方面考虑:性能、存储器、运行速度、I/O口、定时/计数器、串行接口、模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除了以上的一些还有
2
一些最基本的比如:中断源的数量和优先级、工作温度范围、有没有低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。在开发过程中单片机还受到:开发工具、编程器、开发成本、开发人员的适应性、技术支持
和服务等等因素。基于以上因素本设计选用单片机AT89S52作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,以及控制的准确性,实现基本的密码锁功能。在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接24C02B芯片用于密码的存储,外接LCD1602A显示器用于显示作用。当用户修要开锁时,先按键盘用户键之后按键盘的数字键0-9输入密码。密码输入完成后按下确认键,如果密码输入正确则开锁,不正确显示密码错误从新输入密码,当三次输入密码错误时则发出报警;当用户需要修改密码时,先按下用户键后再按设置键,接着输入原来的密码,只有当输入的原密码正确后才能设置新密码。新密码输入后按下确认键后系统要求再次输入新密码接着按下确认键当两次密码输入相同时新密码将得到存储,密码修改成功。
报警电路电源输入开锁电路显示电路密码存储电路AT89S52复位电路键盘输入晶振电路 图1.1 设计总体框图
3
2 硬件系统的设计
2.1设计原理
本设计主要有单片机、矩阵键盘、液晶显示器和密码存储部分构成。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由显示灯换成电子密码锁的电磁铁吸合线圈即可,当然也可以用继电器的常开触点去控制电磁铁吸合线圈。 本系统共由两部分构成,及硬件部分和软件部分。其中硬件部分由电源输入口,键盘输入部分,密码存储部分,复位电路,晶振电路,显示部分,报警部分,开锁部分组成。软件部分对应的由主程序,初始化程序,LCD显示程序,键盘扫描程序,启动程序,关闭程序,键功能程序,密码设置程序,E2PROM读写程序和 延时程序等组成。其原理框图如图2.1所示
报警电路电源输入开锁电路显示电路密码存储电路AT89S52复位电路键盘输入晶振电路 图2.1 电子密码锁原理框图
2.2电路总体构成
在确定了选用什么型号的单片机后,就要确定外围电路。其外围电路包括电源输入口、键盘输入部分、密码存储部分、复位部分、晶振部分、显示部分、报
4
警部分、开锁部分。根据实际情况键盘输入部分选择4×4矩阵键盘,显示部分选择字符型液晶显示LCD1602,密码存储部分选用AT24C02芯片来完成。其原理图见附录1。
2.2.1键盘输入部分
按键采用矩阵式排列的独立式按键键盘,它由行线和列线组成,按键位于行列的交叉点上,密码锁的密码有按键输入完成,本设计中使用的这个4×4键盘不但能完成密码的输入还能作为特别功能键使用,比如清空显示功能等,键盘的每个按键功能在程序设计中设置。其大体功能(看按键上的标志)及与单片机引脚接法见附录1原理图。
2.2.2密码存储部分
用E2PROM芯片AT24C02存储密码。AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,内含256×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)、抗干扰能力强、数据不易丢失、体积小等特点。而且它是采用了I2C总线式进行数据读取的串行器件,占用很少的资源和I/O线,并且支持在线编程,进行数据实时的存储十分方便。AT24C02中带有的片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。I2C总线式一种用于IC器件之间连接的二线制总线。它通过SDA及SCL两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件。AT24C02正是运用了I2C规程,使用主/从机双向通信,主机和从机均可工作于接收器和发送器状态。主机产生串行时钟信号并发出控制字,控制总线的传送方向,并产生开始和停止的条件。无论是主机还是从机,接收到一个字节后必须发出一个确认信号ACK。AT24C02的控制字有8位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线的传送方向。其接线见附录1原理图。
2.2.3复位部分
单片机复位是使CPU和系统的其他功能部件处在一个正确的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第一个单元去指令。无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。在复位期间(RST为高电平期间),P0口为高组态,P1-P3口输出高电平:外部程序存储器读选通信号PSEN无效。地址锁存信号ALE也为高电平。复位电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容上的电压很小,复位
5
下拉电阻上的电压接近电源电压,即RST为高电平,在电容充电的过程中RST端电压逐渐下降,当RST端的电压小于某一数值后,CPU脱离复位状态,由于电容足够大,可以保证RST高电平有效时间大于24个振荡周期,CPU能够可靠复位。增加手动复位按键式为了避免死机时无法可靠复位。当复位按键按下后电容通过电阻放电,当电容放电结束后,RST端的复位由两电阻分压比决定。由于两电阻的电阻值差距大,因此RST为高电平,CPU处于复位状态。其接线见附录1原理图。
2.2.4晶振部分
AT89S52引脚XTAL1和XTAL2与晶体振荡器及其两电容的接线见附录1原理图。晶振、电容及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容的容量有关,但主要有晶振频率决定,范围在0 ~33MHz之间,电容取值范围在5 ~30pF之间。根据实际情况,本设计采用12MHz作为系统的外部晶振。电容取值为20pF。
2.2.5显示部分
为了提高密码锁的密码显示效果能力。本设计的显示部分由液晶显示器LCD1602取代普通的数码管来完成。只有按下电源开关后,显示器才处于开启状态。同理只有按下电源开关后显示器才处于关闭状态。否则显示器将一直处于初始状态,当需要对密码锁进行开锁时,按下键盘上的开锁按键后利用键盘上的数字键0-9输入密码,每按下一个数字键后再显示器上显示一个*,输入多少位就显示多少个*,当密码输入完成时,按下确认键,如果输入的密码正确的话,显示真确的提示信息,单片机其中P1.2脚会输出高电平,使密码锁打开,如果密码不正确,就会显示错误的信息,盘P1.2脚输出的是低电平,电子密码锁不能打开,通过LCD显示屏,可以清楚的判断出锁所处的状态。其显示部分引脚接口见附录1原理图。
2.2.6报警部分
报警部分由发声装置及外围电路组成,加电后不发声,当有键按下时,“嗡”声,每按一下,发声一次,密码正确时,不发声直接开锁,当密码输入错误时,单片机的P1.3引脚为高电平,导通蜂鸣器发出噪鸣声报警。其图见附录1原理图。
2.2.7开锁部分
开锁控制电路的功能是当密码输入正确后将锁打开。系统使用单片机其中一引脚线发出信号,驱动外围电路将锁打开。用户通过按键任意设置密码,并存储在
6
E2PROM中作为锁码指令。开锁步骤如下:首先按下键盘上的用户按键,然后利用键盘上的数字键0-9输入密码,最后按下确认键。当用户输入一密码后,单片机自动识别,如果识别不符,则报警。只有当识别正确,单片机才能控制开锁电路将锁打开。完成本次开锁后,单片机自动清除掉由用户输入的这个密码。电路图见附录1原理图。
2.3图纸及元器件清单
设计电路原理图、PCB图、元器件布局图分别见附录1、附录2、附录3。 设计课题元器件清单见附录4。
2.4主要元器件介绍
2.4.1主控芯片AT89S52
AT89S52时一种低功耗,高性能CMOS 8位单片机,片内含8K字节 ISP的可反复擦写1000次的flash只读程序存储器,器件采用ATMEL 公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash 存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。 AT89S52 性能简介:
AT89S52具有如下特点:40个引脚,8K字节Flash片内程序存储器,256字节的随机存储数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89S52设计和配置了振荡频率可为0Hz可通过软件设置省电模式,空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需要。
2.4.2存储芯片AT24C02
AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,内含256×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)、抗干扰能力强、数据不易丢失、体积小等特点。而且它是采用了I2C总线式进行数据读取的串行器件,占用很少的资源和I/O线,并且支持在线编程,进行数据实时的存储十分方便。AT24C02中带有的片内地址寄存器。每写入或读
7
出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。I2C总线式一种用于IC器件之间连接的二线制总线。它通过SDA及SCL两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件。AT24C02正是运用了I2C规程,使用主/从机双向通信,主机和从机均可工作于接收器和发送器状态。主机产生串行时钟信号并发出控制字,控制总线的传送方向,并产生开始和停止的条件。无论是主机还是从机,接收到一个字节后必须发出一个确认信号ACK。AT24C02的控制字有8位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线的传送方向。
AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。在AT89S52实验开发板上它们都接地,第8脚和第4脚分别为正、负电源口。第5脚SDA为串行数据输入/输出,数据通过这条双向I2C总线串行传送,在AT89S52实验开发板上和单片机的P1.1连接,第6脚SCL为串行时钟输入线,在AT89S52实验开发板上和单片机的P1.0连接。SDA和SCL都需要和正电源间各接一个5K的电阻上拉,第7脚写保护接地。
2.4.3 LCD 1602显示器
现在的字符型液晶显示器模块已经是单片机应用设计中最常用的信息显示器件了。1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。1602型LCD可以显示2行16个字符 ,有8位数据总线D0-D7和RS,RW,E三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。 接口信号说明
1602型LCD的接口信号说明如表2.1所示:
表2.1 1602型LCD的接口信号说明
编号 1 2 3 4 5 6 7 8 符号 VSS VDD V0 RS RW E D0 D1 引脚说明 电源地 电源正极 液晶显示偏压信号 数据/命令选择端 读写选择端 使能信号 DATA I/O DATA I/O 8
编号 9 10 11 12 13 14 15 16 符号 D2 D3 D4 D5 D6 D7 BLA BLK 引脚说明 DATA I/O DATA I/O DATA I/O DATA I/O DATA I/O DATA I/O 背光源正极 背光源负极
主要技术参数
1602型LCD的主要技术参数如表2.2 所示:
表2.2 1602型LCD的主要技术参数
显示容量 芯片工作电压 工作电流 模块最佳工作电压 字符尺寸 16×2个字符 4.5 ~5.5V 2.0mA 5.0V 2.95×4.35mm 基本操作程序
读状态:输入:RS=L,RW=L,E=H 输出:D0 ~D7=状态字 读数据:输入:RS=H,RW=H,E=H 输出:无
写指令:输入:RS=L,RW=L,D0 ~D7=指令码,E=高脉冲 输出:D0 ~D7=数据 写数据:输入:RS=H,RW=L,D0 ~D7=数据,E=高脉冲 输出:无
2.4.4晶体振荡器
晶体振荡器,简称晶振,其作用在于产生原始的时钟频率,这个频率经过频率发生器的放大或缩小后就成了电脑中各种不同的总线频率。石英晶体振荡器是一种高精度和高稳定度的振荡器,石英晶体振荡器也称石英晶体谐振器,它用来稳定频率和选择频率,是一种可以取代LC谐振回路的晶体谐振元件。石英晶体振荡器广泛的应用在电视机、影碟机、录像机、无线通讯设备、电子钟表、单片机、数字仪器仪表等电子设备中。为数据处理设备产生时钟信号和特定系统提供基准信号。在单片机中为其提供时钟频率。
石英晶体振荡器是利用石英晶体(二氧化硅的结晶体)的压电效应制成的一种谐振器件,它的基本构成大致是:从一块石英晶体上按一定方位角切下薄片(简称为晶片,它可以是正方形、矩形或圆形等),在它的两个对应面上涂敷银层作为电极,在每个电极上个焊一根引线接到管脚上,再加上封装外壳就构成了石英晶体谐振器,简称为石英晶体或晶体、晶振。其产品一般用金属外壳封装,也有用玻璃壳、陶瓷或朔料封装的。只要在晶体振子板极上施加交变电压,就会使晶片产生机械变形振动,此现象即所谓逆压电效应。当外加电压频率等于晶体谐振器的固有频率时,就会发生压电谐振,从而导致机械变形的振幅突然增大。
9
3 软件系统的设计
3.1软件设计所用到的单片机资源情况
P0口作为显示输出,P2口作为键盘输入,用到外部中断0即P3.2脚,P1.2脚和P1.3脚分别与开锁电路与报警电路相连,P1.1和P1.0分别于外部存储芯片AT24C02 的SDA和SCL脚相连,P1.5、P1.6、P1.7分别于液晶显示器的E、RW、RS脚相连。
3.2软件系统的模块功能
本系统软件设计由主程序、初始化程序、LCD显示程序、键盘扫描程序、键功能程序、密码设置程序、E2PROM读写程序和延时程序等组成。
3.3软件系统主要程序设计流程图
开始初始化启动程序键盘扫描键功能程序关闭程序结束
图3.1 主程序流程图
10
键功能程序键值=“用户”?Y键值=“0—9”?N键值=“清除”?N键值=“设置”?N键值=“确认”?NY密码输入程序Y清除程序Y改密码程序Y确认程序返回
图3.2 键功能程序流程图
11
改密码程序初始化按下用户键按下设置键输入旧密码确认程序N输入旧密码正确?YN输入新密码次数>3?输入次数加1Y确认程序报警程序再次输入新密码返回确认程序N两次新密码输入相同?Y设置成功
图3.3 密码设置流程图
12
开锁程序初始化按下用户键输入密码确认程序输入密码正确?N输入次数加1YN次数>3?Y报警程序开锁成功返回
图3.4 开锁流程图
3.4软件系统程序清单
软件系统程序清单见附录6。
13
4 结 论
4.1 设计结论及使用说明
本程序从经济实用的角度出发,采用美国Atmel公司的单片机AT89S52与低功耗CMOS型E2PROM AT24C02作为主控芯片与数据存储单元,结合外围的键盘输入、显示、报警、开锁等电路并用汇编语言编写主控芯片的控制程序,研制了一款可以多用户使用可多次更改密码具有报警功能的电子密码锁。设计完全可行可以达到设计目的。使用单片机制作的电子密码锁具有软硬件设计简单,易于开发,成本低,安全可靠,操作方便等特点,可用于住宅、办公室的保险箱及档案柜等需要防盗的场所,有一定的实用性。该电路设计还具有按键有效提示,输入错误提示,控制开锁电平,控制报警电路,修改密码,多用户使用等功能。可在意外泄密的情况下随时修改密码。保密性强,灵活性高,特别适用于家庭、办公室、学生宿舍及宾馆等场所。
使用说明:本密码锁能同时供3个用户使用,初始密码为888888,当用户要开锁时,先要按下自己的用户位,再输入正确的密码,按下确定键后就能实现开锁,如果连续3次输入不正确,密码锁就会报警;当用户要重设密码时,要先按下自己的用户键,再按下重设键,紧接着输入原先的密码,按下确定键后如果密码正确才能输入新密码,输入新密码按下确定键后还要重新输入一次新密码,当两次输入新密码相同时,按下确定键后密码修改成功,否则不成功,需重新修改。
4.2程序仿真
程序仿真图见附录5。
4.3设计体会
通过本次课程设计实践,我对汇编语言有了更深的理解,特别是标志位的
使用,通过灵活使用标志位,可以加强软件系统各模块之间的联系,达到意想不到的效果。同时也加深了对设计方法的理解,进一步理解了软件设计中整体与局部的关系,本次实践我就运用了从整体到局部的设计思想,达到了满意的效果,它使我少走了很多弯路,既节约了时间,又很好的组织了软件系统各部的联系。
14
4.4教学建议
对于单片机与汇编语言的学习,我觉得应该加强创造性思维的培养,同时
结合实验加以实践。我觉得思维是知识的灵魂,只有加强了思维的训练与培养,才能使知识的能量达到最大化。就像好的文章要有好的作家,要有他们那种创造精妙语言的思维,软件系统设计也是一种对语言的运用实践,精妙的思维也就必不可少。创造性思维是丰富的,因此应加强老师与同学们、同学们之间的思维互动,加强探讨,加强课程设计实践。
15
参考文献
[1] 李广弟 ,朱月秀 ,冷祖祁.单片机基础[M].第三版.北京:北京航空航天大
学出版社,2007.0-260
Li guangdi ,Zhu yuexiu ,Leng zuqi.Microcontroller based[M].The Third Edition.Beijing:Beijing University of Aeronautics and Astronautics Press,2007.0-260
[2] 李朝青.单片机原理及接口技术[M].北京:北京航空航天大学出版社,
1998.26-40
Li Chaoqing.SCM Principle and Interface Technology[M].Beijing: Beijing University of Aeronautics and Astronautics Press,1998.26-40 [3] 何立明.单片机高级教程[M].北京:北京航空航天大学出版社,2000.37-51
He Liming.Advanced MicrocontrollerTutorial[M].Beijing:Beijing University of Aeronautics and Astronautics Press,2000.37-51
16
致 谢
这半年不知不觉就过去了,在这学期中,有些人是要我去感谢的。 在这学期中,我要感谢的人很多,首先要感谢我的学校,感谢在这学期中给了我一个好的学习环境,还要感谢我的指导老师王老师在他的指导下我完成了此次单片机课程设计,王老师多次询问课程设计进程,并帮助我开阔思路。王老师一丝不苟的作风,严谨求实的态度,不仅授我以文,而且教我做人。我从心里感谢他。还要感谢我的同学,在我完成课程设计的过程中给予我的照顾和帮助,最后要感谢的是我的父母、兄弟、朋友,对于他们我更是千言万语,总之一句话:感谢他们一直都伴随着我。
17
附录1
18
附录2
19
附录3
20
附录4 元器件名称 AT89S52 AT24C02 72LS20 电位器 LCD1602A 蜂鸣器 LED灯(红色) LED灯(绿色) 晶振 电容 电解电容 4脚按键 9脚排阻 电阻 电阻 电阻 电阻 6脚电源开关 2脚电源口 下载口
21
数值 1K 12MHz 20pF 22μF 1K 200Ω 300Ω 10K 1K 个数(个) 1 1 1 1 1 1 1 1 1 2 1 17 1 1 3 2 1 1 1 1
附录5
22
附录6
RS BIT P1.7 RW BIT P1.6 E BIT P1.5 ENTER BIT 22H OPEN BIT P1.2 SPEAK BIT P1.3 PASSBUF EQU 40H
KEYNUMBER EQU 41H ;存放识别后的按键号
CWCS EQU 44H ;44H号单元存放输入错误的次数 ZDCS0 EQU 45H ;45H为定时器0中断次数 ZDCS1 EQU 46H ;46H为定时器1中断次数 BAOJING BIT 20H CAOSHI BIT 21H CHUSHI BIT 23H YONGFU1 BIT 24H YONGFU2 BIT 25H YONGFU3 BIT 26H RESET BIT 27H RESET1 BIT 28H RESET2 BIT 29H RESET3 BIT 30H SANCHU BIT 31H
SDA BIT P1.1 ;定义串口数据端 SCL BIT P1.0
;********密码缓冲区*************** PS1 EQU 69H PS2 EQU 68H PS3 EQU 67H PS4 EQU 66H PS5 EQU 65H
23
PS6 EQU 64H
;********24C02读取缓冲区************* AT1 EQU 63H AT2 EQU 62H AT3 EQU 61H AT4 EQU 60H AT5 EQU 5FH AT6 EQU 5EH ORG 0000H AJMP MAIN ORG 0003H AJMP KEY_INT ORG 000BH AJMP INTT0 ORG 001BH AJMP INTT1 ORG 0030H
;///////////////主程序开始 ///////////////
MAIN: MOV 30H, #07H ;管理员密码为7位
MOV 42H, #200 ;设定报警的时间,42H单元里的数*50MS MOV 43H, #250 ;设定开门时间
MOV 47H, #250 ;输入密码时间设定,50MS倍数 MOV SP, #70H CLR OPEN
CLR SPEAK ;初始化输出设备 CLR ENTER ;标志位初始化 MOV TMOD, #11H ;定时器工作方式1 MOV TH0, #3CH ;初值50MS MOV TL0, #0BH MOV TH1, #3CH MOV TL1, #0BH SETB EA SETB ET0
24
SETB ET1
MOV TCON, #00H ;电平触发 ACALL INITPS ;初始化环境 ACALL INITAT NOP
START: CLR CHUSHI
START8: MOV R0, 30H
SS1:
INIT: ACALL SELLCD ;CLR YONGFU1 CLR YONGFU2 CLR YONGFU3 CLR RESET CLR RESET1 CLR RESET2 CLR RESET3 CLR SANCHU
MOV R1, #31H
INC R1
DJNZ R0, SS1 ;MOV P2, #0F0H ;MOV R1, #31H ;CLR BAOJING ;CLR CAOSHI ;MOV ZDCS1, #00H ;ACALL LINE1 ;MOV DPTR,#MES_P ;ACALL DISPLAY
SETB EX0 ;JNB CHUSHI,KEYIN
MOV PS1, #08H ;25
将输入密码缓冲单元清零 初始化按键口
从31号单元开始存放按建输入的密
码
报警标志清零 密码超时标志
超时后对定时器1中断次数清零,便于
下一轮重新计时
设定液晶工作方式
在第一行显示 显示请输入密码 开中断,允许键盘输入 初始化密码888888
MOV @R1, #00H
MOV PS2, #08H MOV PS3, #08H MOV PS4, #08H MOV PS5, #08H MOV PS6, #08H SETB YONGFU1 ACALL AT_WR ACALL T100MSD SETB YONGFU2 ACALL AT_WR ACALL T100MSD ACALL AT_WR AJMP START
KEYIN : JB RESET3,START
JB CAOSHI,CHUWU ;超时转到错误程序 JNB ENTER, KEYIN ;等待ENTER按下 CLR ENTER
CLR EX0 ;密码输入完后锁定键盘
;/////////////密码判断程序///////////////
JB YONGFU1,COMP1 JB YONGFU2,COMP1 JB YONGFU3,COMP1
COMP:
MOV DPTR, #PASS
MOV R4, 30H ;密码的长度 MOV A, #0 MOV R1, #31H
LOOP: MOV R5, A
MOVC A, @A+DPTR
MOV PASSBUF,A ;取出系统设定的密码
MOV A, @R1 ;从31号单元开始取出输入的密码 CJNE A, PASSBUF,CHUWU ;比较 MOV A, R5
26
INC A
INC R1 ;取下一位 DJNZ R4,LOOP AJMP MATCH
COMP1: LCALL AT_RADE
MOV R4, #06H MOV R1, #PS1 MOV R0, #AT1
LOOP1: MOV PASSBUF,@R0
MOV A, @R1
CJNE A, PASSBUF,ERR DEC R0 DEC R1
DJNZ R4, LOOP1 JB RESET, MATCH2 AJMP MATCH1
COMP2: MOV R4, #06H
MOV R1, #PS1 MOV R0, #38H
LOOP2: MOV PASSBUF,@R0
MOV A, @R1
CJNE A, PASSBUF,ERR DEC R0 DEC R1
DJNZ R4, LOOP2 AJMP ZHONG12
CHUWU: AJMP ERR
;******** 正确 ************ MATCH: MOV A, #01H
ACALL ENABLE ;清屏,光标复位 ACALL LINE1 ;从第一行开始显示 MOV DPTR, #MES_C
27
ACALL DISPLAY ;显示\"请进\" ACALL LINE2
MOV DPTR, #TAB_1 ACALL DISPLAY
SETB OPEN ;开门
MOV CWCS, #00H ;输入错误次数清零 MOV R6, 43H ACALL DELAY
CLR OPEN ;复位 SETB CHUSHI AJMP START8
MATCH1:MOV A, #01H
ACALL ENABLE ;清屏,光标复位 ACALL LINE1 ;从第一行开始显示 MOV DPTR, #MES_C
ACALL DISPLAY ;显示\"请进\" ACALL LINE2
MOV DPTR, #TAB_1 ACALL DISPLAY
SETB OPEN ;开锁
MOV CWCS, #00H ;输入错误次数清零 MOV R6, 43H ACALL DELAY
CLR OPEN ;复位 AJMP START
MATCH2:ACALL WRDATA4
MOV CWCS, #00H ;输入错误次数清零 MOV R1, #38H SETB RESET1 SETB SANCHU SETB EX0
AJMP KEYIN
;***********错误************
28
ERR: ACALL BACK
MOV R6, #03H ACALL DELAY
ACALL BACK ;输错提示音,鸣两下 MOV A, #01H ACALL ENABLE ACALL LINE1
MOV DPTR, #MES_E
ACALL DISPLAY ;显示错误 MOV R6, #40H ACALL DELAY
INC CWCS
MOV A, CWCS
CJNE A, #03H,EE0
EE0: JC ERROUT ;输错不到三次返回
MOV CWCS, #00H ;清零 ACALL WRANING ;报警
ERROUT: JB RESET2,KEY_RTN AJMP START
;////////////按键中断服务程序////////////// KEY_INT:PUSH ACC
PUSH PSW CLR EX0
ACALL DELAY12MS ;延时消抖 SETB TR1 ;启动定时器 ACALL SMKEY ;按键识别
MOV A, KEYNUMBER ;返回按键号 ACALL BACK ;按键发声 MOV R3, A
CJNE R3, #0DH,K4;reset键是否按下 ACALL WRDATA3 AJMP KEY_RTN
K4: CJNE R3, #0AH,K5
29
ACALL WRDATA2 AJMP KEY_RTN
K5: CJNE R3, #0BH,K6
ACALL WRDATA2 AJMP KEY_RTN
K6: CJNE R3, #0CH,K2
ACALL WRDATA2 AJMP KEY_RTN
K2: CJNE R3, #0EH,ZHONG ;DELJB SANCHU ,DIAO1 JB YONGFU1,DIAO JB YONGFU2,DIAO JB YONGFU3,DIAO MOV R1, #31H ACALL WRDATA2 AJMP KEY_RTN
DIAO1: JB RESET2 ,DIAO
MOV R1, #38H ACALL WRDATA2 AJMP KEY_RTN
DIAO: MOV R1, #PS1
ACALL WRDATA2 AJMP KEY_RTN
ZHONG:
CJNE R3, #0FH,K1 ;ENTERJB RESET2, ZHONG11 JB RESET1, ZHONG10 SETB ENTER
CLR TR1 ;MOV ZDCS1, #00H ;AJMP KEY_RTN
K1: JB YONGFU1,K3 JB YONGFU2,K3
是否按下
是否按下 按下确认后关毕定时器对中断次数清零 30
JB YONGFU3,K3
ADD A, #30H ;将按键号转换为ASCⅡ码 MOV @R1, A ;将输入的密码存入缓冲单元 INC R1 ;修改地址
ACALL WRDATA1 ;输入一位显示一个\"*\" AJMP KEY_RTN
K3:
MOV @R1, A DEC R1 ACALL WRDATA1
KEY_RTN:POP PSW
POP ACC SETB EX0 RETI
ZHONG10:ACALL WRDATA5
SETB RESET2 MOV R1,#PS1 CLR TR1
MOV ZDCS1, #00H AJMP KEY_RTN
ZHONG11:SETB RESET3
AJMP COMP2
ZHONG12:ACALL AT_WR
CLR TR1 ;按下确认后关毕定时器 MOV ZDCS1, #00H ;对中断次数清零 AJMP KEY_RTN
;************按键识别程序************* SMKEY: MOV A, P2
ANL A, #0F0H
WKEY: MOV B, A ;反转法查询
MOV P2, #0FH NOP
MOV A, P2
31
ANL A, #0FH ORL A, B
MOV P2, #0F0H ;还原P1口初态 CJNE A, #7EH,WKEY1 MOV KEYNUMBER,#00H AJMP RETURN
MOV KEYNUMBER,#01H AJMP RETURN
MOV KEYNUMBER,#02H AJMP RETURN
MOV KEYNUMBER,#03H AJMP RETURN
MOV KEYNUMBER,#04H AJMP RETURN
MOV KEYNUMBER,#05H AJMP RETURN
MOV KEYNUMBER,#06H AJMP RETURN
MOV KEYNUMBER,#07H AJMP RETURN
MOV KEYNUMBER,#08H AJMP RETURN
MOV KEYNUMBER,#09H AJMP RETURN
32
WKEY1: CJNE A, #0BEH,WKEY2
WKEY2: CJNE A, #0DEH,WKEY3
WKEY3: CJNE A, #0EEH,WKEY4
WKEY4: CJNE A, #7DH,WKEY5
WKEY5: CJNE A, #0BDH,WKEY6
WKEY6: CJNE A, #0DDH,WKEY7
WKEY7: CJNE A, #0EDH,WKEY8
WKEY8: CJNE A, #7BH,WKEY9
WKEY9: CJNE A, #0BBH,WKEY10
WKEY10: CJNE A, #0DBH,WKEY11 MOV KEYNUMBER,#0AH SETB YONGFU1 MOV R1, #PS1 AJMP RETURN
WKEY11: CJNE A, #0EBH,WKEY12
MOV KEYNUMBER,#0BH SETB YONGFU2
MOV R1, #PS1
AJMP RETURN
WKEY12: CJNE A, #77H,WKEY13 MOV KEYNUMBER,#0CH
SETB YONGFU3
MOV R1, #PS1
AJMP RETURN
WKEY13: CJNE A, #0B7H,WKEY14 MOV KEYNUMBER,#0DH
SETB RESET
AJMP RETURN
WKEY14: CJNE A, #0D7H,WKEY15 MOV KEYNUMBER,#0EH AJMP RETURN
WKEY15: CJNE A, #0E7H,RETURN MOV KEYNUMBER,#0FH 号码
RETURN: MOV P2, #0F0H NOP NOP
MOV A, P2 CPL A ANL A, #0F0H
JNZ RETURN ; RET
;判断哪个键按下,返回相应按键
等待按键松开
33
;///////////初始化显示缓冲区以及其他缓冲区////////// INITPS:
MOV R7, #06H MOV R1, #PS1 MOV A, #00H INIT_PS: MOV @R1, A DEC R1
DJNZ R7, INIT_PS NOP RET INITAT:
MOV R7, #06H MOV R1, #AT1 MOV A, #00H INIT_AT: MOV @R1, A DEC R1
DJNZ R7, INIT_AT RET
;////////////液晶工作方式设置//////////////
SELLCD: MOV A, #01H ;清屏,光标复位 ACALL ENABLE
MOV A, #38H ;设置显示模式,8位两行,5*7点阵 ACALL ENABLE
MOV A, #0DH ;显示器开,允许内烁 ACALL ENABLE
MOV A, #06H ;文字不动,光标右移 ACALL ENABLE RET
;******** 液晶执行指令********** ENABLE: CLR RS
CLR RW ;RS,RW同为低电平时写入指令
34
MOV P0, A
CLR E ;E由高变低时执行指令 ACALL WAIT SETB E RET
;********判断液晶是否忙的子程序******** WAIT: MOV P0, #0FFH CLR RS SETB RW ;RW CLR E NOP SETB E
JB P0.7, WAIT
RET
;*******显示的起始地址********* ;在第一行
LINE1: MOV A, #80H ACALL ENABLE RET ;在第二行
LINE2: MOV A, #0C0H ACALL ENABLE RET ; 显示程序
DISPLAY: MOV R7, #00H NEXT: MOV A, R7 MOVC A, @A+DPTR CJNE A, #10H,DSP RET
DSP: ACALL WRDATA INC R7 AJMP NEXT
35
为高,RS为低时可读忙信号
;*******将A里面的数据写入液晶**********
WRDATA: SETB RS CLR RW MOV P0, A CLR E ACALL WAIT SETB E
RET
WRDATA1: SETB RS CLR RW MOV A,#00H
MOV DPTR, #XINGHAO
MOVC A, @A+DPTR MOV P0, A CLR E ACALL WAIT SETB E RET
WRDATA2: JB RESET2, WRDATA5 JB RESET1, WRDATA4 JB RESET, WRDATA3 ACALL SELLCD ACALL LINE1 JNB YONGFU1,FU22 MOV DPTR, #MES_P1 ACALL DISPLAY
RET FU22: JNB YONGFU2,FU33 MOV DPTR, #MES_P2 ACALL DISPLAY
RET
36
FU33: JNB YONGFU3,FU MOV DPTR, #MES_P3
ACALL DISPLAY RET ACALL DISPLAY RET
FU: MOV DPTR, #MES_P
WRDATA3: ACALL SELLCD ACALL LINE1 MOV DPTR, #MES_O
ACALL DISPLAY RET
WRDATA4: ACALL SELLCD ACALL LINE1 MOV DPTR, #MES_N
ACALL DISPLAY RET
WRDATA5: ACALL SELLCD ACALL LINE1 MOV DPTR, #MES_A
ACALL DISPLAY RET
;********* 报警程序********** WRANING: SETB TR0
ACALL BACK
MOV R4, #00H ACALL D2
JNB BAOJING, WRANING
RET
; *******发声程序*********** BACK: MOV R0, #100 KK1: CPL SPEAK ACALL DELAY2MS
37
DJNZ R0, KK1 ;不断取反P2.0使其产生一定频率的方波 RET ;延时的长短可以改变输出的频率
推动扬声器
;**********报警时间设定*********** INTT0: PUSH ACC
PUSH PSW MOV TH0, #3CH MOV TL0, #0BH INC ZDCS0
MOV A, ZDCS0
CJNE A, 42H,INTT0OUT MOV ZDCS0, #00H
SETB BAOJING ;置标志位 CLR TR0 ;关闭定时器 INTT0OUT:POP PSW POP ACC RETI
;***********输入超时********** INTT1: PUSH ACC PUSH PSW
INC ZDCS1
MOV A, ZDCS1
CLR TR1 ;关闭定时器 SETB CAOSHI ;时间到置标志位 MOV ZDCS1, #00H ;中断次数清零
CJNE A, 47H,INTT1OUT
INTT1OUT:POP PSW POP ACC RETI
;///////////延时程序///////////// DELAY: MOV R4, #38H D1: MOV R5, #0F9H DJNZ R5, $
38
DJNZ R4, D1
DJNZ R6, DELAY RET
DELAY2MS:MOV R4, #02H D2: MOV R5, #0F0H DJNZ R5, $ DJNZ R4, D2
RET DELAY12MS:
MOV R4, #24 D3: MOV R5, #248 DJNZ R5, $ DJNZ R4, D3 RET
T100MSD: MOV R3, #200 D11: MOV R4, #125 D12: DJNZ R4, D12 DJNZ R3, D11 RET
;///////////24C02读写程序///////////// AT_RADE:
MOV R0, #AT1 MOV R6, #06H MOV R5, #08H JNB YONGFU1, READ1 MOV R7, #00H AJMP DIAO9
READ1: JNB YONGFU2, READ2 MOV R7, #10H
AJMP DIAO9
READ2: MOV R7, #20H DIAO9: LCALL READ NOP
39
NOP RET AT_WR:
MOV R0, #PS1 MOV R6, #06H MOV R5, #08H SETB RESET1
JNB YONGFU1, WRT1 MOV R7, #00H CLR YONGFU1 AJMP DIAO10
WRT1: JNB YONGFU2, WRT2 MOV R7, #10H
CLR YONGFU2 AJMP DIAO10
WRT2: MOV R7, #20H DIAO10: LCALL WRT NOP NOP RET
;*******读串行数据,R0:RAM的起始地址,R5:位计数器 ;R6:读的字节数,R7:读的起始地址********* READ: NOP NOP
LCALL START0 LCALL WRB LCALL ACK
JB F0, RD_FAIL LCALL WRB LCALL CHK
JB F0, RD_FAIL
40
MOV A, #0A0H
MOV A, R7
LCALL START0
MOV A, #0A1H LCALL WRB LCALL CHK
JB F0, RD_FAIL
RD_N: NOP
NOP
LCALL RDB
MOV @R0, A DJNZ R6, GO_ACK LCALL N_ACK
RD_FAIL: NOP
LCALL STOP
MOV A, #0FFH RET
GO_ACK: NOP
NOP
DEC R0 LCALL ACK AJMP RD_N
;*****写串行器件 R0:RAM的起始地址,R5:位计数器 ;R6:写的字节数,R7:写的起始地址******
WRT: NOP
NOP
LCALL START0
MOV A, #0A0H LCALL WRBYT LCALL CHK
JB F0, WR_FAIL MOV A, R7 LCALL WRBYT LCALL CHK
JB F0, WR_FAIL
41
WR_N: NOP
NOP
MOV A, @R0 LCALL WRBYT LCALL CHK
JB F0, WR_FAIL DEC R0
DJNZ R6, WR_N
WR_FAIL: NOP
LCALL STOP
MOV A, #0FFH RET
START0: NOP
NOP
SETB SDA SETB SCL NOP NOP
CLR SDA NOP NOP
CLR SCL NOP RET
STOP: NOP
NOP
CLR SDA SETB SCL NOP NOP
SETB SDA NOP NOP
42
CLR SCL NOP RET
ACK: NOP
NOP
CLR SDA SETB SCL NOP NOP
CLR SCL SETB SDA NOP RET
N_ACK: NOP
NOP
SETB SDA SETB SCL NOP NOP
CLR SCL CLR SDA NOP RET
CHK: NOP
NOP
SETB SDA NOP NOP
SETB SCL NOP NOP
MOV C, SDA MOV F0, C
43
CLR SCL NOP NOP RET
RDB: NOP
NOP
SETB SDA
MOV R5, #8
RD_B: NOP
NOP
CLR SCL NOP NOP
SETB SCL NOP NOP
MOV C, SDA RLC A NOP NOP
SETB SDA CLR SCL
DJNZ R5, RD_B NOP RET
;******** 一字节数据发送子程序********** WRBYT: MOV R5,#8
WLP: RLC A JC WR1 ACALL ACK DJNZ R5,WLP RET
WR1: ACALL N_ACK
44
DJNZ R5, WLP RET
WRB: NOP
NOP
MOV R5, #8
WR_B: NOP
NOP
SETB SDA RLC A JC WR_1 CLR SDA NOP
WR_1: SETB SCL
NOP NOP
CLR SCL NOP
CLR SDA NOP
DJNZ R5, WR_B NOP RET
PASS: DB \"2008620\MES_P: DB \"PASS?\MES_P1: DB \"PASS1?\MES_P2: DB \"PASS2?\MES_P3: DB \"PASS3?\MES_C: DB \"Welcome!\MES_E: DB \"ERROR\
TAB_1: DB \" My master!\XINGHAO: DB \"*\" MES_O: DB \"OPASS?\MES_N: DB \"NPASS?\
45
MES_A: DB \"Again?\ END
46
因篇幅问题不能全部显示,请点此查看更多更全内容