密码锁课程设计报告

1  引 言

1.1 电子密码锁简介

电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已经大大超过了机械锁。其特点如下:

  (1)保密性好,编程量多,远远大于弹子锁。随机开锁成功率几乎为零。

  (2)密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免

人员的更替而使锁的密级下降。

  (3)误码输入保护,当当输入密码多次错误时,报警系统自启动。

  (4)无活动零件,不会磨损,寿命长。

  (5)使用灵活性好,不像机械锁必须佩带钥匙才能开锁。

  (6)电子密码锁操作简单易行,一学即会。

1.2 电子密码锁的发展趋势

    在日常生活和工作中,住宅与部门的安全防患、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的方法解决。目前门锁主要用弹子锁,其钥匙容易丢失;保险箱主要用机械密码锁,其结构较为复杂,制造精度要求高,成本高,且易出现故障,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。针对这些所具给人们带来的不便若使用机械式钥匙开锁,为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。它的出现为人们的生活带来了很大的方便,有很广阔的市场前景。由于电子器件所限,以前开发的电子密码锁,其种类不多,保密性差,最基本的就是只依靠最简单的模拟电子开关来实现的,制作简单但很不安全,在后为多是基于EDA来实现的,其电路结构复杂,电子元件繁多,也有使用早先的20引脚的2051系列单片机来实现的,但密码简单,易破解。随着电子元件的进一步发展,电子密码也出现了很多的种类,功能日益强大,使用更加方便,安全保密性更强,由以前的但密码输入发展到现在的,密码加感应元件,实现了真正的电子加密,用户只有密码或电子钥匙中一样,是打不开锁的,随着电子元件的发展及人们对保密性需求的提5高出现了越来越多的电子密码锁。

    出于安全、方便等方面的需要许多电子密码锁已相继问世。但这类产品的特点是针对特定有效卡、指纹或声音有效,且不能实现远程控制,只能适用于保密要求高且供个人使用的箱、柜、房间等。由于数学、字符、图形图像、人体生物特征和时间等要素均可成为钥匙的电子信息,组合使用这些信息能够使电子防盗锁获得高度的保密性,如防范森严的金库,需要使用复合信息密码的电子防盗锁,这样对盗贼而言是“道高一尺,魔高一丈”、组合使用信息也能够使电子防盗锁获得无穷扩展的肯,是产品多样化,对用户而言是“千挑百选、自得其所"。可以看出组合使用电子信息是电子密码锁以后的发展的趋势。

1.3设计目的与任务:

学生通过理论设计和实物制作解决相应的实际问题,巩固和运用在《单片机技术》中所学的理论知识和实验技能,掌握单片机应用系统的一般设计方法,提高设计能力和实践动手能力,为以后从事电子电路设计、研发电子产品打下良好的基础。

1.4设计内容与要求

设计一个具有特定功能的密码锁。该密码锁上电或按键复位后能自动显示系统提示符“P.”, 进入准备工作状态。该密码锁具有系统原始密码888888,用户可以设定并存储用户密码,密码输入时应处于保密显示状态,密码输入正确时应显示密码输入正确提示信息,否则,显示密码输入错误提示信息。

1.5本设计所要实现的目标

本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,该电子密码锁有个管理员密码和三个用户密码,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误有提示,为了提高安全性,当密码输入错误三次将报警。密码可以由用户自己修改设定,锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。当用户不记得密码时可通过专业认证服务用管理员密码使密码锁恢复出厂设置。

1.6设计总体方案及工作原理说明

采用以单片机为核心的控制方案,总体框图见图1.1.

由于单片机总类繁多,各种型号都用一定的应用环境,因此在选用时要多加比较,合理选择,以期获得最佳的性价比。一般来说在选择单片机时下面几个方面考虑:性能、存储器、运行速度、I/O口、定时/计数器、串行接口、模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除了以上的一些还有一些最基本的比如:中断源的数量和优先级、工作温度范围、有没有低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。在开发过程中单片机还受到:开发工具、编程器、开发成本、开发人员的适应性、技术支持

