《微机应用设计与实践》课程设计
设计课题 酒店电子保险箱
系 别 信息科学与工程学院
专 业
班 级
姓 名
学 号
指导教师 许雪林
2012 年 01 月 07 日
目录
一、设计任务与实现目标 ............................................................................................3
基本设计要求: ...............................................................................................3
功能扩展提示:(选做) ...............................................................................4
设计说明书内容纲要: .........................................................................................4
二、总体设计方案与方案论 ........................................................................................5
系统总体框架 ...................................................................................................5
设计方案与方案论证 .......................................................................................6
方案选择 ...........................................................................................................6
方案论证 ...........................................................................................................6
三、总框图及总体软件设计说明 ................................................................................7
总流程图 ...........................................................................................................7
总体软件设计说明 ...........................................................................................8
四、系统资源分配说明 ................................................................................................9
硬件资源分配 ...................................................................................................9
微处理器内部存储单元分配及数据定义说明 ...............................................9
五、局部程序设计说明 ..............................................................................................10
拆字模块 .........................................................................................................10
错误提示:显示“E”.......................................................................................11
显示模块 .........................................................................................................11
键盘扫描模块 .................................................................................................12
并字模块描述: .............................................................................................13
开门以及门闩模块描述: .............................................................................16
密码修改描述: .............................................................................................16
功能键流程图: .............................................................................................16
12S 无动作描述:..........................................................................................18
15 分钟锁键描述: ...................................................................................19
精确时钟流程图: .......................................................................................19
六、系统功能与操作说明 ..........................................................................................21
七、调试记录及调试结果 ..........................................................................................21
1.拆字模块 ............................................................................................................21
2.错误显示模块 ....................................................................................................21
3.显示刷新 ............................................................................................................22
4.键盘获取 ............................................................................................................22
5.并字调试 ............................................................................................................22
6.匹配调试与开门调试 ........................................................................................22
7.门闩开关调试 ....................................................................................................22
8.管理员控制码输入 ............................................................................................22
9.密码修改 ............................................................................................................22
10.时间调校 ..........................................................................................................22
八、设计总结 ..............................................................................................................22
附件 1: 程序 .............................................................................................................24
附件 2:原理图 ……………………………………………………………………37
一、 设计任务
设计课题:酒店电子保险箱
设计目的:通过小型微机应用产品的设计与调试过程,运用《微机原理及接
口技术》课程所学的基本知识,在设计中加以应用,进而得到理解、巩固
和提高发展,通过实践的过程学习掌握分析与解决实际问题的方法与手段,
提高设计、编程与调试的实际动手能力,作为工程技术工作的一次基本训
练。
设计任务:设计一个以单片机为核心的酒店电子保险箱,能在酒店客房中提
供给客户使用。具有密码开锁,密码修改、密码输入安全设置、保险箱使
用时间等功能。编程并在单片机实验板上模拟调试实现。
基本设计要求:
1、开机进行接口部件及数码显示器、指示灯、讯响器等自检。
2、密码分为管理员密码和用户密码:管理员密码为 8 位 0~9 的数字,而
用户密码为 6 位 0~9 的数字。
3、设置“0”~“9”的数字键及“OP”、“LO”、和“CL”等功能键。对按键输入的
信号须进行软件消抖处理。
4、保险箱的门有两种状态:打开状态和闭合状态。
5、工作模式:
(1)常态:数码管显示时钟。
(2)开锁模式:需输入 6 位数字为 0~9 的用户密码或输入 8 位数字为 0~9
的管理原密码进行开锁。然后按“OP”键开门。
(3)用户修改密码模式:在保险箱开门状态下,由用户自行输入 6 位数
字为 0~9 的密码作为新密码,用户初始密码为 000000。
(4)管理员操作模式:保险柜开门状态下输入 8 位 0~9 的管理员密码,
可以进行调校实时钟、恢复用户初始密码和修改管理员密码、设置保险箱使用
日期等功能。
6、常态下,八位 LED 7 段数码管显示时钟信息可包括小时、分钟、秒钟。
7、常态下,当保险箱关门状态下,只要按下 0~9 的数字键则进入密码输
入状态,每按一个数字键使数码管从左到右逐次显示“—”。
8、如果输入密码 6 位后按“OP”键则与用户密码进行匹配,匹配一致则开
锁;如果输入密码 8 位后按“OP”键则与管理员密码进行匹配,匹配一致则进
入管理员操作模式。
9、在密码输入状态下,输入未满 6 位或 8 位数字密码,按“OP”键则不作
响应。
10、输入的用户密码如果匹配一致则驱动电动开门电磁铁线圈通电 1S,用
户拉门把可以打开保险箱;如果输入不正确,则提示“E”,3S 后返回常态,
等待下一轮的密码输入。
11、密码输入过程可以按“CL”键取消输入返回常态。
12、用户可以在保险箱开门状态下,通过输入 6 位 0~9 的数字后按“LO”键
进行设置新的用户密码。
13、当保险箱处于开门状态下,输入管理员密码后按 OP 键进入管理员操
作模式下,输入 01 功能码代表修改管理员密码;输入 02 功能码代表恢复用户初
始密码;输入 03 功能码代表实时钟的调校设置,利用数字 3 和数字 4 按键实现
对时和分钟的增量式调校,持续按键超 时实现快调功能;按“CL”键退出管
理员操作模式。
功能扩展提示:(选做)
1、非常态下 12S 内无按键操作则自动返回常态;
2、管理员操作模式下,03 代表设置保险箱使用日期功能,如果开始日期和
结束日期均为 0:0:0,表示日期不受限制;04 代表查询本次开箱前 5 次的日期和
时间。
3、如果连续五次输入用户密码错误则报警且锁键 15 分钟;
4、其他功能扩展。
设计环节及进程安排:
1、布置课题,明确任务、总体方案设计 2 天
2、基本功能控制程序设计及调试 3 天
4、程序功能完善、改进、扩展 3 天
5、答辩及编写设计说明书 2 天
设计说明书内容纲要:
1、.设计任务
2、总体方案设计与方案论证
3、总框图及总体软件设计说明
4、系统资源分配说明
5、局部程序设计说明
6、系统功能与操作说明
7、调试记录及调试结果
8、课程设计总结
9、附录:源程序清单(详细注释)
计算机系统结构教研室 2012 年 12 月
二、总体设计方案与方案论
系统总体框架
酒
店
电
子
密
码
箱
按键扫描
拆字送显缓
更新显示
开门动作
锁键
管理员部分
密码修改
用户部分
共用部分
无操作
门闩动作
时钟部分
密码匹配
取消退格
输入送缓存
无
操
作
模
式
管理员操作
进入
进入
操
作
模
式
修改用户密码
修改管理员密码
用户密码初始
错误动作
时间调校
设计方案与方案论证
整个程序采用标志位引导方式实现程序功能,并且将程序模块化,循环扫描
各服务子程序。
更新模块---数码管动态扫描子程序
取显示缓冲单元的内容,找到其在段码表中的段码值及位置即键号,分别对
应传送到 82C55 的 A、B 口,使所得值显示在数码管上。
时钟显示模块
当常态标志位为 0 时,数码管上显示时钟,格式为时-分-秒,将双字节时钟单
元拆字并传送到显缓 30H-37H 对应的各个单元。
键盘扫描模块
采用线反转法获得行列码,在键码表中找到对应的行列码的位置即键号,并采
用滚动滤波法对按键进行消除抖动。新键号存在 2EH,旧态放在 2FH 单元中。
密码匹配模块
在密码匹配允许下进行密码比对。
密码修改模块
在密码修改允许下进行密码修改。
开门及门闩模块
根据开门标志位决定对电磁铁线圈通电 1S 与否。门闩是一个输入器件。
用户部分
有键按下,转为非常态,等待下一位密码输入,为 6 位密码则进入用户模块操
作。
管理员部分
输入密码为 8 位则进入管理员模块操作。
12S 无操作返回及其他拓展部分
在常态下,若没有按键按下,开始计时,时间到 12S 左右,程序返回常态。若
有则重置定时初值。密码输入出错五次,进行锁键。
方案选择
拆字部分:
方案一:只要检测到按键按下则显示“—”,否则显示实时钟。
方案二:给定单元作为模式选择、判断。拆字时按照不同模式给以不同程序段处
理。常态:实时钟显示;开锁态:显示“—”;管理员状态:显示功能号码或
“—”、或实时钟。
密码存储部分:
方案一:单个存储单元储存单位密码。
方案二:由于只用到简单数码键作为密码,所以可以使用并字将两个密码存储在
同一个单元。
方案论证
拆字部分:
方案一程序简单,占用存储单元较少。
方案二程序较长,所需存储单元单元较多。但是,考虑到用户的需求,尤其是老
年用户的记忆需要。所以牺牲一定存储单元是有必要的。
综上所述,选择方案二。
密码存储部分:
方案一:代码编写简单。
方案二:代码编写较之前复杂。在密码类型简单情况以及 RAM 单元够用情况下,
没有太大优势。但是在密码类型较多以及 RAM 单元紧张情况下,优势非常明显。
并且为后期的拓展提供了方便。
综上所述,选择方案二。
三、总框图及总体软件设计说明
总流程图
一一
一一一一一
一一一一一一
一
一一一一一一
一
一一一一一一
一一一
一一一一一一
一
一一一一一一
一
一一一一一
一一一一一
一一一一一一
一
一一一一一
一一一一一一
一
一一一一一一
一
一一一一一一
总体软件设计说明
本设计采用汇编语言编程。 系统在上电复位后,程序开始运行,经过初始
化,在无任何操作的情况下,八位数码管显示实时钟。
程序循环时对键盘进行扫描。常态有键按下时,当键号为 0 到 9 这十个数码
键时则输入密码锁的密码。非常态时,不同的功能键对应不同处理,同时,12
秒无按键按下,返回常态显示实时钟。
当密码输入满六位或者八位后,按下 OP 键,进入密码匹配程序进行输入的
密码与原存储密码判断是否一致,若一致说明密码正确,循环主程序时启动开门
子程序 KM 执行开锁动作,点亮二极管 一秒,循环主程序时启动子程序
SWITCH 拨下 SW0 进行开门,开门指示灯 L8 亮,返回常态显示实时钟。若是
六位密码匹配正确后开门,则是用户操作模式,用户可进行密码修改,连续两次
输入密码,并按下‘LO’键进行确认修改。程序判断两次密码是否相同,若相同,
用户密码修改成功,若不同密码修改失败。
当密码输入满八位后,按下 OP 键,进入管理员密码匹配程序进行输入的密
码与原存储密码判断是否一致,若一致说明密码正确,进入管理员模式,此时再
次输入管理员密码进入管理员模式,按键按下‘01’或‘02’或‘03’进入不同功能模式。
‘01’是进行管理员密码修改,管理员可进行密码修改,连续两次输入密码,并按
下‘OP’键进行确认修改。程序判断两次密码是否相同,若相同,管理员密码修改
成功,若不同密码修改失败。‘02’是进行管理员初始化用户密码初始化,按下
‘02’功能号后再按确认键‘OP’进行用户密码初始化。‘03’是实时钟的设置,利用
数字 3 和数字 4 按键实现对时和分钟进行调校,连续按下 后实现时钟与分
钟快调。在管理员模式下,按下 CL 键,程序将回到常态显示实时钟。
若有任何不一致说明密码不正确,循环主程序时启动错误显示子程序 CW,
使八位数码管最右位显示’E’三秒,返回常态显示实时钟。若五次输入密码错误,
程序将通过数码管显示时时钟,发出报警,并锁定键盘输入十五分钟。
四、系统资源分配说明
硬件资源分配
1、4*4 键盘按键分配
K0~K9 为 0~9 的数字键盘
KA 为 OP 键
KB 为 LO 键
KC 为 CL 键
KD 为 TG 键
2、指示灯分配
L5 灯为开锁一秒指示灯(图一)
L8 灯为开门状态指示灯(图二)
(图一)
(图二)
微处理器内部存储单元分配及数据定义说明
并字允许标志位,可并字置 1
27H. 1 普通密码匹配模式标志为,为 0 进行用户密码匹配,为 1 进行管
理员密码匹配
27H. 2 开门允许标志位,可开门置 1
27H. 3 错误标志位,错误置 1
27H. 4 键盘获取方式标志为,0 为密码输入模式,1 为管理员控制
方式输入模式
27H. 5 状态标志位,0 为常态,1 为非常态
控制码存放标志位,0 存放在 5AH,1 存放在 5BH
28H. 1 密码二次输入标志位,为 1 未进行二次输入
28H. 2 密码修改标志位,为 1 为进行密码修改输入
28H. 3 门状态标志位,为 1 则门开着
28H. 4 修改密码允许位,为 1 进行密码修改
28H. 5 时间调整允许标志位,可修改置 1
0 1 2 3
4 5 6 7
8 9 OP LO
CL TG
28H. 6 键盘锁定标志位,为 1 锁定,不允许获取键盘输入
29H~2FH 消抖单元
30H~37H 显示缓冲单元
38H~3CH 时间记录存放单元
3DH 存放错误次数
3EH 锁键分钟数设置
3FH 快调计时 存储单元
40H~42H 用户密码存储区
43H~46H 管理员密码存储区
48H~4BH 输入密码存储区
4CH~4FH 二次输入密码存储区
50H~57H 键盘读入存储区
58H 密码位数存储单元
59H 密码存放地址存储单元
5AH 控制方式首位输入存放单元
5BH 控制方式次位输入存放单元
5CH~5DH 3S 延时存储单元
60H 键盘扫描读入值存储单元
61H 键号值
62H 键盘获取存储单元
63H 压缩密码位数存放单元
64H 密码匹配暂存存储单元
65H 12S 计数存储单元
五、局部程序设计说明
拆字模块
拆字流程图:
拆字模块描述:
进入拆字模块,先把显示缓冲单元 30H-37H 赋值#12H,灭显示。接着判断 的值,检
测当前状态若为 0 表示当前状态是常态,进入 CZ1 进行常态拆字时分秒,显示缓冲单元存
放时分秒。不为 0 则跳转到 FCT 检测键盘输入模式,其标志位为 ,为 0 则为密码输入
部分的拆字,根据按键次数把‘—’放入显示缓冲单元中,从 30H 开始放起,最多放到 37H。
为 1 则为管理员功能号输入拆字,将 5AH 与 5BH 中的值显示在 37H 与 36H 中,可显示 01、
02、03。
错误提示:显示“E”
错误显示 E 描述:
根据标志位 判断是否启动 CW 子程序。为 1 则进入子程序,灭显示缓冲单元,
然后在 30H 单元存入#0EH,在数码管最右一位显示‘E’,用循环递减的方式显示‘E’三秒后,
清标志位 ,清按键密码存储单元,返回常态显示时钟,清按键数。
显示模块
显示模块描述:
系统使用共阴极数码管显示。实验板采用动态显示方式,每次点亮一个 LED 显示器,
延时 1MS 时间再点亮下一个 LED 显示器,周而复始,8 个 LED 显示器轮流动态扫描。
利用人视觉暂留效应,看起来好像几个显示器上“同时”显示不同的字符。把显示缓冲单元的
值依次从八位数码管从右到左显示。为防止窜显,我们在点亮数码管前先送暗码给数码管,
且在数码管显示一秒后也对数码管送暗码。此时数码管就不会出现窜显现象。
键盘扫描模块
键盘扫描流程图:
一一&
一一
=0?
一一一
=0?
5AH-37H
5BH-36H
一一
一一一一一一一
58H,一一一一一一
一一一“ -”
=0?
一一一一一30-37H
一一一一一一一
30H一一一“ E” 一
一一3s
一一
Y一一
N一一一
Y一一一一N一一一一一
N一一一一
Y一一一一
KEY
INPUT
一一一一一一
=0一一一
一一
OP?LO?
CL?TG?一一一一一62H
12s一一一一
=0?一一
一一一
=0?一一
一一一一一一
一
一一一一
一一一一
=0一一一
一一一一一
=0一一一
一一一一
一一一一一一一一
一
一一一一 一一一一一
Y
一一一一0-9 N一一一一一Y
Y一一
Y
N
Y
N
Y
Y
N
一一
一一一一一
N一一一一
一一
一一一一
键盘扫描模块描述:
采用线反转法扫描得到键盘行列码,根据事先编好的键码表(按国际键盘分布排
列)对应行列码查表得到键号,之后根据键号做相应操作(结合其他子模块),
功能键则处理相应功能,数字键则相应存储、输出数字量。理论上当按键按下或
弹起时,可以相应的产生低电平或高电平,但实际并非如此。键盘按键一般都采
用触点式按键开关。按键被按下或释放时,按键触点的弹性会产生抖动现象。即
当按键按下时,触点不会迅速可靠地接通,当按键释放时,触点也不会立即断开,
而是要经过一段时间的抖动才能稳定下来,按键材料不同,抖动时间也各不相同。
按键抖动可能导致单片机将一次按键操作识别为多次操作,一般采用硬件电路或
软件程序来消除。本次用软件消抖,即滚动滤波的方式消抖。
并字流程图:
并字模块描述:
在并字允许的情况下,确认输入八位或六位情况下,将两个键号压缩放置在一个
单元。第一次输入放在以 4BH 为首地址的单元,第二次从 4FH 开始。
匹配模块流程图:
一一
=0一
一一一一一一一一
R0一一一一一一一
一
=0一
一一一一一一一一
一一4BH 一一一一一一4FH
一一
一一
N一一一
Y一一一一
N一一一一Y一一一一一
一一一一
一一一一
=0?
=0?
=0?
6/8
=0?
一一6一一一一一 一一8一一一一一 一一一一一一一一
一一一一一8一6一
Ok一 Ok一
=0?一一一一一
一1一一一一一
一一一一一一1
一一一一一
一
一一一一
一一一一
一一一一一
Ok一
Y一一一一一一一
一一一1
5A、5B一一
一一一一一一1
一一一一一一
一58H一=0
一59H一=57H
一3DH一-1
3DH=0一
一一一一一15min
一3DH一一5
一一
N
Y一一一一
N一一一一
一一
NY
Y
N
Y一一一一一一
Y
N
N
Y
Y
NY
N
匹配模块描述:
由于本设计采用二次密码确认新密码,所以匹配除了正常的开锁匹配,还包括了
修改密码匹配。匹配采用的是一一比对的方法,只要一次比对失败,就退出改子
程序,并带上错误标志位。
开门以及门闩流程图:
一一
一一一一一
=0一
L5一1S
N
一一
Y
一一一一
=0?
=0?
一4BH一一一42H
一
一4BH一一一46H
一
一一
N
Y一6一
N一8一
一一
SWITCH
=0一
一一C一一一
一A一一一
一一一一一
#0FEH
=0一
一一
一一C一一一
一A一一一
N
N
Y
SETB
一一一
一一一一一
#0FFH
CLR
一一一
Y
开门以及门闩模块描述:
在开门允许标志位有效情况下,可以拉开门闩。亮 L5 一秒说明有效时间。L8 说
明门闩状态。门闩状态需注意,只能是输入器件。
密码修改流程图:
密码修改描述:
密码修改允许位是该子程序的钥匙,进入后分为管理员密码修改和用户密码修改。
修改时,可任选 4BH 或者 4FH 的内容作为最新密码。
时间调校描述:
利用数字 3 和数字 4 按键实现对时和分钟的增量式调校,持续按键超 时实
现快调功能。
功能键流程图:
一一
一一一一一
=0一
L5一1S
N
一一
Y
一一一一
=0?
=0?
一4BH一一一42H
一
一4BH一一一46H
一
一一
N
Y一6一
N一8一
一一
TG
58H=0一
58H-1
59H-1一一
Y
N
OP
=0?
6一8一
一一一一
一一一一
SETB 一一
一一一一一
SETB 一一
一一一一一一一
SETB 一一一
一
一36H、37H一一
一
一一
02
01?
一一8一一一6一
Y
03一
N
Y
Y
一一6一一8一
N
N
功能键描述:
TG:退格。
OP:输入确定。
LO:用户修改密码。(门开时有效)
CL:返回常态键。
无动作描述:
程序如下:
DJNZ 65H,ZXC ;对非常态返回计数单元减 1
MOV 27H,#0
ANL 28H,#01001000B ;置标志位
MOV 58H,#0
MOV 59H,#57H
ZXC: CJNE A,#60H,DONE ;满 1 分钟?
MOV 3AH,#0 ;秒单元清零
在每次按键时都给 65H 立即数 12,在无按键时,65H 每秒减一,等零时,除门闩其他标志
位清零。
分钟锁键描述:
程序如下:
一一一一一
一一1
LO
=0一
=0?
一一一一一一
一一一6一一
一一一1
SETB
一一
N
Y
一
Y
N
一一一一一一一一
一一一一
一。
CL
一一
MOV A,3EH
CJNE A,#0,ZXC2
SJMP ZXC3
ZXC2: DEC 3EH
ZXC3: MOV A,3BH ;分钟单元(按 BCD 码)加 1
当错误 5 次时,3EH 被赋值,此时标志位 没执行 CJNE A,#0,ZXC2 就不能执行,
一直处于锁键。只有 15 分钟后才能被清零。
精确时钟流程图:
精确时钟描述:利用 51 单片机内部时钟振荡产生的时钟信号,用定时器 0 选用
方式 2 定时工作模式每定时计数 256 次对 38H 单元加 1,38H 单元计数 36 次即
系统内部定时器 1
产生定时计数满 256
次
INC 38H
N
MOV 38H=0
INC 39H
38H=36?
Y
N
39H=100?
Y
MOV 39H=0
3AH 加 1
N
3AH=60?
Y
MOV 3AH=0
3BH 加 1
N
3BH=60?
Y
MOV 3BH=0
3CH 加 1
N
3CH=24?
Y
MOV 3CH=0
返回
晶振频率为 的微控制器 9126 个机器周期=10ms,满 10ms 则 10ms
计数单元 39H 加 1,不满 10ms 则返回;39H=100 时即为 1s,则 10ms 计数单元
清 0、秒计数单元 3AH 加 1,不满 1s 则返回;3AH=60 时即为 1min,则秒计数
单元清 0、分计数单元 3BH 加 1,不满 1min 则返回;3BH=60 时即为 1hour,则
分计数单元清 0、小时计数单元 3CH 加 1,不满 1hour 则返回;3CH=24 时即为
小时完成一个循环,则小时计数单元清 0 返回,不满 24 小时也返回。
六、系统功能与操作说明
常态下八位数码管显示实时钟。非常态下,12S 无操作则返回常态。
键盘按键 6 次,输入 6 位正确用户密码,八位数码管右边六个显示‘-’,按
下 OP 键,二极管 点亮一秒。数码管返回常态显示实时钟。在一秒内拉下
SWO 门闩,L8 亮代表门开。在开门状态下,继续输入六位密码并按下 LO 键,
此时为修改密码状态,修改密码需输入两次新密码,只有两次输入一致,密码才
能修改成功。输入 6 位错误密码,按下 OP 键时,最右边数码管显示‘E’三秒。三
秒后数码管返回常态显示实时钟。密码输入错误次数五次,蜂鸣器报警并且锁定
键盘。
键盘按键 8 次,输入 8 位正确管理员密码,八位数码管八个显示‘-’,按下 OP
键,门开,此时拉下门闩,继续输入八位正确管理员密码就进入管理员模式选择。
如果第一次输入八位密码时门闩的前态是开状态,那么输入一次八位密码就可以
进入管理员模式选择。管理员模式下,输入 01,按下 OP 键则进行管理员密码修
改,输入两次新密码,两次密码一致则密码修改成功,修改成功后,可继续进行
管理员模式选择。输入 02,按下 OP 键,对用户密码进行初始恢复,成功后仍可
进行管理员模式选择。输入 03 按下 OP 键,数字 3 按键实现对时增量式调校。
按数字 4 按键实现对分钟的增量式调校。
在输入按键情况下,按下退格键可退格。除锁键状态外,按下 CL 恢复常态。
在管理员模式选择状态下,关上门闩,系统也恢复常态。
七、 调试记录及调试结果
1.拆字模块
当程序初始化后开始运行,我们对键盘无任何操作时为常态,常态正常显示
实时钟。设置为非常态且为密码输入状态,给密码位数赋初值,观察显示的“—”
个数是否正确。显示“—”成功后,测试控制码显示,给 5AH 和 5BH 初值,观察
是否显示正确。该步骤调试顺利。
2.错误显示模块
将错误标志位置一,观察显示。调试时,正常显示“E”3S。
3.显示刷新
只留下拆字与显示刷新两个子程序进行调试,在调试时发现有两处窜显,先
在在 DISP 中“LCALL D1MS”指令后加入暗码传送,发现最右位仍有窜显,原因
是从 37H,子程序便退出。所以应该在进入显示刷新时也加上一条消除窜显语句。
添加后,最终在调试中窜显消失。我们试着将暗码放在其他地方,尝试过后最终
决定在 DISP 中加入两断传送暗码的指令,最终调试后窜显消失。
4.键盘获取
首先将键盘设置为密码输入模式,按键盘,观察数码管显示,多按一次就多
一个“—”。在最初调试时忘记将消抖子程序加进去发现有抖动,所以在调试键盘
时应记得消抖。调试密码输入成功后将键盘设置为控制码输入模式,调试管理员
控制码输入模块。该步骤调试顺利。
5.调试并字,设置并字成功时, 亮。在调试过程中,发现等一直不亮。
后来发现在满六位或者八位时,遗漏了并字允许。
6.匹配调试与开门调试
匹配成功与开门是连贯的一个动作。匹配成功时, 亮 1S,在 1S 内门闩
拉下 L8 亮。若 1S 内没有将门闩拉下,而是 1S 后拉下门闩则开门失败,无法进
入用户或管理员模式进行操作。
7.门闩开关调试
如果没有给门闩标志位,门开后就不能关了。所以门闩需要分配标志位。系
统在循环时,门闩处理子程序必须进行。我们刚开始调试程序时由于忽略了门闩
是输入器件,所以在软件清零时也将门闩位清零了,在老师验收时才发现 12S 后
返回常态后,在开门状态下门闩不受控制,不管开门还是关门开门指示灯依旧亮
着,才意识到在软件清零是需注意保护门闩位。
8.管理员控制码输入
起初输入的数值按前后顺序只能显示在固定的数码管,由于不符合日常习惯,
后来改为滚轮显示。输入的数值显示位置不再固定,而是朝左移动。
9.密码修改
二次输入密码才能修改成功。为了区别用户与管理员密码修改,我们用
“LO”键确认用户密码修改,“OP”键确认管理员密码修改。
10.时间调校
在按键超过 实现快调。调试时,长按,按 K3 时,只要手没松开,小时
一直加一。按 K4 时,只要手没松开,分钟数一直加一。K3 和 K4 按下时,秒都
清零,更符合日常习惯。
八、设计总结
通过此次的课程设计,我重新把单片机及相关知识联系在了一起,把平时学
到的零碎知识有了整体的认识,做了很好的总结和整合。收获颇丰。
在课程设计之前,老师就为我们分好了小组,一个小组 3 个人,为的是
让我们在团队合作的过程中学会团结协作,互帮互助。第一天老师布置了这两周
的设计课题:酒店电子保险箱。交代了设计任务和基本设计要求。早上由我们小
组间进行讨论,我们讨论了设计的主要思路,画流程图可是整个程序设计的方面
有些多,笼统的想主要思路出不了结果,便决定回去电脑上查相关资料,作为参
考帮助我们理清思路。但是这是我们第一次自己写大程序,刚开始时完全没有头
绪,后来老师也为我们讲解了主要流程。这使得我们慢慢进入了状态。开始根
据 TEST2012 程序进行整改和完善,在 2012 程序的基础上慢慢摸索我们所要的
程序。
为期两周的课程设计,不仅是对我们专业技能的一次考核,也是对我们的精
神意志的一种磨练,在设计过程当中,我们有过小小成功的喜悦,也有过当电脑
突然断电时的那种无奈和愤恨,此时的我们只能吃一堑长一智,总结历史教训,
我们变的更加细心了。同样的再编程当中我们会遇到很多问题,例如程序的稍微
变动有时会影响程序的整个结果发生翻天覆地的变化,有时只要忽略一个细节就
不能实现我们要的功能。此时的我们也只能一步一步的去寻找问题所在解决问题,
又不能忘记前后之间的关系。这是对我们耐心的又一种比较高的考验。
此次课程设计与以往的课程设计有很大的不同,此次我们是三个人合作,每
个人都有任务分工明确,但又不能自己做自己的完全不顾别人的程序。每次只要
做完一点点都要一起讨论方案是否可行。
我们的做事与编程一样,需要透过现象看本质。当我们透过现象,按照机器
的自然规律理解它的工作机理,那么我们就可以对其进行控制,操作,和修正。
本次的课程设计是对以往每一次实验的一种操作总结,也是一次对操作
能力的提升,庞大的程序,更多的是需要我们的思考,与以往的课程设计还有实
验的不同之处在于,当量达到一定的时候,我们多冷静思考一秒钟,后面的工程
就可以事半功倍了。因此我们不应急于一时,看到要求立即动手写程序,往往后
面的漏洞是问题的所在,无疑增加了后续编程的工作量。要是在开始做好规划,
边做边写边验证,前期的进程比较慢,后续的服务反而更加的得心应手。
编程需要规划,也有规律可循。在我们编写程序之前,良好的规划是减
小后续编程工作量的保证,要是在前期,在不同的操作模式下找到相同的变成因
子,我们可以借其大大缩减我们的工作量,与编程难度,从实用上考虑,可以使
我们的程序结构更加优化,对 CPU 的要求可能也大大减低,意味着对硬件的要
求也大大的减小,同时省下成本。
为期几天的课程设计总结,虽然是纸上谈兵,但也有很大的效果,通过
对程序的概括,和剖析,可以使我们对程序的理解程度更加深刻,并且对程序的
一些不足之处可以做部分的修改,使得程序更加精简。
此次的课程设计对我们来说是意义非凡的!不仅知识得到了更系统的掌握,
而且学会了团结协作,懂得了团队的力量。只有在互相的学习中才能进步,做更
好的自己。
附件 1: 程序
ORG 0000H ;复位入口
LJMP MAIN
ORG 000BH ;定时器 0 服务子程序入口
LJMP IT0P
ORG 0030H
MAIN: MOV SP,#6FH;总初始化。设定栈底指针
LCALL D30MS ;稍加延时(30mS),以待各芯片均退出复位状态
CLR ;蜂鸣器响
LCALL D1S ;延时 1S
SETB ;关蜂鸣器
MOV P1,#00H ;P1 口驱动的 L0-L7 指示灯全亮
LCALL D1S ;延时 1S
MOV P1,#0FFH ;熄 L0-L7 指示灯
MOV A,#89H ;数码管显示与矩阵键盘接口 8255A(U3)初始化
MOV DPTR,#0FEFFH ;8255A(U3)
MOVX @DPTR,A ;A、B 口输出驱动字段、字位,C 口输入
MOV A,#8BH ;LED 显示、开关、按键接口 8255A(U5)初始化
MOV DPTR,#0FDFFH ;8255A(U5)
MOVX @DPTR,A ; A 口输出驱 L8-15,B 口输入按键 PB0-7,C 口输入电平开关 SW0-7
MOV DPTR,#0FDFCH ;选中 A 口
MOV A,#0FFH ;送暗码
MOVX @DPTR,A ;L8-L15 全灭
MOV DPTR,#0FEFDH ;DPTR 指向 U3-B 口
MOV A,#00
MOVX @DPTR,A ;关显示(位驱动全为'0'无效)
;------------------------------------------显缓初始化--------------------------------------
MOV 30H,#00H ;30H-37H 为显示缓冲单元,
MOV 31H,#01H
MOV 32H,#00H
MOV 33H,#02H
MOV 34H,#10H
MOV 35H,#01H
MOV 36H,#05H
MOV 37H,#10H
;------------------------------------------时钟初始化---------------------------------------
MOV 38H,#00H ;38H 单元为实时钟 200uS 计数单元,清 0
MOV 39H,#00H ;39H 单元为 10mS 计数单元,清 0
MOV 3AH,#45H ;秒单元初值
MOV 3BH,#59H ;分单元初值
MOV 3CH,#08H ;时单元初值,时钟初值 08:59:45
;------------------------------------用户密码初始化---------------------------------------
MOV 40H,#11H
MOV 41H,#11H
MOV 42H,#11H
;----------------------------------管理员密码初始化---------------------------------------
MOV 43H,#11H
MOV 44H,#11H
MOV 45H,#11H
MOV 46H,#11H
;----------------------------------其他内容初始化------------------------------------------
MOV 58H,#00H ;密码位数
MOV 59H,#57H ;存密码放置首地址
MOV 6AH,#100 ;延时初始 1S
MOV 6BH,#3 ;延时初始 2
MOV 3FH,#50 ;快调定时存储单元
MOV 3DH,#5 ;密码错误次数存储单元
MOV 27H,#0 ;清空各标志位
MOV 28H,#0
;--------------------------------------定时器中断设置--------------------------------------
MOV TMOD,#02H ;T0 为定时方式 2。
MOV TL0,#00H ;00H-FFH=256,256TM*36=9216TM=10MS
MOV TH0,#00H
SETB ET0 ;开 T0 中断允许
SETB EA ;开中断总允许
SETB TR0 ;启动 T0 定时工作
;-------------------------------------------主循环-----------------------------------------
LOOP: LCALL CZ ;拆字
LCALL CW ;错误显示子程序
LCALL DISP ;显示刷新
LCALL KEY ;获取键盘输入
LCALL XDPB ;消抖
LCALL INPUT ;密码输入程序
LCALL BZ ;并字
LCALL PP ;密码匹配
LCALL KM ;开门子程序
LCALL SWITCH ;拨码开关开门设置
LCALL MMXG ;密码修改
LCALL SJSZ ;管理员 03 时间调校
SJMP LOOP
;------------------------拆字子程序--------------------------
CZ: MOV R0,#30H ;设置显缓首地址
CZLOOP: MOV @R0,#12H;对所有显缓单元送暗码
INC R0
CJNE R0,#38H,CZLOOP
JB ,FCT ;检测当前模式并跳转,为 0 常态,为 1 非常态
;-----------------------------------常态拆字模块------------------------------------------------
MOV R0,#3AH ;显示内容送显缓子程序(拆字子程序)。置时钟数据单元首地址(秒单元)
MOV R1,#30H ;置显示缓冲单元首地址(对应于最右显示位)
CZ1:MOV A,@R0 ;取当前数据单元 BCD 码
ANL A,#0FH ;保留低 4 位(个位)
MOV @R1,A ;送显缓当前个位单元
INC R1 ;指向显缓当前十位单元
MOV A,@R0 ;再取当前数据单元 BCD 码
ANL A,#0F0H ;保留高 4 位(十位)
SWAP A ;交换到低 4 位
MOV @R1,A ;送显缓当前十位单元
INC R1 ;指向显缓下一个个位单元
INC R0 ;指向下一个时钟数据单元
CJNE R0,#3DH,CZ1 ;未完继续
SJMP CZRET
;----------------------------------非常态拆字模块----------------------------------------------
FCT: JB ,KZCZ ;检测键盘输入模式,0 为密码输入,1 为控制码输入
;.................................密码输入拆字模块.............................................
SRMOD: MOV A,58H ;将密码位数给 A
CJNE A,#0,SRMOD2 ;判断密码位数是否为 0,不为 0 则跳转,为零则直接退出
SJMP CZRET
SRMOD2: MOV R1,#37H ;置显示缓冲单元首地址(对应于最右显示位)
MOV R0,58H ;将已输入的密码个数送至 R0
SRMOD1: MOV @R1,#10H;送密码个数个"-"到显缓
DEC R1 ;指向下一个缓冲单元
DJNZ R0,SRMOD1
SJMP CZRET
;................................控制码输入拆字模块............................................
KZCZ: MOV 36H,5BH ;把 5B 的值送给 30H
MOV 37H,5AH ;把 5A 的值送给 30H
CZRET: RET
;---------------密码错误处理子程序-----------------------------------
CW: JNB ,CWRET ;判断错误标志位,为 0 则不执行,为 1 则进行处理
MOV R0,#30H ;把显缓首地址送给 R0
CWLOOP: MOV @R0,#12H ;对显缓单元送暗码
INC R0
CJNE R0,#38H,CWLOOP
MOV 30H,#0EH ;将最右边一位设成 E
DJNZ 6AH,CWRET ;1S 延时
MOV 6AH,#100
DJNZ 6BH,CWRET
MOV 6BH,#3
CLR ;关闭错误标志位
CWRET: RET
;---------------------------显示刷新子程序--------------------------------------
DISP: MOV DPTR,#0FEFCH
MOV A,#0FFH
MOVX @DPTR,A
MOV R0,#30H ;显示更新子程序。置显示缓冲单元首地址(对应最右位)
MOV R3,#01H ;位码初值(从最右位起)
MOV A,R3
DISP1: MOV DPTR,#0FEFDH ; 8255-B 口(位码输出口)
MOVX @DPTR,A ; 输出当前字位码
MOV A,@R0 ; 取当前位显示数据码
ADD A,#TAB-NEXTPC ; 加 TAB 与 NEXTPC 差址
MOVC A,@A+PC ; 查表得相应字段码
NEXTPC: MOV DPTR,#0FEFCH ; 8255-A 口(字段码输出口)
MOVX @DPTR,A ; 输出字段码
LCALL D1MS ; 保持显示 1 毫秒
MOV DPTR,#0FEFCH
MOV A,#0FFH
MOVX @DPTR,A
INC R0 ; 指向下一显示缓冲单元
MOV A,R3 ; 取出原来的位码
JB ,DISP2 ; 判断若已显示到最左位则结束
RL A ; 未完,字位码左移 1 位
MOV R3,A ; 回存新的位码
LJMP DISP1 ; 转下一位的显示驱动
DISP2: RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;显示字段码表。"0"~"9"
DB 88H,83H,0C6H,0A1H,86H,8EH,0BFH,00H,0FFH ;"A"~"F","-","全亮"
;-------------------------------------获取矩阵键盘输入------------------------------------
KEY:MOV A,#81H ;键盘扫描子程序(反转法)
MOV DPTR,#0FEFFH
MOVX @DPTR,A ;C 口先初始化为高 4 位输出方式驱键行线、低 4 位输入方式键列线
MOV DPTR,#0FEFEH
MOV A,#00H ;键盘行线(高 4 位)输出驱动全'0'
MOVX @DPTR,A
MOVX A,@DPTR ;输入键盘列线电平(低 4 位)存 60H 单元
MOV 60H,A
MOV A,#88H ;C 口改初始化为高 4 位输入驱键行线、低 4 位输出驱键列线
MOV DPTR,#0FEFFH
MOVX @DPTR,A
MOV DPTR,#0FEFEH
MOV A,#00H ;键盘列线(低 4 位)输出驱动全'0'
MOVX @DPTR,A
MOVX A,@DPTR ;输入键盘行线电平(高 4 位)在 A 中
ANL 60H,#0FH ;列线电平值保留所在的低 4 位
ANL A,#0F0H ;行线电平值保留所在的高 4 位
ORL 60H,A ;将列线电平值、行线电平值组合成 8 位行列码
RET
;------------------------------矩阵键盘消抖子程序---------------------------------
XDPB: MOV 2FH,2EH ;把新态存为旧态
MOV 2DH,2CH ;前 4 次输入的电平值推至 2AH~2DH 单元
MOV 2CH,2BH
MOV 2BH,2AH
MOV 2AH,29H
MOV A,60H
MOV 29H, A
MOV A,2DH ;比较近 5 次输入的电平值不一致则新态照旧
CJNE A,2CH,XDR
CJNE A,2BH,XDR
CJNE A,2AH,XDR
CJNE A,29H,XDR
MOV 2EH,A ;近 5 次输入的电平值一致则存为新态
XDR: RET
;---------------------------------------输入密码获取子程序---------------------------------
INPUT: MOV A,2FH ;检测前态是否为无按键按下
CJNE A,#0FFH,QWE
MOV A,2EH ;检测新态势否为有按键按下
CJNE A,#0FFH,CHULI
QWE: LJMP RST ;跳出
CHULI: JB ,QWE ;检测键盘锁定标志位,为 1 则退出,为 0 则执行
MOV 61H,#00H ;置键号初值为 00H
MOV R5,#0FH ;设定最多进行 12 次的键码查表
MOV DPTR,#KEY_N ;DPTR 指向键码表首地址
KY: MOV A,#00H ;A 清 0
MOVC A,@A+DPTR ;查表读取键码表中当前位置的键码
CJNE A,60H,NK ;与 8 位行列码比较,不同则转 NK 查下一个
SJMP KN ;相同即查到了当前按下的键的键号,转 KN 进行相应键功能处理
NK: INC 61H ;键号加 1
INC DPTR ;指向键值表下一个位置
DJNZ R5,KY ;未查完键值表,继续
RET ;查完,说明无按键或出现异常行列码,返回
KN: MOV A,61H ;根据查表获得的键号 00H~0FH 之一转向各自的处理程序
MOV B,#05H ;转移表中每个键号处理程序占 5 个地址单元
MUL AB
MOV DPTR,#K0 ;指向转移表首地址
JMP @A+DPTR ;转向对应的键号处理程序
KEY_N: DB 0EEH,0EDH,0EBH,0E7H ;键码表。K0,K1,K2,K3 键码
DB 0DEH,0DDH,0DBH,0D7H ;K4,K5,K6,K7 键码
DB 0BEH,0BDH,0BBH,0B7H ;K8,K9,K10,K11 键码
DB 7EH,7DH,7BH,77H ;K12
K0: MOV 62H,#00H ;K0~K9 按下时跳转到 RT0
SJMP RT0
K1: MOV 62H,#01H
SJMP RT0
K2: MOV 62H,#02H
SJMP RT0
K3: MOV 62H,#03H
SJMP RT0
K4: MOV 62H,#04H
SJMP RT0
K5: MOV 62H,#05H
SJMP RT0
K6: MOV 62H,#06H
SJMP RT0
K7: MOV 62H,#07H
SJMP RT0
K8: MOV 62H,#08H
SJMP RT0
K9: MOV 62H,#09H
SJMP RT0
OP: NOP ;KA 按下时跳转到 RT1
NOP
NOP
SJMP RT1
LO: NOP
NOP ;KB 按下时跳转到 RT2
LJMP RT2
CL: NOP ;KC 按下时跳转到 RT3
NOP
LJMP RT3
TG: LJMP RT4 ;KD 按下时跳转到 RT4
;---------------------------K0~K9 按下处理模块----------------------------------------------
RT0: JB ,RT0RST ;检测错误标志位,为 1 则不执行输入,为 0 则输入
JB ,RT0RST ;检测时间调整标志位,为 1 则退出,为 0 则输入
MOV 65H,#12 ;置非常态返回计数单元为 12
SETB ;置状态标志位为 1(非常态)
JNB ,ZXCV ;检测密码修改标志位,为 0 为进行密码修改输入,为 1 为管理员功能选择模式
CLR ;设置为密码输入模式
ZXCV: JB ,GLRT0 ;检测键盘获取模式(为 0 则获取输入密码,为 1 则获取控制方式)
;...........................密码输入模式...................................................
MOV A,58H ;把当前密码位数送给 A
CJNE A,#08,WEISHU ;判断是否已输入 8 位,不够 8 位跳转执行
LJMP RST ;已 8 位则不做处理
WEISHU: MOV R0,59H ;把当前密码放置地址给 R0
MOV @R0,62H ;将输入值送给当前密码存放地址
DEC 59H ;将密码存放地址减 1
INC 58H ;将密码位数加 1
RT0RST: LJMP RST
;............................控制方式输入模式..............................................
GLRT0: JB ,ASD ;检测控制数存放标志,为 0 存放在 5AH,为 1 存放在 5BH
MOV 5AH,5BH
MOV 5BH,62H
SETB
LJMP RST
ASD:MOV 5AH,5BH
MOV 5BH,62H
CLR
LJMP RST
;--------------------------OP(KA)按下处理模块-------------------------------------------
RT1: JB ,GLRT1 ;检测键盘获取模式为 1 则跳转到管理员控制方式确定,为 0 进行密码输入位数
判断
;...............................密码输入模式..............................................
MOV A,58H ;把当前密码位数送给 A
CJNE A,#6,BAWEI ;判断密码位数是否为 6 位,否则跳转
SETB ;将并字允许标志位置 1
CLR ;将密码匹配模式置 0
SJMP RST
BAWEI: CJNE A,#8,CUOWU ;判断密码位数是否为 8 位,否则跳转
SETB ;将并字允许标志位置 1
SETB ;将密码匹配模式置 1
CUOWU: SJMP RST ;密码长度不符合要求不做处理
;..............................控制方式输入模式...........................................
GLRT1: MOV A,37H ;判断控制输入首位为 0 则继续判断为 1 退出
CJNE A,#0,GLCL
MOV A,36H
CJNE A,#1,GLCL1 ;控制方式输入为"01"进行用户密码修改标志位的设置
SETB
SETB
SJMP GLCL
GLCL1: CJNE A,#2,GLCL2 ;控制方式输入为"02"进行用户密码修改标志位的设置
MOV 40H,#11H
MOV 41H,#11H
MOV 42H,#11H
CLR
SJMP GLCL
GLCL2: CJNE A,#3,GLCL ;控制方式输入为"03"进行时间调整设置
SETB ;设置时间调整允许标志位
CLR ;返回常态 ;返回常态
GLCL: MOV 5AH,#12H ;对 5AH 和 5BH 送暗码
MOV 5BH,#12H
SJMP RST
;--------------------------------LO 功能键--------------------------------------------------
RT2:JNB ,LOCK
JB ,LOCK
SETB
LOCK: MOV A,58H
CJNE A,#6,RST
SETB
SJMP RST
;---------------------------CL(KB)按下处理模块-------------------------------------------
RT3: MOV 27H,#0 ;清空各标志位,返回常态
ANL 28H,#00001000B
MOV 58H,#00H ;还原当前输入密码位数
MOV 59H,#57H ;还原密码存放首地址
MOV 5AH,#12H ;5AH,5BH 送暗码
MOV 5BH,#12H
SJMP RST
RT4: MOV A,58H ;将密码位数给 A
CJNE A,#0,TWGN1 ;若密码位数为 0 则顺序执行,为 1 则跳转
CLR ;设置当前状态为常态
SJMP RST
TWGN1: DEC 58H ;密码位数减一
INC 59H ;指向上一个密骂存放单元
RST: RET
;-------------------并字程序-----------------------------------------
BZ: JNB ,BZRET ;判断并字允许位,为 1 则执行,为 0 则跳出并字子程序
MOV R0,#57H ;将输入的密码第一位地址给 R0
MOV 63H,#4 ;压缩密码位数
JB ,BZ1 ;检测修改密码时密码二次输入标志位,为 0 则继续执行。为 1 则跳转
MOV R1,#4BH ;输入密码存放首单元
SJMP BZLOOP
BZ1: MOV R1,#4FH ;密码为二次输入,送压缩密码首地址 4FH 给 R1
BZLOOP: MOV A,@R0 ;把输入首位密码给 A
SWAP A ;将 A 高低四位转换
MOV R2,A ;将 A 暂存于 R2
DEC R0 ;指向下一位密码
MOV A,@R0 ;把输入密码给 A
ORL A,R2 ;将两位密码合并
MOV @R1,A ;合并后密码存于压缩密码存储区
DEC R0 ;指向下一个密码
DEC R1 ;指向压缩密码存储区下个单元
MOV A,R1 ;将压缩密码存储区地址给 A
DJNZ 63H,BZLOOP ;判断是否完成并字操作,完成则推出,未完成则继续执行
JNB ,BZRET ;判断时否为管理员模式,为 1 则顺序执行,为 0 则跳转
CPL ;求反二次密码修改存储标志
SETB ;设置为控制方式输入模式
MOV 5AH,#12H ;5AH,5BH 给暗码
MOV 5BH,#12H
BZRET: RET
;---------------------------密码匹配子程序------------------------------------
PP: JNB ,PPRET2 ;如果并字允许单元为 1 则进行匹配,否则退出
JB ,GLPP ;检测管理员模式,为 1 则进入管理员匹配
MOV R1,#4BH ;输入密码存放首单元
JB ,PP8 ;为 0 则执行 6 位匹配。为 1 则进行 8 位匹配
;------------------------------------6 位匹配程序-----------------------------------------
PP6: MOV R0,#42H ;设置密码首地址
MOV 63H,#3 ;设置密码检验次数
PPLOOP6:MOV A,@R0 ;把首位密码给 A
MOV 64H,@R1 ;把输入密码给 64H
CJNE A,64H,ERROR ;把 A 和 64H 比较
DEC R0 ;R0 减 1,指向下个用户密码单元
DEC R1 ;R1 减 1,指向下个压缩密码存储单元
DJNZ 63H,PPLOOP6 ;密码匹配是否完成
MOV 3DH,#5
SETB
;密码正确,将开门标志位置 1
CLR ;返回常态
SJMP PPRET ;匹配完成处理
PPRET2: SJMP PPRET1
;------------------------------------8 位匹配模块--------------------------------------------
PP8: MOV R0,#46H ;设置密码首地址
MOV 63H,#4 ;设置密码检验次数
PPLOOP8:MOV A,@R0 ;把首位密码给 A
MOV 64H,@R1 ;把输入密码给 64H
CJNE A,64H,ERROR ;把 A 和 64H 比较
DEC R0 ;R0 减 1,指向下个管理员密码
DEC R1 ;R1 减 1,指向下个压缩密码存储单元
DJNZ 63H,PPLOOP8 ;密码匹配是否完成
MOV 3DH,#5
JB ,FF
SETB ;密码正确,将开门标志位置 1
CLR
SJMP PPRET
FF:SETB ;键盘获取模式置 1
CLR
SJMP PPRET ;匹配完成处理
;--------------------------------------密码修改匹配模块---------------------------------------
GLPP: JB ,PPRET ;检测二次密码输入标志,为 0 既为输入 2 次进行密码匹配
MOV R0,#4BH ;设置密码首地址
MOV R1,#4FH
MOV 63H,#4 ;设置密码检验次数
GLXH: MOV A,@R0 ;把首位密码给 A
MOV 64H,@R1 ;把输入密码给 64H
CJNE A,64H,GLERROR ;把 A 和 64H 比较
DEC R0 ;R0 减 1,指向下个管理员密码
DEC R1 ;R1 减 1,指向下个压缩密码存储单元
DJNZ 63H,GLXH ;密码匹配是否完成
SETB ;将密码修改允许为置 1
MOV 5AH,#11H ;5AH,5BH 全亮
MOV 5BH,#11H
SJMP PPRET
;-------------------------------密码匹配错误处理模块------------------------------------------
ERROR: SETB ;将错误标志位置 1
CLR ;将输入模式置为密码输入模式
DJNZ 3DH,PPRET ;密码错误次数减 1 和 0 比较,为 0 则顺序执行,不为 0 则跳转
MOV 3DH,#5 ;重置密码错误次数
SETB ;键盘锁定标志位置 1
MOV 3EH,#15 ;将键盘锁定时间设为 15min
CLR ;蜂鸣器响
;---------------------------------匹配完成处理模块--------------------------------------------
PPRET: CLR ;清空并字允许表示位,等待下次密码输入
MOV 58H,#0 ;将密码位数置为 0
MOV 59H,#57H ;将输入密码存放首地址存为 57H
SJMP PPRET1
;..................................管理员模式密码错误模块..........................
GLERROR:SETB ;设置为控制方式输入模式
SETB ;错误标志位置 1
CLR ;清空并字允许表示位,等待下次密码输入
MOV 58H,#0 ;将密码位数置为 0
MOV 59H,#57H ;将输入密码存放首地址存为 57H
PPRET1: RET
;-----------------------------开门处理子程序-------------------------
KM: JNB ,KMRET ;检测开门允许位,为 0 则跳出,为 1 则执行
CLR
DJNZ 6AH,KMRET ;延时 1S
MOV 6AH,#100
CLR
SETB ;关闭充电
KMRET:RET
SWITCH: JNB ,HHH;拨码开关
JB ,HHH
MOV 27H,#0 ;清空各标志位,返回常态
MOV 28H,#0
MOV 58H,#00H ;还原当前输入密码位数
MOV 59H,#57H ;还原密码存放首地址
MOV 5AH,#12H ;5AH,5BH 送暗码
MOV 5BH,#12H
HHH: JNB ,GG
MOV DPTR,#0FDFEH
MOVX A,@DPTR
MOV DPTR,#0FDFCH
MOVX @DPTR,A
CJNE A,#0FEH,GG;如果门闩拉开则置 1
SETB
GG:JNB ,CVF
MOV DPTR,#0FDFEH
MOVX A,@DPTR
MOV DPTR,#0FDFCH
MOVX @DPTR,A
CJNE A,#0FFH,CVF
CLR
CVF: RET
;--------------------------------密码修改模块----------------------------
MMXG:
JNB ,MMXGRET ;检测密码允许修改标志位,为 1 则进行密码修改
JB ,XG8;检测密码修改位数标志,为 0 为 6 位用户密码修改,1 为 8 为管理员密码修改
XG6:MOV R0,#42H ;设置密码首地址
MOV R1,#4BH
MOV 63H,#3 ;设置密码检验次数
XG6LOOP:MOV A,@R1 ;把首位密码给 A
MOV @R0,A ;把输入密码给用户密码存储单元
DEC R0 ;R0 减 1,指向下个管理员密码
DEC R1 ;R1 减 1,指向下个压缩密码存储单元
DJNZ 63H,XG6LOOP ;密码匹配是否完成
MOV 27H,#0 ;还原各标志位
ANL 28H,#00001000B
SJMP MMXGRET
XG8:MOV R0,#46H ;设置密码首地址
MOV R1,#4BH
MOV 63H,#4 ;设置密码检验次数
XG8LOOP:MOV A,@R1 ;把首位密码给 A
MOV @R0,A ;把输入密码给用户密码存储单元
DEC R0 ;R0 减 1,指向下个管理员密码
DEC R1 ;R1 减 1,指向下个压缩密码存储单元
DJNZ 63H,XG8LOOP ;密码匹配是否完成
MOV 27H,#0 ;还原各标志位
ANL 28H,#00001000B
SETB
MOV 5AH,#12H ;5AH,5BH 送暗码
MOV 5BH,#12H
MMXGRET:RET
;----------------------------------管理员模式时间设置子程序---------------------------------
SJSZ: JNB ,SJRET ;检测时间设置允许标志位
MOV 65H,#12
MOV A,2FH ;检测前态是否为 K3 按下
CJNE A,#0E7H,SJSZ1
MOV A,2EH ;检测新态势否为 K3 按下
CJNE A,#0E7H,SJRET
MOV 3AH,#0
DJNZ 3FH,SJRET ; 进行处理
MOV 3FH,#50
MOV A,3CH
ADD A,#1
DA A
MOV 3CH,A
CJNE A,#24H,SJRET
MOV 3CH,#00H
SJSZ1: MOV A,2FH ;检测前态是否为无按键按下
CJNE A,#0DEH,SJRET
MOV A,2EH ;检测新态势否为有按键按下
CJNE A,#0DEH,SJRET
MOV 3AH,#0
DJNZ 3FH,SJRET
MOV 3FH,#50
MOV A,3BH
ADD A,#1
DA A
MOV 3BH,A
CJNE A,#60H,SJRET
MOV 3BH,#00H
SJRET: RET
;------------------------------------定时中断,实时钟---------------------------------------
IT0P:PUSH ACC ;定时器 0 服务子程序。保护现场
PUSH PSW
INC 38H ;每 加 1
MOV A,38H
CJNE A,#36,DONE ;满 10mS?
MOV 38H,#0 ;200uS 计数单元清 0
INC 39H ;每 10mS 加 1
MOV A,39H
CJNE A,#100,DONE ;满 1S?
MOV 39H,#0 ;10mS 计数单元清 0
MOV A,3AH ;秒单元(按 BCD 码)加 1
ADD A,#1
DA A
MOV 3AH,A
;------------------------------------非常态 12S 自动跳转置常态----------------------------------------
DJNZ 65H,ZXC ;对非常态返回计数单元减 1
MOV 27H,#0
ANL 28H,#01001000B ;置标志位
MOV 58H,#0
MOV 59H,#57H
ZXC:CJNE A,#60H,DONE ;满 1 分钟?
MOV 3AH,#0 ;秒单元清零
;---------------------------------锁键盘判定------------------------------------------------------
MOV A,3EH
CJNE A,#0,ZXC2
CLR
SJMP ZXC3
ZXC2: DEC 3EH
ZXC3: MOV A,3BH ;分钟单元(按 BCD 码)加 1
ADD A,#1
DA A
MOV 3BH,A
CJNE A,#60H,DONE ;满 1 小时?
MOV 3BH,#0 ;分钟单元清零
MOV A,3CH ;小时单元(按 BCD 码)加 1
ADD A,#1
DA A
MOV 3CH,A
CJNE A,#24H,DONE ;满 24 小时?
MOV 3CH,#0 ;小时单元清零
DONE: POP PSW ;恢复现场
POP ACC
RETI ;中断返回
;-----------------------------延时子程序---------------------------------
D1S: MOV R7,#8 ;软件延时 1S 子程序
D1S2: MOV R6,#200 ;(1+(1+(1+3*200+2)*200+2)*8+4)*12/11059200HZ=
D1S1: MOV R5,#200
D1S0: NOP
DJNZ R5,D1S0
DJNZ R6,D1S1
DJNZ R7,D1S2
RET
D30MS: MOV R6,#46 ;软件延时 30mS 子程序
D30MS1: MOV R5,#200 ;[1+(1+3*200+2)*46+4]*12/=
D30MS0: NOP
DJNZ R5,D30MS0
DJNZ R6,D30MS1
RET
D1MS: MOV R7,#115 ;软件延时 1mS 子程序
D1MS1: NOP ;(1+8*115+2)*12/=
NOP
NOP
NOP
NOP
NOP
DJNZ R7,D1MS1
RET
END
附件 2:原理图
PC3
PC2
PC1
PC0
P
A
0
P
C
4
P
C
5
P
C
6
P
C
7
W
R
R
D
R
D
W
R
S
8
X
TA
L2
18
X
TA
L1
19
A
LE
30
E
A
31
P
S
E
N
29
R
S
T
9
P
D
0
39
P
D
1
38
P
D
2
37
P
D
3
36
P
D
4
35
P
D
5
34
P
D
6
33
P
D
7
32
P
1
P
2
P
3
P
4
P
5
P
6
P
7
P
8
P
X
D
10
P
D
11
P
T0
12
P
T1
13
P
14
P
D
17
P
R
16
P
15
P
15
28
P
8
21
P
9
22
P
10
23
P
11
24
P
12
25
P
13
26
P
14
27
U
1
A
T89C
51
X
1
G
N
D
V
C
C
S
W
10
S
W
-S
P
S
T-M
O
M
S
W
11
S
W
-S
P
S
T-M
O
M
D
0
3
Q
0
2
D
1
4
Q
1
5
D
2
7
Q
2
6
D
3
8
Q
3
9
D
4
13
Q
4
12
D
5
14
Q
5
15
D
6
17
Q
6
16
D
7
18
Q
7
19
O
E
1
LE
11
U
2
74H
C
373
D
0
34
D
1
33
D
2
32
D
3
31
D
4
30
D
5
29
D
6
28
D
7
27
R
D
5
W
R
36
A
0
9
A
1
8
R
E
S
E
T
35
C
S
6
P
A
0
4
P
A
1
3
P
A
2
2
P
A
3
1
P
A
4
40
P
A
5
39
P
A
6
38
P
A
7
37
P
B
0
18
P
B
1
19
P
B
2
20
P
B
3
21
P
B
4
22
P
B
5
23
P
B
6
24
P
B
7
25
P
C
0
14
P
C
1
15
P
C
2
16
P
C
3
17
P
C
4
13
P
C
5
12
P
C
6
11
P
C
7
10
U
3
8255A
V
C
C
GND
R
1
R
2
R
11
R
12
R
13
R
14
R
15
R
16
V
C
C
VCC
D
0
34
D
1
33
D
2
32
D
3
31
D
4
30
D
5
29
D
6
28
D
7
27
R
D
5
W
R
36
A
0
9
A
1
8
R
E
S
E
T
35
C
S
6
P
A
0
4
P
A
1
3
P
A
2
2
P
A
3
1
P
A
4
40
P
A
5
39
P
A
6
38
P
A
7
37
P
B
0
18
P
B
1
19
P
B
2
20
P
B
3
21
P
B
4
22
P
B
5
23
P
B
6
24
P
B
7
25
P
C
0
14
P
C
1
15
P
C
2
16
P
C
3
17
P
C
4
13
P
C
5
12
P
C
6
11
P
C
7
10
U
5
8255A
D
9
L8
R
17
100
V
C
C
S
W
0S
W
-S
P
S
T-M
O
M
G
N
D
V
C
C
G
N
D
p
0
R
3
10k