课程设计
题目 基于LCD1602显示的电子密码锁设计 电气工程学院 朱卫华 级 电子信息工程01班 号 20094470128 周后景
2013年1月
1
学院名称指导老师班学学生姓名
目 录
1.绪论--------------------------------------------------------------------------3
1.1 引言---------------------------------------------------------------3 1.2 摘要---------------------------------------------------------------4
2.总体设计方案--------------------------------------------------------------5
2.1 设计思路-----------------------------------------------------------5
2.2 方案确立-----------------------------------------------------------5 2.3 总体设计方框图-----------------------------------------------------5
3.设计原理分析--------------------------------------------------------------6
3.1 单片机及其外围电路-------------------------------------------------6
3.1.1 复位电路的设计-----------------------------------------------6 3.1.2 时钟电路的设计-----------------------------------------------7 3.2 密码控制电路------------------------------------------------------7 3.2.1 矩阵键盘电路的设计------------------------------------------7 3.2.1 报警控制电路的设计------------------------------------------9 3.2.3 液晶显示电路------------------------------------------------9
4.系统软件设计---------------------------------------10
4.1 系统主程序--------------------------------------------------------10
4.2 初始化及按键识别--------------------------------------------------11 4.3 开锁处理----------------------------------------------------------12 4.4改密处理-----------------------------------------------------------13 4.5液晶显示子程序-----------------------------------------------------13
5.仿真调试与测试----------------------------------------------------------14 总结----------------------------------------------------------------------------16 参考文献----------------------------------------------------------------------17 附录----------------------------------------------------------------------------17
2
1.1 引言
在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报 表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。 在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。 设计本课题时构思的方案是用以STC89C52为核心的单片机控制方案。
3
1.2
摘 要
单片机技术是智能化检测与控制领域应用非常普及并且具有很大潜力的技
术。论文阐述一个基于单片机的液晶显示电子密码锁的设计与实现。系统采用美国Atmel公司的AT89S52单片机作为系统核心,液晶显示器LCD1602作为输出设备显示系统提示信息,4*4矩阵薄膜键盘作为输入设备,配合蜂鸣器、继电器等电路构成整个系统硬件;系统软件采用汇编语言编写。设计的系统液晶显示,密码修改方便,具有报警、锁定等功能,使用便捷简单,符合住宅、办公用锁需求,具有一定的实用价值。
关键词:密码锁;单片机;STC89S52;LCD1602;4*4矩阵键盘
Abstract
Single-chip microcomputer technology is very popular and has great potential
in application of
intelligent detection and control field. This thesis describes the design and implementation of LCD electronic password-lock system based on SCM. The system uses the product of America Atmel corporation AT89S52 as the core of system, liquid crystal monitor 1602 as the output device displaying the prompt information of system, 4*4 matrix membrane keyboard as the input device, with buzzer, relay, and other circuits together constitute the system hardware. The software of the system is written in assembly language. The designed system display in LCD, change password easily, has the function of alarming, locking, and so on. This system is simple and easy to use, meets the demand of residential, office lock needs, has some practical value. Key words: Password-Lock; Single-chip microcomputer; STC89C52; LCD1602; 4×4 matrix keyboard
4
2 总体设计方案
2.1 设计思路
该电路是一种采用以AT89S52为核心的单片机控制方案。 利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还要根据实际需要添加调电存储、声光提示甚至增加遥控控制功能。
2.2 方案确立
为了实现密码的保密性,采用一个4×4的矩阵式键盘可以任意设置用户密码(1-16位长度),从而提高了密码的保密性。 设计采用一个超级密码,送电开机时,只要输入超级密码便可开门,这样可预防停电后再送电时无密码可用。
采用了1602液晶显示器来作为显示单元,提高了可读性,使用户对密码锁的运行情况一目了然。
2.3 总体设计方框图
本设计主要由单片机、矩阵键盘、液晶显示器和密码存储等部分组成。其中矩阵键盘用于输入数字密码和进行各种功能的实现。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由继电器换成电子密码锁的电磁铁吸合线圈即可。系统整体框图如图2.1所示。
图2.1系统结构框图
●各模块功能如下
1.键盘输入模块:分为密码输入按键与几个功能按键,用于完成密码锁输入功
能。
2.蜂鸣器报警电路:用于完成输错密码时候的警报功能。 3.晶振电路:用于单片机的起振。 4.复位电路:完成系统的复位。
5
5.显示模块:用于完成对系统状态显示及操作提示功能。
6.开锁电路:应用继电器及发光二极管模拟开锁,完成开锁及开锁提示
3 设计原理分析
本系统外围电路包括键盘输入部分、密码存储部分、复位部分、显示部分、
报警部分、开锁部分组成,根据实际情况键盘输入部分选择4×4矩阵键盘,显示部分选择字符型液晶显示LCD1602,密码存储部分选用内部存储器来完成。其原理图如图3.1所示。
图3.1电路原理图
3.1单片机及其外围电路
3.1.1复位电路的设计
复位是单片机的初始化操作。单片机启运运行时,都需要先复位,其作用是
使CPU和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。
因而,复位是一个很重要的操作方式。但单片机本身是不能自动进行复位的,必须配合相应的外部电路才能实现。该复位电路采用按键电平复位式复位电路。当单片机已在运行当中时,按下复位键S后松开,在复位引脚RET(9脚)脚持续出现24个振荡器脉冲周期(即2个机器周期)的高电平信号将使单片机复位。也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。如图3.2所示。
6
图3.2复位电路
3.1.2时钟电路的设计
时钟电路为单片机产生时序脉冲,单片机所有运算与控制过程都是在统一的时序脉冲的驱动下的进行的,如果单片机的时钟电路停止工作(晶振停振),那么单片机也就停止运行了。当采用内部时钟时,连接方法如下图所示,在晶振引脚XTAL1(19脚)和XTAL2(18脚)引脚之间接入一个12MHZ晶振,两个引脚对地分别再接入一个电容即可产生所需的时钟信号,电容的容量一般在几十皮法,如22PF。如图3.3所示。
图3.3时钟电路
3.2 密码锁控制电路
3.2.1矩阵键盘电路的设计
为了加强密码的保密性,采用一个4×4的矩阵式键盘可以任意设置用户密码(1-16位长度),从而提高了密码的保密性,同时也能减少与单片机接口时所占用的I/O口线的数目,节省了单片机的宝贵资源,在按键比较多的时候,通常采用这种方法。其原理图如图3.4所示。
7
图3.4 矩阵键盘
每一行与每一列的交叉处不相同,而是通过一个按键来连通,利用这种行列
式矩阵结构只需要N根行线与M根列线,即可组成具有N × M 个按键的矩阵键盘。 在这种行列式矩阵键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。 当确认有按键按下后,下一步就是要识别哪一个按键被按下。对键的识别方法通常有两种:一种是通用的组行扫描查询法;另一种是速度较快的线反转法。 此系统中,我们采用线反转法。首先辨别键盘中有无按键被按下,在单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。具体方法是:向行线输出全扫描字00H,把全部列线置成低电平,然后将列线的电平状态读入累加器A中。如果有按键被按下,总会有一根行线电瓶被拉至低电平从而使行线不全为1。 判断键盘中哪一个按键被按下通常是通过将列线逐列至低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后检查所有行线状态,如果全为1,则所按下的按键不在此列;如果不全为1,则所按下的按键必在此列,而且是在与零电平行线相交的交点上的那个按键。 按键的操作面板如图3.5所示,共计10个数字键和6个功能键,键盘侧面还有一个微型蜂鸣器。键盘侧面还有一个蜂鸣器,每操作一次,它便发出声音,提示操作成功
图3.5键盘操作面板
10个数字键用来输入密码,另外6个功能键分别是:A查看键、B设置新密码键、C退
8
格键、D返回键、E确认/退出键和F开启键。其中退格键的功能是当输入密码错误的时候,清除前面已经输入的数据,重新输入。确认键的功能是确认输入的密码。开启键是切换到密码输入状态,输密码前需按该键才能开始输入密码。按“F”键启动进入输入密码程序,按住“F”键不放3秒以后进入输入密码状态。在输入密码状态下,0-9数字键为有效键,有时间和次数限制功能:只有三次输入密码机会,每次限制在10秒内完成,输入密码有误或每次输入密码超时,则被认为是密码输入错误。当3次输入都错误时,程序将返回起始状态。密码输入正确后,继电器吸合,开锁指示灯亮,表示锁被打开。在密码输入正确的情况下,程序进入查看密码和修改密码状态,按“E” 键退出查看密码状态。按“B”键进入重新设置密码状态,在输入密码时,如发现输入有误,可按“C”删除后,重新输入,按“E”确认后,程序退出修改密码状态。按“D”键或等待10秒后程序退出修改密码和查看密码状态,回到起始状态。程序内定密码为:012345,送电开机时,只要输入内定密码便可开门,这样可预防停电后再送电时无密码可用。当密码输入错误或密码输入时间超过规定的时间时,蜂鸣器报警。
表3.1 按键功能表 按键 0-9键 A键 B键 C键 D键 E键 F键
键名 数字键 查看键 设置新密码键 退格键 返回键 确认/退出键 开启键 功能说明 输入密码 查看密码 设置新密码 退格删除 返回到开始界面 确认/退出 开启密码输入 3.2.2报警控制电路的设计
该电路采用单频音报警电路,实现单频音报警的接口电路比较简单,其发音元件通常
可采用压电蜂鸣器,当在蜂鸣器两引脚上加3~15V直流工作电压,就能产生3kHZ左右的蜂鸣振荡音响。压电式蜂鸣器结构简单、耗电少,更适于在单片机系统中应用。压电式蜂鸣器,约需10mA的驱动电流,可在某端口接上一只三极管和电阻组成的驱动电路来驱动,P.3.1接三极管基极输入端,当P3.7输出高电平“1”时,三极管导通,蜂鸣器的通电而发音,当P3.1输出低电平“0”时,三极管截止,蜂鸣器停止发音。如图3.6所示 :
图3.6报警控制电路
3.2.3液晶显示电路
本系统设计的显示电路是为了给使用者以提示而设置的为了达到界面友好
的目的,显示部分由液晶显示器LCD1602取代普通的数码管完成。开锁时,按
9
下键盘上的开锁按键后,利用键盘上的数字键0-9输入密码,每按下一个数字
键后在显示器上显示一个*,输入多少位就显示多少个*。当密码输入完成时,按下确认键,如果输入的密码正确的话, LCD显示“IUPUT RIGHT”,单片机其中P3.0引脚会输出低电平,使三极管T2导通,电磁铁吸合,继电器开关跳转,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“IUPUT ERROR”,P3.0输出的是高电平,电子密码锁不能打开。通过LCD显示屏,可以清楚地判断出密码锁所处的状态。电路图如图3.7所示:
图3.7 显示器电路
4 系统软件设计
系统的软件设计采用汇编语言编码。设计方法是先用文本编辑器编写源码,然后用软件Keil C51编译,如果没有错误,可连接生成.HEX格式的文件(需事先在Keil C51中设置)。如果有错误则无法连接,但可在生成的.OBJ文件中找到代码错误的地方,便于修改。当然也可以直接在Keil中编码。生成的HEX文件是记录文本行的ASCII文本文件,在HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。HEX文件经常被用于将
程序或数据传输存储到ROM、EPROM,大多数编程器和模拟器使用HEX文件。
4.1 系统主程序
系统的主程序如图4-1所示。由于用户在使用系统的过程中,可能在任何时
刻按下任何按键,而程序都必须对此作出正确响应。
10
图4.1主程序流程图
4.2 初始化及按键识别
如图4.2,系统的初始化包括堆栈起始地址的设定,两个定时/计数器的设定,液晶显示模式的设定,密码缓冲区的初始化,一些自定义数据空间的初始化,蜂鸣器初始化发声等操作。 系统初始化并读取密码完成后,液晶显\" Password Control\",提示用户可以输入密码。此时程序即不断测试按键,检查是否有按键被按下。如果有,则进行按键识别;如果没有按键按下,或者按下的按键没有被识别,R3赋值0FFH,并跳转至按键测试。实际程序运行时,绝大部分时间都在测试按键,等待用户输入。
11
图4.2初始化及按键识别流程图
4.3 开锁处理
首先LCD初始化,输入密码,密码正确则使开锁电路动作,继电器得电, 开锁指示灯亮。开锁程序流程图如图4.3所示。
12
图4.3开锁流程图
4.4 改密处理
如图4.4,可以看出,改密键的处理流程跟开锁键类似,都需检查密码是否
正确,错误的话,提示重新输入,只有输入密码正确才可以进行改密。然后再按更改键,密码更改程序被调用,进而更改密码,此过程,LCD都会显示信息。
图4.4改密流程图 4.5 液晶显示子程序
液晶显示子程序在每次更新显示内容时都会被调用,其流程如图4.5所示。
13
图4.5液晶显示子程序流程图
每次更新显示内容前,需清显示清空LCD原先的显示内容,清屏指令的指
令码为01H,即将P0口赋值01H,然后写入指令寄存器IR。 LCD1602要显示的内容是根据其控制器内置的字符码表,事先列出要显示的ASCII字符串。每次送一个字符的ASCII码入P0口,然后写入数据寄存器DR,最后将字符地址加一,LCD1602会将写入的ASCII码对应的字符依次显示出来。由于显示字符串的长度不尽相同,约定每串字符以00H结尾;程序检测到字符码为00H时,即停止写入,返回。LCD显示的内容在下次更新前会一直保持。
5 仿真调试与测试
1.开机后,LCD1602显示如图5.1所示,等待按键输入
图5.1
2.输入密码分两个过程:首先必须开启密码输入功能才能输入密码,按住“F”键3秒以上才能启动进入输入密码程序,进入输入密码状态,LCD1602显示如图5.2所示:
14
图5.2
3.此时使用矩阵键盘输入密码,在输入密码状态下,0-9为有效数字键。本系统有时间、次数限制功能,不给别人试探机会:三次输入密码机会,每次限制在10秒内完成。 输入密码正确后,蜂鸣器发声1次,继电器吸合,密码锁打开,LCD1602显示如图5.3所示:
图5.3
4.键入密码有误或每次输入密码时间超过10秒,则被认为是密码输入错误。 假如密码输入错误,则LCD1602显示如图5.4所示:
图5.4
15
当3次输入密码都错误时,蜂鸣器连续发声3次,程序将返回起始状态,并锁定。
5.在密码输入正确的情况下,程序进入查看密码和修改密码状态。 按“A”键进入查看密码状态,LCD1602显示如图5.5所示:
图5.5
6.E”键退出看密码状态。
按“B”键进入重新设置状态,LCD1602显示如图5.6所示:
图5.6
在输入新密码时,如果输入有误,可按“C”删除后,重新输入。 按“E”确认后,程序退出修改密码状态。
按“D”键或等待10秒后,程序退出修改密码和查看密码状态,回到起始状态。 设计采用一个超级密码,送电开机时,只要输入超级密码便可开门,这样可预防停电后再送电时无密码可用。超级密码为:012345。
总结
经过一段时间的课程设计,我深深体会到要完成一个设计,首先是要结合生活中对密码锁的功能特性要求,其次是电子密码锁系统的主要硬件结构与软件结构。由于了解的专业知识尚浅使得在技术的解决与应用显得粗糙了一些。不过,该系统的密码修改、开锁提示、输入提示、输出报警功能还算稳定。本系统用的是6位密码输入,有1000000种密码组合,另外本系统软硬件设计简单,易于开发,成本较低,安全可靠,操作方便。
通过过本次设计,我不仅巩固和加深理论课上所学的知识,而且锻炼了分析问题和解决问题的能力;同时培养了良好的工作习惯和科学素养,为我们以后参加工作打下了一定的基础。同时认识到慢工出细活,过程是很重要的,只有耐心细心努力地去把握过程,才能得到可喜的结果。除此之外,相信这次设计中还存在很多不足,希望老师能够批评指正。
16
参考文献
[1] 郭天祥。51单片机C语言教程[M]。电子工业出版社
[2] 李广弟,朱月秀,冷祖祁。单片机基础[M]。北京:北京航空航天大学出版 社,2007
[3] 董继成。一种新型安全的单片机密码锁[J]。电子技术,2004,(03)
[4] 石文轩,宋薇。基于单片机MSC-51的智能密码锁设计[S]。武汉工程职业技术学院学报 [5] 郑学坚,周斌。微型计算机原理及应用。北京:清华大学出版社
附录一 总电路原理图
附录二 PCB图
17
附录三 实物图
附录四 元器件清单
名称 型号 数量 备注
单片机 AT89S52 1 含双列直插插座 电阻 1K 3 电阻 200 1 排阻 8x10k 1 液晶显示器 LM1602 1 瓷片电容 33pF 2 电解电容 22uF 1 按键 轻触按键 17 晶振 12MHz 1 单排插针 1x8 4 发光二极管 1 直流插座 1 下载口 1 蜂鸣器 1 继电器 1
18
附录五 源程序清单
;******************************************************************** BEEP BIT P3.7 RELAY BIT P3.6 SEC10 BIT 20H.1 SEC3 BIT 20H.2
PASS_OK BIT 20H.3 PASS_OLD EQU 30H PASS_NEW EQU 37H
PASS_DIS EQU 40H ;密码显存单元 COUNT EQU 47H ;50ms计数单元 SEC EQU 48H ;秒单元 POS EQU 49H
;********************************************************** BUSY BIT P0.7
LCD_RS BIT P2.0 ;LCD 控制管脚定义 LCD_RW BIT P2.1 LCD_EN BIT P2.2
DATAPORT EQU P0 ;定义LCD的数据端口 LCD_X EQU 29H
TIMES EQU 2AH BUSY_CHECK BIT 20H.0
;********************************************************** ;********************************************************** ORG 0000H AJMP MAIN ORG 000BH LJMP TIMER0 ORG 0050H
;********************************************************** MAIN:
MOV SP,#60H ;设置堆栈指针 MOV P0,#0FFH MOV P1,#0FFH MOV P2,#0FFH
MOV TMOD,#01H ;工作于方式1 MOV TH0,#4CH ;50ms定时常数 MOV TL0,#00H SETB ET0 SETB EA
MOV PASS_OLD,#00H ;内定密码值 MOV PASS_OLD+1,#01H MOV PASS_OLD+2,#02H MOV PASS_OLD+3,#03H
19
MOV PASS_OLD+4,#04H MOV PASS_OLD+5,#05H
ACALL LCD_INIT ;LCD初始化 MAIN1:
CLR TR0 CLR SEC3 CLR SEC10 CLR PASS_OK MOV COUNT,#00H MOV SEC,#00H
SETB RELAY ;继电器释放 ACALL MENU1 ACALL START_IN
MOV R4,#03H ;3次输入密码机会 MAIN2:
ACALL PASS_IN ACALL PASS_COMP
MOV R5,#100 ;延时1s ACALL DELAY
JB PASS_OK,MAIN3 DJNZ R4,MAIN2
ACALL BEEP_BL ;三次输入错误响10声 ACALL BEEP_BL ACALL BEEP_BL ACALL BEEP_BL ACALL BEEP_BL ACALL BEEP_BL ACALL BEEP_BL ACALL BEEP_BL ACALL BEEP_BL ACALL BEEP_BL AJMP MAIN1 MAIN3:
ACALL PASS_LOOK ACALL CHANGE_PASS JB SEC10,MAIN4 ACALL KEY_SCAN
CJNE A,#0DH,MAIN3 ;判是否“D”按下? ACALL BEEP_BL MAIN4:
ACALL BEEP_BL AJMP MAIN1
;**********************************************************
20
; 菜单1显示子程序 (PASSWORD CONTROL) ; ( Menu F )
;********************************************************** MENU1:
MOV B,#00H
MOV DPTR,#INFO1 ;指针指到信息1 ACALL W_STRING1 MOV B,#00H
MOV DPTR,#INFO4 ;指针指到信息4 ACALL W_STRING2 RET
;********************************************************** ; 菜单2显示子程序 (Input Password) ; (Password ------)
;********************************************************** MENU2:
MOV B,#00H
MOV DPTR,#INFO3 ;指针指到信息3 ACALL W_STRING1 MOV B,#00H
MOV DPTR,#INFO2 ;指针指到信息2 ACALL W_STRING2 RET
;********************************************************** ; 菜单3显示子程序 (LOOK PASSWORD) ; (PASSWORD ------)
;********************************************************** MENU3:
MOV B,#00H
MOV DPTR,#INFO7 ;指针指到信息7 ACALL W_STRING1 MOV B,#00H
MOV DPTR,#INFO2 ;指针指到信息2 ACALL W_STRING2 RET
;********************************************************** ; 菜单4显示子程序 (CHANGE PASSWORD) ; (PASSWORD ------)
;********************************************************** MENU4:
MOV B,#00H
MOV DPTR,#INFO8 ;指针指到信息1 ACALL W_STRING1 MOV B,#00H
21
MOV DPTR,#INFO2 ;指针指到信息2 ACALL W_STRING2 RET
;********************************************************** ; 信息字符串表
;********************************************************** INFO1: DB \"Password Control\INFO2: DB \"Password:------ \INFO3: DB \" Input Password \INFO4: DB \" Menu F \INFO5: DB \" Right, Open! \INFO6: DB \" Input Error \INFO7: DB \" Look Password \INFO8: DB \" Reset Password \
;********************************************************** ; 矩阵键盘键值查找程序 ; 键值存入R3
;********************************************************** KEY_SCAN:
MOV P1,#0F0H ;置列线为0,行线为1 NOP
MOV A,P1 ;读入P1口状态 ANL A,#0F0H ;保留高4位 MOV B,A ;保存数据
MOV P1,#0FH ;置列线为1,行线为0 NOP
MOV A,P1 ;读入P1口状态 ANL A,#0FH ;保留低4位
ORL A,B ;高四位与低四位重新组合 CJNE A,#0FFH,KEY_IN1 ;0FFH为末按键 AJMP KEY_END
KEY_IN1:
MOV B,A ;保存键值
MOV DPTR,#KEYTABLE ;置键编码表首址 MOV R3,#0FFH ; KEY_IN2:
INC R3 ;查表次数加1 MOV A,R3
MOVC A,@A+DPTR ;取出键码 CJNE A,B,KEY_IN3 ;比较
MOV A,R3 ;找到,取次数值 AJMP KEY_END KEY_IN3:
CJNE A,#00H,KEY_IN2 ;继续查 ;00H为结束码
22
KEY_END: RET
;********************************************************** ; 键编码表
;********************************************************** KEYTABLE:
DB 0EEH,0EDH,0EBH,0E7H,0DEH DB 0DDH,0DBH,0D7H,0BEH,0BDH DB 0BBH,0B7H,07EH,07DH,07BH
DB 077H,00H ;00H为结束码
;********************************************************** ; 密码显示子程序
;********************************************************** PASS_PLAY:
MOV R0,#PASS_OLD ;存放数据首地址 MOV R2,#06H ;显示6组数据 MOV LCD_X,#09H ;第9列 ACALL SET_X2 ;第二行 P_PLAY:
MOV A,@R0 ;取显示数据 ADD A,#30H ;转换为ASCII码 ACALL WDATA ;写数据,显示 INC R0 ;修改存放数据地址 DJNZ R2,P_PLAY RET
;********************************************************** ; 启动输入子程序
; 按F键大于3秒,方可退出此程序
;********************************************************** START_IN:
CLR SEC3 ;清3s标志位 MOV COUNT,#00H ;清中断计数单元 MOV SEC,#00H S_IN1:
ACALL KEY_SCAN
CJNE A,#0FH,S_IN1 ;“F”键
SETB TR0 ;启动TIMER0中断 S_IN2:
ACALL KEY_SCAN
CJNE A,#0FH,S_IN3 ;“F”键
JNB SEC3,S_IN2 ;没有达到3s,转移 CLR TR0 ;停止TIMER0中断 CLR SEC3 ;清3s标志位 MOV SEC,#00H
23
MOV COUNT,#00H ;清中断计数单元 ACALL MENU2 ACALL BEEP_BL AJMP S_END S_IN3:
CLR TR0 ;停止TIMER0中断 CLR SEC3 ;清3s标志位 MOV COUNT,#00H ;清中断计数单元 MOV SEC,#00H AJMP S_IN1 S_END:
RET
;********************************************************** ; 密码输入子程序
;********************************************************** PASS_IN:
ACALL MENU2
MOV R0,#PASS_NEW ;存放输入密码单元首地址 MOV R2,#06H ;6位密码
MOV LCD_X,#09H ;确定显示首位置 ACALL SET_X2
CLR SEC10 ;清10s标志位 MOV SEC,#00H ;清秒计数单元
MOV COUNT,#00H ;清中断计数单元 SETB TR0 P_IN1:
JB SEC10,P_END ACALL KEY_SCAN
CJNE A,#0FFH,P_IN2 ;判是否有键按下? AJMP P_IN1 P_IN2:
ACALL KEY_SCAN
CJNE A,#0AH,P_IN3 ;数字键0-9有效 P_IN3:
JNC P_IN1 ;>=时,C=0 MOV A,R3 ;取键值
MOV @R0,A ;保存输入密码值 INC R0
ADD A,#30H ;转换为ASCII码 ACALL WDATA ;显示输入密码值 ACALL BEEP_BL ;蜂鸣器响一声 DJNZ R2,P_IN1 P_END:
24
MOV R5,#50 ;延时50mS ACALL DELAY ACALL BEEP_BL CLR TR0
MOV SEC,#00H ;清秒计数单元 CLR SEC10 ;清10s标志位 MOV COUNT,#00H ;清中断计数单元 RET
;********************************************************** ; 修改密码子程序
;********************************************************** CHANGE_PASS:
ACALL KEY_SCAN
CJNE A,#0BH,CH_END ;判“B”键是否按下? CLR TR0 ACALL MENU4
MOV R0,#PASS_OLD ;存放输入密码单元首地址 MOV R2,#06H ;6位密码
MOV POS,#09H ;确定显示首位置 ACALL BEEP_BL CH_IN1:
ACALL KEY_SCAN
CJNE A,#0FFH,CH_IN2 ;判是否有键按下? AJMP CH_IN1 CH_IN2:
ACALL KEY_SCAN
CJNE A,#0AH,CH_IN3 ;数字键0-9有效 CH_IN3:
JNC CH_IN4 ;>=时,C=0 MOV LCD_X,POS ;确定显示位置 ACALL SET_X2
MOV A,R3 ;取键值
MOV @R0,A ;保存输入密码值 ADD A,#30H ;转换为ASCII码 ACALL WDATA ;显示输入密码值 ACALL BEEP_BL ;蜂鸣器响一声 INC POS INC R0
DJNZ R2,CH_IN1 ;6位密码是否输入完? AJMP CH_IN6 CH_IN4:
ACALL KEY_SCAN
CJNE A,#0CH,CH_IN1 ;“C”修改键 MOV A,POS
25
CJNE A,#09H,CH_IN5 ;检测POS是否到最小值 AJMP CH_IN1 CH_IN5:
DEC POS DEC R0 INC R2
MOV LCD_X,POS ACALL SET_X2
MOV A,#2DH ;显示“-” ACALL WDATA
ACALL BEEP_BL ;蜂鸣器响一声 AJMP CH_IN1 CH_IN6:
ACALL KEY_SCAN
CJNE A,#0EH,CH_IN7 ;“E”键确定退出 ACALL MENU1 ACALL BEEP_BL AJMP CH_END CH_IN7:
CJNE A,#0CH,CH_IN6 ;“C”键返回修改 AJMP CH_IN5 CH_END:
SETB TR0 RET
;********************************************************** ; 密码比较子程序
; 比较正确,置密码正确标志位。 ; 比较错误,清密码正确标志位。
;********************************************************** PASS_COMP:
MOV R2,#06H ;比较6组数据 MOV R0,#PASS_OLD ; MOV R1,#PASS_NEW P_COMP0:
MOV A,@R0 MOV B,@R1
CJNE A,B,P_COMP1 INC R0 INC R1
DJNZ R2,P_COMP0
SETB PASS_OK ;置密码正确标志位 CLR RELAY ;继电器吸合 ACALL BEEP_BL ACALL BEEP_BL
26
ACALL BEEP_BL MOV B,#00H
MOV DPTR,#INFO5 ;指针指到信息5 ACALL W_STRING2
MOV SEC,#00H ;清秒计数单元 CLR SEC10 ;清10s标志位 MOV COUNT,#00H ;清中断计数单元 SETB TR0 RET P_COMP1:
CLR PASS_OK ;清密码正确标志位 MOV B,#00H
MOV DPTR,#INFO6 ;指针指到信息6 ACALL W_STRING2 RET
;********************************************************** ;查看密码子程序
;********************************************************** PASS_LOOK:
ACALL KEY_SCAN
CJNE A,#0AH,LOOK_END ;“A”键查看 ACALL MENU3 CLR TR0
ACALL PASS_PLAY ACALL BEEP_BL LOOK_1:
ACALL KEY_SCAN
CJNE A,#0EH,LOOK_1 ;“E”键退出 ACALL MENU1 ACALL BEEP_BL SETB TR0 LOOK_END: RET
;********************************************************** ;
;蜂鸣器响一声子程序 ;
;********************************************************** BEEP_BL:
MOV R6,#200 BL1:
ACALL BL2
CPL BEEP ;蜂鸣器取反产生驱动脉冲 DJNZ R6,BL1
27
SETB BEEP ;关闭蜂鸣器 MOV R5,#15 ACALL DELAY RET BL2:
MOV R7,#200 BL3: NOP
DJNZ R7,BL3 RET
;********************************************************** ;定时器0计时中断子程序
;********************************************************** TIMER0:
PUSH ACC PUSH PSW
MOV TL0,#00H ;50ms定时常数 MOV TH0,#4CH INC COUNT
MOV A,COUNT ;50ms 计数值加1 CJNE A,#20,T0_END MOV COUNT,#0
INC SEC ;秒加1 MOV A,SEC
CJNE A,#03H,T0_0
SETB SEC3 ;置3s标志位 T0_0:
CJNE A,#10,T0_END ;是否到10秒? MOV SEC,#0 ;秒单元清0 SETB SEC10 ;置10s标志位 T0_END:
POP PSW POP ACC RETI
;********************************************************** ; 延时R5*10MS子程序
;********************************************************** DELAY:
MOV R6,#50 DEL1:
MOV R7,#93 DEL2:
DJNZ R7,DEL2 DJNZ R6,DEL1
28
DJNZ R5,DELAY RET
;********************************************************** ; 延时5MS子程序
;********************************************************** DELAY1: MOV R6,#25 DEL3:
MOV R7,#93 DEL4:
DJNZ R7,DEL4 DJNZ R6,DEL3 RET
;************************************************************* ;检查LCD忙状态 ;busy为1时,忙,等待。busy为0时,闲,可写指令与数据
;************************************************************* LCD_BUSY:
MOV DATAPORT,#0FFH BUSY_1:
CLR LCD_RS SETB LCD_RW CLR LCD_EN NOP
SETB LCD_EN
JB BUSY,BUSY_1 CLR LCD_EN RET
;********************************************************** ;LCD写命令子程序
;LCD_RS=L,LCD_RW=L,D0-D7=指令码,E=高脉冲
;********************************************************** WCOM:
JNB BUSY_CHECK,WCOM_1 ACALL LCD_BUSY WCOM_1:
MOV DATAPORT,A ;写入指令与地址 CLR LCD_RS CLR LCD_RW NOP
SETB LCD_EN NOP
CLR LCD_EN RET
29
;********************************************************** ;LCD写数据子程序
;LCD_RS=H,LCD_RW=L,D0-D7=数据码,E=高脉冲
;********************************************************** WDATA:
ACALL LCD_BUSY MOV DATAPORT,A ;写入数据 SETB LCD_RS CLR LCD_RW NOP
SETB LCD_EN NOP
CLR LCD_EN RET
;********************************************************** ; 在 LCD 第一行的指定显示位置
;********************************************************** SET_X1:
MOV A,LCD_X ADD A,#80H ACALL WCOM RET
;********************************************************** ; 在 LCD 第二行的指定显示位置
;********************************************************** SET_X2:
MOV A,LCD_X ADD A,#0C0H ACALL WCOM RET
;********************************************************** ; 清除LCD的第一行
;********************************************************** CLR_LINE1:
MOV A,#80H ;设置 LCD 的第一行地址 ACALL WCOM ;
MOV R0,#16 ;设置计数值 CLR1:
MOV A,#20H ;载入空格符至LCD ACALL WDATA ;输出字符至LCD DJNZ R0,CLR1 ;计数结束 RET
;********************************************************** ; 清除LCD的第二行
30
;********************************************************** CLR_LINE2:
MOV A,#0C0H ;设置 LCD 的第二行地址 ACALL WCOM ;
MOV R0,#16 ;设置计数值 CLR2:
MOV A,#20H ;载入空格符至LCD ACALL WDATA ;输出字符至LCD DJNZ R0,CLR2 ;计数结束 RET
;********************************************************** ; 写字符串子程序1
;********************************************************** W_STRING1:
MOV A,#80H ;设置 LCD 的第一行地址 ORL A,B
ACALL WCOM ;写入命令 ACALL FILL_CHAR RET
;********************************************************** ; 写字符串子程序2
;********************************************************** W_STRING2:
MOV A,#0C0H ;设置 LCD 的第二行地址 ORL A,B
ACALL WCOM ;写入命令 ACALL FILL_CHAR RET
;********************************************************** ; 写入字符子程序
;********************************************************** FILL_CHAR:
CLR A ;填入字符
MOVC A,@A+DPTR ;由字符区取出字符 CJNE A,#0,F_CHAR ;判断是否为结束码 RET F_CHAR:
ACALL WDATA ;写入数据
; MOV R5,TIMES ;延时,形成逐字显示的效果 ; ACALL DELAY
INC DPTR ;指针加1
AJMP FILL_CHAR ;继续填入字符 RET
;**********************************************************
31
; LCD 初始化子程序
;********************************************************** LCD_INIT:
CLR BUSY_CHECK ;不进行忙检测 MOV A,#38H ;双列显示,字形5*7点阵 ACALL WCOM ACALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵 ACALL WCOM ACALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵 ACALL WCOM ACALL DELAY1
SETB BUSY_CHECK ;进行忙检测 MOV A,#0CH ;开显示,不显示光标。 ACALL WCOM ACALL DELAY1
MOV A,#06H ACALL WCOM ACALL DELAY1
MOV A,#01H ;清除 LCD 显示屏 ACALL WCOM ACALL DELAY1
ACALL WRITE_CHAR ;写自定义字符入CGRAM RET
;********************************************************** ; 自定义字符写入CGRAM子程序
;********************************************************** WRITE_CHAR:
MOV A,#40H ACALL WCOM MOV R1,#08H
MOV DPTR,#SPEAKER W_CHAR1:
CLR A
MOVC A,@A+DPTR ACALL WDATA INC DPTR
DJNZ R1,W_CHAR1 RET SPEAKER:
DB 01H,1BH,1DH,19H,1DH,1BH,01H,00H ;//小喇叭
;****************************END***************************
32
因篇幅问题不能全部显示,请点此查看更多更全内容