和服务等等因素。基于以上因素本设计选用单片机AT89S52作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,以及控制的准确性,实现基本的密码锁功能。在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接24C02B芯片用于密码的存储,外接LCD1602A显示器用于显示作用。当用户修要开锁时,先按键盘用户键之后按键盘的数字键0-9输入密码。密码输入完成后按下确认键,如果密码输入正确则开锁,不正确显示密码错误从新输入密码,当三次输入密码错误时则发出报警;当用户需要修改密码时,先按下用户键后再按设置键,接着输入原来的密码,只有当输入的原密码正确后才能设置新密码。新密码输入后按下确认键后系统要求再次输入新密码接着按下确认键当两次密码输入相同时新密码将得到存储,密码修改成功。

图1.1 设计总体框图

2  硬件系统的设计

2.1设计原理

本设计主要有单片机、矩阵键盘、液晶显示器和密码存储部分构成。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由显示灯换成电子密码锁的电磁铁吸合线圈即可,当然也可以用继电器的常开触点去控制电磁铁吸合线圈。

本系统共由两部分构成,及硬件部分和软件部分。其中硬件部分由电源输入口,键盘输入部分,密码存储部分,复位电路,晶振电路,显示部分,报警部分,开锁部分组成。软件部分对应的由主程序,初始化程序,LCD显示程序,键盘扫描程序,启动程序,关闭程序,键功能程序,密码设置程序,E2PROM读写程序和

延时程序等组成。其原理框图如图2.1所示

图2.1 电子密码锁原理框图

2.2电路总体构成

在确定了选用什么型号的单片机后,就要确定外围电路。其外围电路包括电源输入口、键盘输入部分、密码存储部分、复位部分、晶振部分、显示部分、报警部分、开锁部分。根据实际情况键盘输入部分选择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也为高电平。复位电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容上的电压很小,复位下拉电阻上的电压接近电源电压,即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开锁部分

开锁控制电路的功能是当密码输入正确后将锁打开。系统使用单片机其中一引脚线发出信号,驱动外围电路将锁打开。用户通过按键任意设置密码,并存储在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中带有的片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加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的接口信号说明

主要技术参数

1602型LCD的主要技术参数如表2.2 所示:

表2.2   1602型LCD的主要技术参数

基本操作程序

读状态:输入: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谐振回路的晶体谐振元件。石英晶体振荡器广泛的应用在电视机、影碟机、录像机、无线通讯设备、电子钟表、单片机、数字仪器仪表等电子设备中。为数据处理设备产生时钟信号和特定系统提供基准信号。在单片机中为其提供时钟频率。

    石英晶体振荡器是利用石英晶体(二氧化硅的结晶体)的压电效应制成的一种谐振器件,它的基本构成大致是:从一块石英晶体上按一定方位角切下薄片(简称为晶片,它可以是正方形、矩形或圆形等),在它的两个对应面上涂敷银层作为电极,在每个电极上个焊一根引线接到管脚上,再加上封装外壳就构成了石英晶体谐振器,简称为石英晶体或晶体、晶振。其产品一般用金属外壳封装,也有用玻璃壳、陶瓷或朔料封装的。只要在晶体振子板极上施加交变电压,就会使晶片产生机械变形振动,此现象即所谓逆压电效应。当外加电压频率等于晶体谐振器的固有频率时,就会发生压电谐振,从而导致机械变形的振幅突然增大。

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  主程序流程图

图3.2  键功能程序流程图

图3.3  密码设置流程图

图3.4  开锁流程图

3.4软件系统程序清单

软件系统程序清单见附录6。

4  结 论

4.1 设计结论及使用说明

