酒店电子保险箱
《微机应用设计与实践》课程设计
设计课题 酒店电子保险箱
系别 信息科学与工程学院
专业
班级
姓名
学号
指导教师 许雪林
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
无动作描述:18
分钟锁键描述: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、常态下,八位 LED7段数码管显示时钟信息可包括小时、分钟、秒钟。
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
普通密码匹配模式标志为,为 0进行用户密码匹配,为 1进行管理员密
0 1 2 3
4 5 6 7
8 9 OP LO
CL TG
码匹配
开门允许标志位,可开门置 1
错误标志位,错误置 1
键盘获取方式标志为,0为密码输入模式,1为管理员控制方式输入模式
状态标志位,0为常态,1为非常态
控制码存放标志位,0存放在 5AH,1存放在 5BH
密码二次输入标志位,为 1未进行二次输入
密码修改标志位,为 1为进行密码修改输入
门状态标志位,为 1则门开着
修改密码允许位,为 1进行密码修改
时间调整允许标志位,可修改置 1
键盘锁定标志位,为 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~5DH3S延时存储单元
60H键盘扫描读入值存储单元
61H键号值
62H键盘获取存储单元
63H压缩密码位数存放单元
64H密码匹配暂存存储单元
65H12S计数存储单元
五、局部程序设计说明
拆字模块
拆字流程图:
拆字模块描述:
进入拆字模块,先把显示缓冲单元 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显示器轮流动态扫描。利用
人视觉暂留效应,看起来好像几个显示器上“同时”显示不同的字符。把显示缓冲单元的
值依次从八位数码管从右到左显示。为防止窜显,我们在点亮数码管前先送暗码给数码
管,且在数码管显示一秒后也对数码管送暗码。此时数码管就不会出现窜显现象。
键盘扫描模块
键盘扫描流程图:
键盘扫描模块描述:
采用线反转法扫描得到键盘行列码,根据事先编好的键码表(按国际键盘分布
排列)对应行列码查表得到键号,之后根据键号做相应操作(结合其他子模
块),功能键则处理相应功能,数字键则相应存储、输出数字量。理论上当按键
按下或弹起时,可以相应的产生低电平或高电平,但实际并非如此。键盘按键
一般都采用触点式按键开关。按键被按下或释放时,按键触点的弹性会产生抖
动现象。即当按键按下时,触点不会迅速可靠地接通,当按键释放时,触点也
不会立即断开,而是要经过一段时间的抖动才能稳定下来,按键材料不同,抖
动时间也各不相同。按键抖动可能导致单片机将一次按键操作识别为多次操
作,一般采用硬件电路或软件程序来消除。本次用软件消抖,即滚动滤波的方
式消抖。
并字流程图:
并字模块描述:
在并字允许的情况下,确认输入八位或六位情况下,将两个键号压缩放置在一
个单元。第一次输入放在以 4BH为首地址的单元,第二次从 4FH开始。
匹配模块流程图:
匹配模块描述:
由于本设计采用二次密码确认新密码,所以匹配除了正常的开锁匹配,还包括
了修改密码匹配。匹配采用的是一一比对的方法,只要一次比对失败,就退出
改子程序,并带上错误标志位。
开门以及门闩流程图:
开门以及门闩模块描述:
在开门允许标志位有效情况下,可以拉开门闩。亮 L5一秒说明有效时间。L8
说明门闩状态。门闩状态需注意,只能是输入器件。
密码修改流程图:
密码修改描述:
密码修改允许位是该子程序的钥匙,进入后分为管理员密码修改和用户密码修
改。修改时,可任选 4BH或者 4FH的内容作为最新密码。
时间调校描述:
利用数字 3和数字 4按键实现对时和分钟的增量式调校,持续按键超 时实
现快调功能。
功能键流程图:
功能键描述:
TG:退格。
OP:输入确定。
LO:用户修改密码。(门开时有效)
CL:返回常态键。
无动作描述:
程序如下:
DJNZ65H,ZXC;对非常态返回计数单元减 1
MOV27H,#0
ANL28H,#01001000B;置标志位
MOV58H,#0
MOV59H,#57H
ZXC:CJNEA,#60H,DONE;满 1分钟?
MOV3AH,#0;秒单元清零
在每次按键时都给 65H立即数 12,在无按键时,65H每秒减一,等零时,除门闩其他标志
位清零。
分钟锁键描述:
程序如下:
MOVA,3EH
CJNEA,#0,ZXC2
SJMPZXC3
ZXC2:DEC3EH
ZXC3:MOVA,3BH;分钟单元(按 BCD码)加 1
当错误 5次时,3EH被赋值,此时标志位 没执行 CJNEA,#0,ZXC2就不能执行,
一直处于锁键。只有 15分钟后才能被清零。
精确时钟流程图:
精确时钟描述:利用 51单片机内部时钟振荡产生的时钟信号,用定时器 0选用
方式 2定时工作模式每定时计数 256次对 38H单元加 1,38H单元计数 36次即
晶振频率为 的微控制器 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中“LCALLD1MS”指令后加入暗码传送,发现最右位仍有窜显,原
因是从 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:程序
ORG0000H;复位入口
LJMPMAIN
ORG000BH;定时器 0服务子程序入口
LJMPIT0P
ORG0030H
MAIN:MOVSP,#6FH;总初始化。设定栈底指针
LCALLD30MS;稍加延时(30mS),以待各芯片均退出复位状态
;蜂鸣器响
LCALLD1S;延时 1S
;关蜂鸣器
MOVP1,#00H;P1口驱动的 L0-L7指示灯全亮
LCALLD1S;延时 1S
MOVP1,#0FFH;熄 L0-L7指示灯
MOVA,#89H;数码管显示与矩阵键盘接口 8255A(U3)初始化
MOVDPTR,#0FEFFH;8255A(U3)
MOVX@DPTR,A;A、B口输出驱动字段、字位,C口输入
MOVA,#8BH;LED显示、开关、按键接口 8255A(U5)初始化
MOVDPTR,#0FDFFH;8255A(U5)
MOVX@DPTR,A;A口输出驱 L8-15,B口输入按键 PB0-7,C口输入电平开关 SW0-7
MOVDPTR,#0FDFCH;选中 A口
MOVA,#0FFH;送暗码
MOVX@DPTR,A;L8-L15全灭
MOVDPTR,#0FEFDH;DPTR指向 U3-B口
MOVA,#00
MOVX@DPTR,A;关显示(位驱动全为'0'无效)
;------------------------------------------显缓初始化--------------------------------------
MOV30H,#00H;30H-37H为显示缓冲单元,
MOV31H,#01H
MOV32H,#00H
MOV33H,#02H
MOV34H,#10H
MOV35H,#01H
MOV36H,#05H
MOV37H,#10H
;------------------------------------------时钟初始化---------------------------------------
MOV38H,#00H;38H单元为实时钟 200uS计数单元,清 0
MOV39H,#00H;39H单元为 10mS计数单元,清 0
MOV3AH,#45H;秒单元初值
MOV3BH,#59H;分单元初值
MOV3CH,#08H;时单元初值,时钟初值 08:59:45
;------------------------------------用户密码初始化---------------------------------------
MOV40H,#11H
MOV41H,#11H
MOV42H,#11H
;----------------------------------管理员密码初始化---------------------------------------
MOV43H,#11H
MOV44H,#11H
MOV45H,#11H
MOV46H,#11H
;----------------------------------其他内容初始化------------------------------------------
MOV58H,#00H;密码位数
MOV59H,#57H;存密码放置首地址
MOV6AH,#100;延时初始 1S
MOV6BH,#3;延时初始 2
MOV3FH,#50;快调定时存储单元
MOV3DH,#5;密码错误次数存储单元
MOV27H,#0;清空各标志位
MOV28H,#0
;--------------------------------------定时器中断设置--------------------------------------
MOVTMOD,#02H;T0为定时方式 2。
MOVTL0,#00H;00H-FFH=256,256TM*36=9216TM=10MS
MOVTH0,#00H
SETBET0;开 T0中断允许
SETBEA;开中断总允许
SETBTR0;启动 T0定时工作
;-------------------------------------------主循环-----------------------------------------
LOOP:LCALLCZ;拆字
LCALLCW;错误显示子程序
LCALLDISP;显示刷新
LCALLKEY;获取键盘输入
LCALLXDPB;消抖
LCALLINPUT;密码输入程序
LCALLBZ;并字
LCALLPP;密码匹配
LCALLKM;开门子程序
LCALLSWITCH;拨码开关开门设置
LCALLMMXG;密码修改
LCALLSJSZ;管理员 03时间调校
SJMPLOOP
;------------------------拆字子程序--------------------------
CZ:MOVR0,#30H;设置显缓首地址
CZLOOP:MOV@R0,#12H;对所有显缓单元送暗码
INCR0
CJNER0,#38H,CZLOOP
,FCT;检测当前模式并跳转,为 0常态,为 1非常态
;-----------------------------------常态拆字模块--------------------------------------------
----
MOVR0,#3AH;显示内容送显缓子程序(拆字子程序)。置时钟数据单元首地址(秒单元)
MOVR1,#30H;置显示缓冲单元首地址(对应于最右显示位)
CZ1:MOVA,@R0;取当前数据单元 BCD码
ANLA,#0FH;保留低 4位(个位)
MOV@R1,A;送显缓当前个位单元
INCR1;指向显缓当前十位单元
MOVA,@R0;再取当前数据单元 BCD码
ANLA,#0F0H;保留高 4位(十位)
SWAPA;交换到低 4位
MOV@R1,A;送显缓当前十位单元
INCR1;指向显缓下一个个位单元
INCR0;指向下一个时钟数据单元
CJNER0,#3DH,CZ1;未完继续
SJMPCZRET
;----------------------------------非常态拆字模块-------------------------------------------
---
FCT:,KZCZ;检测键盘输入模式,0为密码输入,1为控制码输入
;.................................密码输入拆字模块.
............................................
SRMOD:MOVA,58H;将密码位数给 A
CJNEA,#0,SRMOD2;判断密码位数是否为 0,不为 0则跳转,为零则直接退出
SJMPCZRET
SRMOD2:MOVR1,#37H;置显示缓冲单元首地址(对应于最右显示位)
MOVR0,58H;将已输入的密码个数送至 R0
SRMOD1:MOV@R1,#10H;送密码个数个"-"到显缓
DECR1;指向下一个缓冲单元
DJNZR0,SRMOD1
SJMPCZRET
;................................控制码输入拆字模块.
...........................................
KZCZ:MOV36H,5BH;把 5B的值送给 30H
MOV37H,5AH;把 5A的值送给 30H
CZRET:RET
;---------------密码错误处理子程序-----------------------------------
CW:,CWRET;判断错误标志位,为 0则不执行,为 1则进行处理
MOVR0,#30H;把显缓首地址送给 R0
CWLOOP:MOV@R0,#12H;对显缓单元送暗码
INCR0
CJNER0,#38H,CWLOOP
MOV30H,#0EH;将最右边一位设成 E
DJNZ6AH,CWRET;1S延时
MOV6AH,#100
DJNZ6BH,CWRET
MOV6BH,#3
;关闭错误标志位
CWRET:RET
;---------------------------显示刷新子程序--------------------------------------
DISP:MOVDPTR,#0FEFCH
MOVA,#0FFH
MOVX@DPTR,A
MOVR0,#30H;显示更新子程序。置显示缓冲单元首地址(对应最右位)
MOVR3,#01H;位码初值(从最右位起)
MOVA,R3
DISP1:MOVDPTR,#0FEFDH;8255-B口(位码输出口)
MOVX@DPTR,A;输出当前字位码
MOVA,@R0;取当前位显示数据码
ADDA,#TAB-NEXTPC;加 TAB与 NEXTPC差址
MOVCA,@A+PC;查表得相应字段码
NEXTPC:MOVDPTR,#0FEFCH;8255-A口(字段码输出口)
MOVX@DPTR,A;输出字段码
LCALLD1MS;保持显示 1毫秒
MOVDPTR,#0FEFCH
MOVA,#0FFH
MOVX@DPTR,A
INCR0;指向下一显示缓冲单元
MOVA,R3;取出原来的位码
,DISP2;判断若已显示到最左位则结束
RLA;未完,字位码左移 1位
MOVR3,A;回存新的位码
LJMPDISP1;转下一位的显示驱动
DISP2:RET
TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;显示字段码表。"0"~"9"
DB88H,83H,0C6H,0A1H,86H,8EH,0BFH,00H,0FFH;"A"~"F","-","全亮"
;-------------------------------------获取矩阵键盘输入------------------------------------
KEY:MOVA,#81H;键盘扫描子程序(反转法)
MOVDPTR,#0FEFFH
MOVX@DPTR,A;C口先初始化为高 4位输出方式驱键行线、低 4位输入方式键列线
MOVDPTR,#0FEFEH
MOVA,#00H;键盘行线(高 4位)输出驱动全'0'
MOVX@DPTR,A
MOVXA,@DPTR;输入键盘列线电平(低 4位)存 60H单元
MOV60H,A
MOVA,#88H;C口改初始化为高 4位输入驱键行线、低 4位输出驱键列线
MOVDPTR,#0FEFFH
MOVX@DPTR,A
MOVDPTR,#0FEFEH
MOVA,#00H;键盘列线(低 4位)输出驱动全'0'
MOVX@DPTR,A
MOVXA,@DPTR;输入键盘行线电平(高 4位)在 A中
ANL60H,#0FH;列线电平值保留所在的低 4位
ANLA,#0F0H;行线电平值保留所在的高 4位
ORL60H,A;将列线电平值、行线电平值组合成 8位行列码
RET
;------------------------------矩阵键盘消抖子程序---------------------------------
XDPB:MOV2FH,2EH;把新态存为旧态
MOV2DH,2CH;前 4次输入的电平值推至 2AH~2DH单元
MOV2CH,2BH
MOV2BH,2AH
MOV2AH,29H
MOVA,60H
MOV29H,A
MOVA,2DH;比较近 5次输入的电平值不一致则新态照旧
CJNEA,2CH,XDR
CJNEA,2BH,XDR
CJNEA,2AH,XDR
CJNEA,29H,XDR
MOV2EH,A;近 5次输入的电平值一致则存为新态
XDR:RET
;---------------------------------------输入密码获取子程序---------------------------------
INPUT:MOVA,2FH;检测前态是否为无按键按下
CJNEA,#0FFH,QWE
MOVA,2EH;检测新态势否为有按键按下
CJNEA,#0FFH,CHULI
QWE:LJMPRST;跳出
CHULI:,QWE;检测键盘锁定标志位,为 1则退出,为 0则执行
MOV61H,#00H;置键号初值为 00H
MOVR5,#0FH;设定最多进行 12次的键码查表
MOVDPTR,#KEY_N;DPTR指向键码表首地址
KY:MOVA,#00H;A清 0
MOVCA,@A+DPTR;查表读取键码表中当前位置的键码
CJNEA,60H,NK;与 8位行列码比较,不同则转 NK查下一个
SJMPKN;相同即查到了当前按下的键的键号,转 KN进行相应键功能处理
NK:INC61H;键号加 1
INCDPTR;指向键值表下一个位置
DJNZR5,KY;未查完键值表,继续
RET;查完,说明无按键或出现异常行列码,返回
KN:MOVA,61H;根据查表获得的键号 00H~0FH之一转向各自的处理程序
MOVB,#05H;转移表中每个键号处理程序占 5个地址单元
MULAB
MOVDPTR,#K0;指向转移表首地址
JMP@A+DPTR;转向对应的键号处理程序
KEY_N:DB0EEH,0EDH,0EBH,0E7H;键码表。K0,K1,K2,K3键码
DB0DEH,0DDH,0DBH,0D7H;K4,K5,K6,K7键码
DB0BEH,0BDH,0BBH,0B7H;K8,K9,K10,K11键码
DB7EH,7DH,7BH,77H;K12
K0:MOV62H,#00H;K0~K9按下时跳转到 RT0
SJMPRT0
K1:MOV62H,#01H
SJMPRT0
K2:MOV62H,#02H
SJMPRT0
K3:MOV62H,#03H
SJMPRT0
K4:MOV62H,#04H
SJMPRT0
K5:MOV62H,#05H
SJMPRT0
K6:MOV62H,#06H
SJMPRT0
K7:MOV62H,#07H
SJMPRT0
K8:MOV62H,#08H
SJMPRT0
K9:MOV62H,#09H
SJMPRT0
OP:NOP;KA按下时跳转到 RT1
NOP
NOP
SJMPRT1
LO:NOP
NOP;KB按下时跳转到 RT2
LJMPRT2
CL:NOP;KC按下时跳转到 RT3
NOP
LJMPRT3
TG:LJMPRT4;KD按下时跳转到 RT4
;---------------------------K0~K9按下处理模块----------------------------------------------
RT0:,RT0RST;检测错误标志位,为 1则不执行输入,为 0则输入
,RT0RST;检测时间调整标志位,为 1则退出,为 0则输入
MOV65H,#12;置非常态返回计数单元为 12
;置状态标志位为 1(非常态)
,ZXCV;检测密码修改标志位,为 0为进行密码修改输入,为 1为管理员功能选择模式
;设置为密码输入模式
ZXCV:,GLRT0;检测键盘获取模式(为 0则获取输入密码,为 1则获取控制方式)
;...........................密码输入模式...................................................
MOVA,58H;把当前密码位数送给 A
CJNEA,#08,WEISHU;判断是否已输入 8位,不够 8位跳转执行
LJMPRST;已 8位则不做处理
WEISHU:MOVR0,59H;把当前密码放置地址给 R0
MOV@R0,62H;将输入值送给当前密码存放地址
DEC59H;将密码存放地址减 1
INC58H;将密码位数加 1
RT0RST:LJMPRST
;............................控制方式输入模式..............................................
GLRT0:,ASD;检测控制数存放标志,为 0存放在 5AH,为 1存放在 5BH
MOV5AH,5BH
MOV5BH,62H
LJMPRST
ASD:MOV5AH,5BH
MOV5BH,62H
LJMPRST
;--------------------------OP(KA)按下处理模块-------------------------------------------
RT1:,GLRT1;检测键盘获取模式为 1则跳转到管理员控制方式确定,为 0进行密码输入位数判断
;...............................密码输入模式..............................................
MOVA,58H;把当前密码位数送给 A
CJNEA,#6,BAWEI;判断密码位数是否为 6位,否则跳转
;将并字允许标志位置 1
;将密码匹配模式置 0
SJMPRST
BAWEI:CJNEA,#8,CUOWU;判断密码位数是否为 8位,否则跳转
;将并字允许标志位置 1
;将密码匹配模式置 1
CUOWU:SJMPRST;密码长度不符合要求不做处理
;..............................控制方式输入模式...........................................
GLRT1:MOVA,37H;判断控制输入首位为 0则继续判断为 1退出
CJNEA,#0,GLCL
MOVA,36H
CJNEA,#1,GLCL1;控制方式输入为"01"进行用户密码修改标志位的设置
SJMPGLCL
GLCL1:CJNEA,#2,GLCL2;控制方式输入为"02"进行用户密码修改标志位的设置
MOV40H,#11H
MOV41H,#11H
MOV42H,#11H
SJMPGLCL
GLCL2:CJNEA,#3,GLCL;控制方式输入为"03"进行时间调整设置
;设置时间调整允许标志位
;返回常态;返回常态
GLCL:MOV5AH,#12H;对 5AH和 5BH送暗码
MOV5BH,#12H
SJMPRST
;--------------------------------LO功能键--------------------------------------------------
RT2:,LOCK
,LOCK
LOCK:MOVA,58H
CJNEA,#6,RST
SJMPRST
;---------------------------CL(KB)按下处理模块-------------------------------------------
RT3:MOV27H,#0;清空各标志位,返回常态
ANL28H,#00001000B
MOV58H,#00H;还原当前输入密码位数
MOV59H,#57H;还原密码存放首地址
MOV5AH,#12H;5AH,5BH送暗码
MOV5BH,#12H
SJMPRST
RT4:MOVA,58H;将密码位数给 A
CJNEA,#0,TWGN1;若密码位数为 0则顺序执行,为 1则跳转
;设置当前状态为常态
SJMPRST
TWGN1:DEC58H;密码位数减一
INC59H;指向上一个密骂存放单元
RST:RET
;-------------------并字程序-----------------------------------------
BZ:,BZRET;判断并字允许位,为 1则执行,为 0则跳出并字子程序
MOVR0,#57H;将输入的密码第一位地址给 R0
MOV63H,#4;压缩密码位数
,BZ1;检测修改密码时密码二次输入标志位,为 0则继续执行。为 1则跳转
MOVR1,#4BH;输入密码存放首单元
SJMPBZLOOP
BZ1:MOVR1,#4FH;密码为二次输入,送压缩密码首地址 4FH给 R1
BZLOOP:MOVA,@R0;把输入首位密码给 A
SWAPA;将 A高低四位转换
MOVR2,A;将 A暂存于 R2
DECR0;指向下一位密码
MOVA,@R0;把输入密码给 A
ORLA,R2;将两位密码合并
MOV@R1,A;合并后密码存于压缩密码存储区
DECR0;指向下一个密码
DECR1;指向压缩密码存储区下个单元
MOVA,R1;将压缩密码存储区地址给 A
DJNZ63H,BZLOOP;判断是否完成并字操作,完成则推出,未完成则继续执行
,BZRET;判断时否为管理员模式,为 1则顺序执行,为 0则跳转
;求反二次密码修改存储标志
;设置为控制方式输入模式
MOV5AH,#12H;5AH,5BH给暗码
MOV5BH,#12H
BZRET:RET
;---------------------------密码匹配子程序------------------------------------
PP:,PPRET2;如果并字允许单元为 1则进行匹配,否则退出
,GLPP;检测管理员模式,为 1则进入管理员匹配
MOVR1,#4BH;输入密码存放首单元
,PP8;为 0则执行 6位匹配。为 1则进行 8位匹配
;------------------------------------6位匹配程序-----------------------------------------
PP6:MOVR0,#42H;设置密码首地址
MOV63H,#3;设置密码检验次数
PPLOOP6:MOVA,@R0;把首位密码给 A
MOV64H,@R1;把输入密码给 64H
CJNEA,64H,ERROR;把 A和 64H比较
DECR0;R0减 1,指向下个用户密码单元
DECR1;R1减 1,指向下个压缩密码存储单元
DJNZ63H,PPLOOP6;密码匹配是否完成
MOV3DH,#5
;密码正确,将开门标志位置 1
;返回常态
SJMPPPRET;匹配完成处理
PPRET2:SJMPPPRET1
;------------------------------------8位匹配模块-------------------------------------------
-
PP8:MOVR0,#46H;设置密码首地址
MOV63H,#4;设置密码检验次数
PPLOOP8:MOVA,@R0;把首位密码给 A
MOV64H,@R1;把输入密码给 64H
CJNEA,64H,ERROR;把 A和 64H比较
DECR0;R0减 1,指向下个管理员密码
DECR1;R1减 1,指向下个压缩密码存储单元
DJNZ63H,PPLOOP8;密码匹配是否完成
MOV3DH,#5
,FF
;密码正确,将开门标志位置 1
SJMPPPRET
FF:;键盘获取模式置 1
SJMPPPRET;匹配完成处理
;--------------------------------------密码修改匹配模块-------------------------------------
--
GLPP:,PPRET;检测二次密码输入标志,为 0既为输入 2次进行密码匹配
MOVR0,#4BH;设置密码首地址
MOVR1,#4FH
MOV63H,#4;设置密码检验次数
GLXH:MOVA,@R0;把首位密码给 A
MOV64H,@R1;把输入密码给 64H
CJNEA,64H,GLERROR;把 A和 64H比较
DECR0;R0减 1,指向下个管理员密码
DECR1;R1减 1,指向下个压缩密码存储单元
DJNZ63H,GLXH;密码匹配是否完成
;将密码修改允许为置 1
MOV5AH,#11H;5AH,5BH全亮
MOV5BH,#11H
SJMPPPRET
;-------------------------------密码匹配错误处理模块----------------------------------------
--
ERROR:;将错误标志位置 1
;将输入模式置为密码输入模式
DJNZ3DH,PPRET;密码错误次数减 1和 0比较,为 0则顺序执行,不为 0则跳转
MOV3DH,#5;重置密码错误次数
;键盘锁定标志位置 1
MOV3EH,#15;将键盘锁定时间设为 15min
;蜂鸣器响
;---------------------------------匹配完成处理模块------------------------------------------
--
PPRET:;清空并字允许表示位,等待下次密码输入
MOV58H,#0;将密码位数置为 0
MOV59H,#57H;将输入密码存放首地址存为 57H
SJMPPPRET1
;..................................管理员模式密码错误模块..........................
GLERROR:;设置为控制方式输入模式
;错误标志位置 1
;清空并字允许表示位,等待下次密码输入
MOV58H,#0;将密码位数置为 0
MOV59H,#57H;将输入密码存放首地址存为 57H
PPRET1:RET
;-----------------------------开门处理子程序-------------------------
KM:,KMRET;检测开门允许位,为 0则跳出,为 1则执行
DJNZ6AH,KMRET;延时 1S
MOV6AH,#100
;关闭充电
KMRET:RET
SWITCH:,HHH;拨码开关
,HHH
MOV27H,#0;清空各标志位,返回常态
MOV28H,#0
MOV58H,#00H;还原当前输入密码位数
MOV59H,#57H;还原密码存放首地址
MOV5AH,#12H;5AH,5BH送暗码
MOV5BH,#12H
HHH:,GG
MOVDPTR,#0FDFEH
MOVXA,@DPTR
MOVDPTR,#0FDFCH
MOVX@DPTR,A
CJNEA,#0FEH,GG;如果门闩拉开则置 1
GG:,CVF
MOVDPTR,#0FDFEH
MOVXA,@DPTR
MOVDPTR,#0FDFCH
MOVX@DPTR,A
CJNEA,#0FFH,CVF
CVF:RET
;--------------------------------密码修改模块----------------------------
MMXG:
,MMXGRET;检测密码允许修改标志位,为 1则进行密码修改
,XG8;检测密码修改位数标志,为 0为 6位用户密码修改,1为 8为管理员密码修改
XG6:MOVR0,#42H;设置密码首地址
MOVR1,#4BH
MOV63H,#3;设置密码检验次数
XG6LOOP:MOVA,@R1;把首位密码给 A
MOV@R0,A;把输入密码给用户密码存储单元
DECR0;R0减 1,指向下个管理员密码
DECR1;R1减 1,指向下个压缩密码存储单元
DJNZ63H,XG6LOOP;密码匹配是否完成
MOV27H,#0;还原各标志位
ANL28H,#00001000B
SJMPMMXGRET
XG8:MOVR0,#46H;设置密码首地址
MOVR1,#4BH
MOV63H,#4;设置密码检验次数
XG8LOOP:MOVA,@R1;把首位密码给 A
MOV@R0,A;把输入密码给用户密码存储单元
DECR0;R0减 1,指向下个管理员密码
DECR1;R1减 1,指向下个压缩密码存储单元
DJNZ63H,XG8LOOP;密码匹配是否完成
MOV27H,#0;还原各标志位
ANL28H,#00001000B
MOV5AH,#12H;5AH,5BH送暗码
MOV5BH,#12H
MMXGRET:RET
;----------------------------------管理员模式时间设置子程序---------------------------------
SJSZ:,SJRET;检测时间设置允许标志位
MOV65H,#12
MOVA,2FH;检测前态是否为 K3按下
CJNEA,#0E7H,SJSZ1
MOVA,2EH;检测新态势否为 K3按下
CJNEA,#0E7H,SJRET
MOV3AH,#0
DJNZ3FH,SJRET;进行处理
MOV3FH,#50
MOVA,3CH
ADDA,#1
DAA
MOV3CH,A
CJNEA,#24H,SJRET
MOV3CH,#00H
SJSZ1:MOVA,2FH;检测前态是否为无按键按下
CJNEA,#0DEH,SJRET
MOVA,2EH;检测新态势否为有按键按下
CJNEA,#0DEH,SJRET
MOV3AH,#0
DJNZ3FH,SJRET
MOV3FH,#50
MOVA,3BH
ADDA,#1
DAA
MOV3BH,A
CJNEA,#60H,SJRET
MOV3BH,#00H
SJRET:RET
;------------------------------------定时中断,实时钟---------------------------------------
IT0P:PUSHACC;定时器 0服务子程序。保护现场
PUSHPSW
INC38H;每 加 1
MOVA,38H
CJNEA,#36,DONE;满 10mS?
MOV38H,#0;200uS计数单元清 0
INC39H;每 10mS加 1
MOVA,39H
CJNEA,#100,DONE;满 1S?
MOV39H,#0;10mS计数单元清 0
MOVA,3AH;秒单元(按 BCD码)加 1
ADDA,#1
DAA
MOV3AH,A
;------------------------------------非常态 12S自动跳转置常态-------------------------------
---------
DJNZ65H,ZXC;对非常态返回计数单元减 1
MOV27H,#0
ANL28H,#01001000B;置标志位
MOV58H,#0
MOV59H,#57H
ZXC:CJNEA,#60H,DONE;满 1分钟?
MOV3AH,#0;秒单元清零
;---------------------------------锁键盘判定------------------------------------------------
------
MOVA,3EH
CJNEA,#0,ZXC2
SJMPZXC3
ZXC2:DEC3EH
ZXC3:MOVA,3BH;分钟单元(按 BCD码)加 1
ADDA,#1
DAA
MOV3BH,A
CJNEA,#60H,DONE;满 1小时?
MOV3BH,#0;分钟单元清零
MOVA,3CH;小时单元(按 BCD码)加 1
ADDA,#1
DAA
MOV3CH,A
CJNEA,#24H,DONE;满 24小时?
MOV3CH,#0;小时单元清零
DONE:POPPSW;恢复现场
POPACC
RETI;中断返回
;-----------------------------延时子程序---------------------------------
D1S:MOVR7,#8;软件延时 1S子程序
D1S2:MOVR6,#200;(1+(1+(1+3*200+2)*200+2)*8+4)*12/11059200HZ=
D1S1:MOVR5,#200
D1S0:NOP
DJNZR5,D1S0
DJNZR6,D1S1
DJNZR7,D1S2
RET
D30MS:MOVR6,#46;软件延时 30mS子程序
D30MS1:MOVR5,#200;[1+(1+3*200+2)*46+4]*12/=
D30MS0:NOP
DJNZR5,D30MS0
DJNZR6,D30MS1
RET
D1MS:MOVR7,#115;软件延时 1mS子程序
D1MS1:NOP;(1+8*115+2)*12/=
NOP
NOP
NOP
NOP
NOP
DJNZR7,D1MS1
RET
END
附件 2:原理图