本程序从经济实用的角度出发,采用美国Atmel公司的单片机AT89S52与低功耗CMOS型E2PROM  AT24C02作为主控芯片与数据存储单元,结合外围的键盘输入、显示、报警、开锁等电路并用汇编语言编写主控芯片的控制程序,研制了一款可以多用户使用可多次更改密码具有报警功能的电子密码锁。设计完全可行可以达到设计目的。使用单片机制作的电子密码锁具有软硬件设计简单,易于开发,成本低,安全可靠,操作方便等特点,可用于住宅、办公室的保险箱及档案柜等需要防盗的场所,有一定的实用性。该电路设计还具有按键有效提示,输入错误提示,控制开锁电平,控制报警电路,修改密码,多用户使用等功能。可在意外泄密的情况下随时修改密码。保密性强,灵活性高,特别适用于家庭、办公室、学生宿舍及宾馆等场所。

使用说明:本密码锁能同时供3个用户使用,初始密码为888888,当用户要开锁时,先要按下自己的用户位,再输入正确的密码,按下确定键后就能实现开锁,如果连续3次输入不正确,密码锁就会报警;当用户要重设密码时,要先按下自己的用户键,再按下重设键,紧接着输入原先的密码,按下确定键后如果密码正确才能输入新密码,输入新密码按下确定键后还要重新输入一次新密码,当两次输入新密码相同时,按下确定键后密码修改成功,否则不成功,需重新修改。

4.2程序仿真

程序仿真图见附录5。

4.3设计体会

     通过本次课程设计实践,我对汇编语言有了更深的理解,特别是标志位的使用,通过灵活使用标志位,可以加强软件系统各模块之间的联系,达到意想不到的效果。同时也加深了对设计方法的理解,进一步理解了软件设计中整体与局部的关系,本次实践我就运用了从整体到局部的设计思想,达到了满意的效果,它使我少走了很多弯路,既节约了时间,又很好的组织了软件系统各部的联系。

4.4教学建议

    对于单片机与汇编语言的学习,我觉得应该加强创造性思维的培养,同时结合实验加以实践。我觉得思维是知识的灵魂,只有加强了思维的训练与培养,才能使知识的能量达到最大化。就像好的文章要有好的作家,要有他们那种创造精妙语言的思维,软件系统设计也是一种对语言的运用实践,精妙的思维也就必不可少。创造性思维是丰富的,因此应加强老师与同学们、同学们之间的思维互动,加强探讨,加强课程设计实践。

参考文献

[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

致 谢

这半年不知不觉就过去了,在这学期中,有些人是要我去感谢的。

在这学期中,我要感谢的人很多,首先要感谢我的学校,感谢在这学期中给了我一个好的学习环境,还要感谢我的指导老师王老师在他的指导下我完成了此次单片机课程设计,王老师多次询问课程设计进程,并帮助我开阔思路。王老师一丝不苟的作风,严谨求实的态度,不仅授我以文,而且教我做人。我从心里感谢他。还要感谢我的同学,在我完成课程设计的过程中给予我的照顾和帮助,最后要感谢的是我的父母、兄弟、朋友,对于他们我更是千言万语,总之一句话:感谢他们一直都伴随着我。

附录1

附录2

附录3

附录4

附录5

附录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

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

SETB      ET1

MOV       TCON,  #00H       ;电平触发

ACALL     INITPS            ;初始化环境

ACALL     INITAT

NOP

START:   CLR       CHUSHI

CLR       YONGFU1

CLR       YONGFU2

CLR       YONGFU3

CLR       RESET

CLR       RESET1

CLR       RESET2

CLR       RESET3

CLR       SANCHU

START8:  MOV       R0,    30H

MOV       R1,    #31H

SS1:     MOV       @R1,   #00H

INC       R1

DJNZ      R0,    SS1       ;将输入密码缓冲单元清零

MOV       P2,    #0F0H     ;初始化按键口

MOV       R1,    #31H      ;从31号单元开始存放按建输入的密码

CLR       BAOJING          ;报警标志清零

CLR       CAOSHI           ;密码超时标志

MOV       ZDCS1, #00H      ;超时后对定时器1中断次数清零,便于下一轮重新计时

INIT:    ACALL     SELLCD           ;设定液晶工作方式

ACALL     LINE1            ;在第一行显示

MOV       DPTR,#MES_P      ;显示请输入密码

ACALL     DISPLAY

SETB      EX0              ;开中断,允许键盘输入

JNB       CHUSHI,KEYIN

MOV       PS1,   #08H      ;初始化密码888888

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

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

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         

;***********错误************

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

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     ;DEL是否按下

JB        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     ;ENTER是否按下

JB        RESET2, ZHONG11

JB        RESET1, ZHONG10

SETB      ENTER

CLR       TR1                 ;按下确认后关毕定时器

MOV       ZDCS1,    #00H      ;对中断次数清零

AJMP      KEY_RTN

K1:       JB        YONGFU1,K3

JB        YONGFU2,K3

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

         ANL      A,       #0FH

         ORL      A,       B

         MOV      P2,      #0F0H         ;还原P1口初态

         CJNE     A,       #7EH,WKEY1

         MOV      KEYNUMBER,#00H      

         AJMP     RETURN

WKEY1:   CJNE     A,       #0BEH,WKEY2

         MOV      KEYNUMBER,#01H

         AJMP     RETURN

WKEY2:   CJNE     A,       #0DEH,WKEY3

         MOV      KEYNUMBER,#02H

         AJMP     RETURN

WKEY3:   CJNE     A,       #0EEH,WKEY4

         MOV      KEYNUMBER,#03H

         AJMP     RETURN

WKEY4:   CJNE     A,       #7DH,WKEY5

         MOV      KEYNUMBER,#04H

         AJMP     RETURN

WKEY5:   CJNE     A,       #0BDH,WKEY6

         MOV      KEYNUMBER,#05H

         AJMP     RETURN

WKEY6:   CJNE     A,       #0DDH,WKEY7

         MOV      KEYNUMBER,#06H

         AJMP RETURN

WKEY7:   CJNE     A,       #0EDH,WKEY8

         MOV      KEYNUMBER,#07H

         AJMP     RETURN

WKEY8:   CJNE     A,       #7BH,WKEY9

         MOV      KEYNUMBER,#08H

         AJMP RETURN

WKEY9:   CJNE A,           #0BBH,WKEY10

         MOV      KEYNUMBER,#09H

         AJMP RETURN

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

;///////////初始化显示缓冲区以及其他缓冲区//////////

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同为低电平时写入指令

         MOV      P0,       A

         CLR      E                   ;E由高变低时执行指令

         ACALL    WAIT

         SETB     E

         RET

;********判断液晶是否忙的子程序********

WAIT:    MOV      P0,      #0FFH

         CLR      RS

         SETB     RW                  ;RW为高,RS为低时可读忙信号

         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

;*******将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

FU33:  JNB      YONGFU3,FU

         MOV      DPTR,    #MES_P3

        ACALL    DISPLAY

        RET           

FU:      MOV      DPTR,    #MES_P

        ACALL    DISPLAY

        RET

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

         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

         CJNE     A,        47H,INTT1OUT

         CLR      TR1                   ;关闭定时器

         SETB     CAOSHI                ;时间到置标志位 

         MOV      ZDCS1,    #00H        ;中断次数清零

INTT1OUT:POP      PSW

         POP      ACC

         RETI 

;///////////延时程序/////////////

DELAY:   MOV      R4,       #38H

D1:      MOV      R5,       #0F9H

         DJNZ     R5,       $

         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

         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

         MOV      A,        #0A0H

        LCALL    WRB

        LCALL    ACK

        JB       F0,       RD_FAIL

         MOV      A,        R7

        LCALL    WRB

        LCALL    CHK

        JB       F0,       RD_FAIL

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

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

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

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

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",10H

MES_P:   DB       "PASS?",10H

MES_P1:  DB       "PASS1?",10H

MES_P2:  DB       "PASS2?",10H

MES_P3:  DB       "PASS3?",10H

MES_C:   DB       "Welcome!",10H

MES_E:   DB       "ERROR",10H

TAB_1:   DB       "     My master!",10H

XINGHAO: DB       "*" 

MES_O:   DB       "OPASS?",10H

MES_N:   DB       "NPASS?",10H

MES_A:   DB       "Again?",10H 

         END

相关推荐