您好,欢迎来到爱问旅游网。
搜索
您的当前位置:首页微机原理设计说明书

微机原理设计说明书

来源:爱问旅游网


《微机原理及接口技术》 课程设计说明书 课题:全自动豆浆机控制程序的设计 专业: 班级: 姓名: 学号: 指导老师: 余 力、王亚林 2013 年 12 月 8 日

《微机原理及接口技术》课程设计

目 录

第一章 设计任务与实现目标„„„„„„„„„„„„„„„„„„„„„„„2 设计目标„„„„„„„„„„„„„„„„„„„„„„„„„„„2 设计任务„„„„„„„„„„„„„„„„„„„„„„„„„„„2 基本设计要求„„„„„„„„„„„„„„„„„„„„„„„„„2 功能扩展„„„„„„„„„„„„„„„„„„„„„„„„„„„2 第二章 第三章 第四章 第五章 第六章

总体方案设计与方案论证„„„„„„„„„„„„„„„„„„„„„4

总体方案设计„„„„„„„„„„„„„„„„„„„„„„„„„4 数码管的驱动方式„„„„„„„„„„„„„„„„„„„„„„„5 键盘的扫描方式„„„„„„„„„„„„„„„„„„„„„„„„6 计数方式„„„„„„„„„„„„„„„„„„„„„„„„„„„7 随机数的产生„„„„„„„„„„„„„„„„„„„„„„„„„7 开关量输入消抖模块的选择„„„„„„„„„„„„„„„„„„„7

总体软件设计说明及总流程图„„„„„„„„„„„„„„„„„„9

总工作流程图 „„„„„„„„„„„„„„„„„„„„„„„„9

总体软件设计说明„„„„„„„„„„„„„„„„„„„„„„„11

系统资源分配及数据定义说明„„„„„„„„„„„„„„„„„„„12

微处理器内部存储单元分配及数据定义„„„„„„„„„„„„„„12 局部程序设计说明„„„„„„„„„„„„„„„„„„„„„„„„14

1.自检模块„„„„„„„„„„„„„„„„„„„„„„„„„„14

2.键盘扫描子模块„„„„„„„„„„„„„„„„„„„„„„„15 3.按键消抖子模块„„„„„„„„„„„„„„„„„„„„„„„16 4.时钟设定子模块„„„„„„„„„„„„„„„„„„„„„„„17 5.闹钟设定子模块„„„„„„„„„„„„„„„„„„„„„„„17 6.整点报时、闹钟模式设定子模块„„„„„„„„„„„„„„„„18 7.时钟设定、闹钟设定和模式设定保存、取消与退格模式子模块„„„19 8.整点报时和闹钟模式设定子模块„„„„„„„„„„„„„„„„20 9.按键音子模块„„„„„„„„„„„„„„„„„„„„„„„„21 10.时钟设定位闪子模块„„„„„„„„„„„„„„„„„„„„22 11.30s无操作返回子模块„„„„„„„„„„„„„„„„„„„23 12.实时钟子模块„„„„„„„„„„„„„„„„„„„„„„„23 13.显示更新子模块„„„„„„„„„„„„„„„„„„„„„„24 14.解题闹钟生成子模块„„„„„„„„„„„„„„„„„„„„25

系统功能与操作说明„„„„„„„„„„„„„„„„„„„„„„27

1

《微机原理及接口技术》课程设计

系统功能„„„„„„„„„„„„„„„„„„„„„„„„„„27 用户界面操作说明„„„„„„„„„„„„„„„„„„„„„„28

常规显示界面及其说明„„„„„„„„„„„„„„„„„„„„28 时间设定模式界面„„„„„„„„„„„„„„„„„„„„„„29 闹钟设定模式界面„„„„„„„„„„„„„„„„„„„„„„29 整点报时、闹钟响铃模式设定界面„„„„„„„„„„„„„„„29

第七章 存在问题与改进程序说明„„„„„„„„„„„„„„„„„„„„30 第八章 课程设计总结 „„„„„„„„„„„„„„„„„„„„„„„„ 附录:程序代码清单„„„„„„„„„„„„„„„„„„„„„„„„„„„31

2

《微机原理及接口技术》课程设计

第一章 设计任务与实现目标

设计课题:全自动豆浆机控制程序的设计

设计目的:通过小型微机应用产品的设计与调试过程,运用《微机原理及接口技术》课程

所学的基本知识,在设计中加以应用,进而得到理解、巩固和提高,学习掌握分析与解决实际问题的方法与手段,提高设计、编程与调试的实际动手能力,作为工程技术工作的一次基本训练。

设计任务:豆浆机是家庭自制多种饮品的智能实用小家电,采用微机控制,具有预热、粉碎、煮浆、保温等功能。设计一个以AT89S51单片机为核心的豆浆机模拟控制系统,该系统具有按预设模式自动粉碎谷物、加热功能、防止溢出、处理完毕报警等基本功能。豆浆机处理食品的过程通常为:加热——粉碎1——加热——粉碎2——加热——完成报警,整个加工过程的进行按时间控制。由于食品原料的物理特性不同,在加工处理时采用不同的加工(过程)模式,其主要区别在于加热和粉碎时间的长短不同。在工作过程中,被加工的食品液体被限定在某一个给定的液位范围内,当液体加热时泡沫达到溢出液位时,停止加热,待脱离溢出液位区时继续加热。

实现目标:设计出运用微机控制程序的原理来实现豆浆机的一些基本功能。使得我们在单板机上能够调试出具有豆浆功能选择、启动、预加热、预打浆、加热、打浆、加热、打浆、加热、打浆、煮浆、防溢、结束报警、保温。为了能在单板机上模拟实现这些功能,所以我们需要用单板机上的一些功能来调试模拟出这些实际功能。当我们开机上电时,首先实现自检,即我所用到的功能指示灯L0-L6灯全亮,按“选择”键如PB0选择相应的功能程序,对应的功能指示灯亮。按“启动/取消”键PB1启动制浆程序,根据我所设置的进程码单元20H里的值进入打浆过程。在进程码为00H下,数码管显示的是时钟模式,而在打浆过程中,数码管分别从左到右分别显示工步号、倒计时、温度。在每一进入下一个进程时都要判断是否在此进程下。在进程码00H下,按下启动PB1键后则开始加工流程,如果选择豆浆模式,则表豆浆功能的指示灯L0亮,再按下则选择果汁功能此时指示灯L1亮。若在豆浆的模式下,表加热的指示灯L2亮,在要进入下一个进程的时候进程码置10H,工步号置01;若在果汁的模式下,则点亮表电机转动的指示灯L3,进程码置50H.在进程码为10H下,开始预加热的过程,36H、37H显示缓存单元显示工步号01H。当转动电位器按钮AN0时,温度信号由A/D转换得到数值并输出驱动数码管温度显示缓存单元,并且当温度大于预打浆35度时则进入下一进程11H,在进入下一进程的时候需要把准备工作做好,如赋工步号初值为02,倒计时初值25s,进程码置11H表示加热的指示灯L2要暗,并点亮

3

《微机原理及接口技术》课程设计

表电机转动的指示灯L3。这样在11H下第2步预打浆的时候工步号单元40H显示02,倒计时41H单元 显示25,当倒计时到的时候则进入下一进程12H,此时在进入下一进程的时候赋工步号初值为03,进程码置12H,加热灯开启,电机灯暗。之后进入加热、打浆3次。在12H下第3步加热过程,这时温度单元里的值要与事先设好的打浆温度50相比较,当大于50度了才会到下一个进程13H,并重新赋工步号为04,倒计时单元为25,加热灯灭,电机灯亮。在13H下第4 步打浆25s结束后,进入下一个14H进程。工步号赋05,加热灯亮,电机灯暗。到14H下第5步加热过程,还是跟打浆温度50度相比较,大于的时候则进入15H进程,工步号赋06,倒计时赋25。加热灯暗,电机灯亮。在15H下第6步煮浆25s结束后进入16H进程,工步号置07,加热灯亮,电机灯暗,在16H下进入第7步加热到50度时,工步号置08,倒计时置25s,加热灯暗,电机灯亮,进程码置17H。到第8步17H进程下打浆25s,在要进入下一进程的时候,把进程码置为20H,倒计时置240s,工步号置09。现在进入煮浆模式。在进程码为20H下,当制液位达防溢电极时,用拨动开关SW0为拨下时表示溢出,则加热灯暗,进程码置21H,工步号置10。在21H进程下,SW0拨上表没有溢出,并计时5s后才能开启加热灯。赋进程码20H,工步号为09。另设置一个子模块在20H或21H下,倒计时240s到则加热灯暗,工步号置11,进程码置24H,倒计时置60s。进入结束状态,在24H下表豆浆和果汁的功能键L0和L1指示灯闪烁和报警嘀嘀响并持续一分钟来表示结束进程。另设置一个在24H进程码下的计时60秒子模块,1分钟到时则报警停止,工步号置12H,功能灯都灭,点亮表示保温的指示灯L4,加热灯开启。在25H下,进入保温进程。让加热按时间比例控制低功率加热。比如加热4秒,停止16秒。这些都是豆浆的基本的功能。除此之外,我们还可以设置1分钟内取消,即设置个1分钟到标志位如22H.2,判断是否在00H进程下,不在00H进程下的话,则在1分钟内按下取消键PB1均有效。进程码恢复00H,把所有的指示灯给关了。还有设置了30秒自启动,先判断在00H进程下,再判断选择了豆浆模式或果汁模式,若30秒内没有按下启动键,则30秒会自启动。低水位保护则是在启动后,即不在00H下,如果拨下SW1则表示低水位,则报警并且L5指示灯闪,L0-L4的指示灯暗,置进程码为00H,回到时钟显示。此时时钟显示E1------。

4

《微机原理及接口技术》课程设计

第二章 总体方案设计与方案论证

本次课程设计的课题是带有解题功能的闹钟,是以微机原理及接口技术为理论知识和单片机为核心,实现数字钟常规显示时间功能,增设算术解题关闹功能,对产品的单片机控制程序进行初步的设计,具有走时、校时、常规闹铃、算术解题闹铃等功能。

总体设计方案

对本次课程设计做的带解题功能的数字闹钟控制程序的各项功能进行分析,我们可以采取两种方法。第一种是整体化的编程方法,第二种是模块化、进程化、条件化的编程方法。

方案一:整体化的编程方法

此方案要求在编写程序之前需进行良好的思路构思,逻辑要严谨,难度较大。且在编写程序的时候,思路容易断掉,如果程序出错,则难以查找并改正。因此不适合我这种初学者。

方案二:模块化、进程化、条件化的编程方法

该方法将设计要求的程序分为几个独立但又有联系的小模块,有助于初学者理清编程思路,慢慢的、循循渐进、一块一块的实现各个功能。并且若哪个功能不能实现,则可以直接找到该模块进行相应的修改,因此修改程序较为简便。因此,该方案对于初学者来说相当适用。

1.进程化

进程化的含义就是把系统的运行步骤,用户的操作步骤细分为各个进程。 2.模块化

模块化指的是将主要的功能设计为各个独立的模块,并进行相应的模块细分。

3.条件化

条件化就是当系统要进行下一个工作时,要判断上一个工作是否完成,并且要进行下一个工作时是否满足相应的条件,若满足相应条件,系统则进行下一个工作。

综合上面两个方案的比较分析,本次课程设计主要应用了进程化、模块化、条件化这三个设计方法,使整个程序编写、阅读起来更方便、易懂。

数码管的驱动方式

方案一:LED静态显示驱动方式

我们这次的课程设计是使用8个8段数码管,并且是用共阳的接线方式。静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O口进行驱动。静态驱动的特点接口逻辑及驱动程序简单、显示亮度高且稳定、但占用I/O端口多、总的驱动电流大。如驱动8个数码管静态显示则需要大约64mA的电流来驱动,驱动电流太大,大大增加了硬体电路的复杂性。

方案二.:LED动态显示驱动方式

5

《微机原理及接口技术》课程设计

动态驱动是将所有数码管的8个显示笔划\"a,b,c,d,e,f,g,dp \"的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,可以通过位码的移位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码管就不会亮。

透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位元数码管的点亮时间为大约1ms左右,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快(大约大于80Hz),就会给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,并且动态驱动占用I/O端口少、驱动程序稍繁,须不断更新驱动,占用CPU时间多、总的驱动电流小。

通过上面的综合判断LED的驱动我们选择方案二——动态显示驱动方式

键盘的扫描方式

方案一:扫描法

首先识别键盘有无键按下,驱动所有列线为‘0’,输入各行线电平如果有‘0’,就说明有键按下,如果行线电平全‘1’,则全部无键按下。其次是如有键被按下,识别具体的按键。依序驱动某一列为‘0’ ,其余列均为‘1’ ,输入各行线电平,如果某行线电平为‘0’ ,可确定此行列交叉点处的按键被按下;如果行线电平全为‘1’ 则本列无按键按下。这种方式太占用CPU的工作时间。

方案二:线反转法

首先列线输出为全‘0’ ,随后输入行线电平如有‘0’,则‘0’所在的行就是闭合的按键所在行;无‘0’则无键闭合。其次行线输出为全‘0’ ,随后输入列线电平如有‘0’,则‘0’所在的列就是闭合的按键所在列;无‘0’则无键闭合。

直通结合上述两步,可确定按键所在行和列。这种方式非常简单,并且很实用。 综合以上的分析,我们选择方案二——线反转法

6

《微机原理及接口技术》课程设计

计数方式

方案一:13位计数方式--方式0

定时器/计数器方式0 一共是有13位的计数方式。方式0是为兼容MCS-48而设,初值计算麻烦,在实际应用中,一般不用方式0。并且存在一个是时间误差,不能适用于精确定时。

方案二:16位计数方式--方式1

定时器/计数器方式1 一共是有16位的计数方式,由于它每个扫描周期都会有3~8个Tm(机器周期)的时间误差,主要是用于要求不是很精确地定时,因为有随机性的误差产生。

方案三:8位计数自动重装工作方式--方式2

定时器/计数器方式2为自动恢复初值(初值会自动重装)的8位定时器/计数器,当其计数溢出的时候,系统会自动重装初值,重新开始计数。这种工作方式可以省去用户软件中重装初值的指令执行时间,可以做到精确地定时时间。

综上所述,我们是要求能做到精确定时,所以选择方式2

随机数的产生

随机数是专门的随机试验的结果。真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的。我们可以这样认为这个可预见的结果其出现的概率是100%。所以用计算机随机函数所产生的“随机数”并不随机,是伪随机数。所以计算机产生的随机数叫做“伪随机数”

方案一:可以预先设置数据表,然后可以杂乱无章的顺利取用。 方案二:读取定时器/计数器T1的值,然后经行转换。

方案三:读取定时器/计数器T0的值,定时器/计数器T0的初始化为每10次/100次为一个周期,然后读取TL0的值,用256减去改值得到00~63H(二进制)的数值,也可以转为00~99H(BCD码)

方案四——可以利用主流程对某个单元进行按BCD码加1,随机数的产生子程序分一个单元存随机数,用4条语句就可以实现按BCD码加1 的功能(100c次循环,每大约10MS左右调用一次),这样就可以产生00~99H的BCD码。取数,大的当被减数,小的当减数。 综上所述,我们选用方式4 的方法来产生随机数。

开关量输入消抖模块的选择

对于开关量输入的消抖处理一般有以下两种种处理方法。 方案一:软件延时消抖

即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,

7

《微机原理及接口技术》课程设计

也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

方案二:滚动滤波消抖法

滚动滤波消抖法就是通过滚动滤波法的原理,我们是现将新建号推为旧键号,然后通过将前4次输入的电平值推到4AH~4DH单元,然后读、存取新键号比较5次输入的电平值不一致则新态照旧,若一至则存为新键号,只有前键号为10H,新键号不为10H时,才能说明有按键按下。

此次设计采用滚动滤波法可以很好地解决消抖模块对整个程序的影响,所以开关量输入消抖模块采用滚动滤波消抖法实现。

8

《微机原理及接口技术》课程设计

第三章 总体软件设计说明与总工作流程

总工作流程如图所示

主流程 程序初始化 自检子模块 B 调用键盘扫描子模块 调用键盘消抖子模块 实时钟子模块 调用键盘消抖子模块 时钟设定子模块 闹钟设定子模块 整点报时、闹钟模式子模块 时钟设定、闹钟设定、模式设定确定、取消、退格子模块 拆字子模块 A 9

《微机原理及接口技术》课程设计

B 软件延时子模块 解题产生子模块 闹铃模式子模块 开闹子模块 30s无操作退出子模块 显示更新子模时钟设定位闪子模块 按键音子模块 A 10

《微机原理及接口技术》课程设计

总体软件设计说明

本次的课程设计可分为时钟显示、走时、校时、常规闹铃、算术解题闹铃等功能,总共15个子程序,并且用了定时器1和计数方式2来进行精确实时钟计时。

拆字子程序:将实时钟的时、分、秒分别拆字送显示缓存单元。

显示更新子程序:将显示缓存单元30H-37H的数据通过查表法找到相应的段码表将要显示的内容显示到数码管上。

时钟设定子程序:按下时钟设定功能键后,可对当前时间进行调整。 报时模式设置子程序:当按下报时模式设置键后,对模式进行设置。

闹钟设定子程序:当用户按下闹钟设定功能键时,显示闹钟设定界面并采用数字输入式调整闹钟响铃时间,实现闹钟设定功能。

整点报时、闹钟模式设定子程序:当按下模式设定功能键后显示界面将进入模式设定界面。可通过键盘采用数字输入式设定整点报时或闹钟响铃模式。

解题题目生成子程序:闹钟模式设定为解题模式下,生成一个算术题以供用户解答。 键盘扫描子程序:将新得到的键号存入旧的键号,将前4次得到的电平值推送至4AH-4DH单元中,获得键号并存为新态键号,比较5次得到的电平值,若电平值不一致则新态不变,若点电平值一直则存为新态键号。

30s无操作返回子程序:当用户按下设定功能键后,30s无操作则自动退出设定模式返回常规时钟显示模式。

11

《微机原理及接口技术》课程设计

第四章 系统资源分配及数据定义说明 微处理器内部存储单元分配及数据定义

微处理器内部存储单元 20H 21H.0 21H.1 21H.2 21H.3 21H.4 21H.5 21H.6 21H.7 22H 23H.0 23H.1 24H 25H 26H 27H 28H 2AH 2BH 2CH 2DH 2EH 2FH 30H-37H 38H 39H 3AH 3BH 3CH 3EH

数据定义 总进程码存储单元 是否拆字标志位 闹钟设定标志位 是否有键按下标志位,有按下为0,无按下为1 时钟设定标志位 小时十位闪烁标志位 小时个位闪烁标志位 分钟十位闪烁标志位 分钟个位闪烁标志位 整点6声连续报时进程码存储单元 整点报时音、闹钟模式设定子程序标志位 是否正在响铃标志位 闹钟响铃进程码 闹钟设定小时存储单元 闹钟设定分钟存储单元 闹钟设定模式存储单元 整点报时设定模式存储单元 闹钟响铃30s计数单元1 闹钟响铃31s计数单元2 未解题或答案错误响铃300s计数单元1 未解题或答案错误响铃300s计数单元2 是否蜂鸣器正在响铃存储单元 是否蜂鸣器正在响铃存储单元 显示缓存单元 200us计数单元 1/100s计数单元 实时钟秒钟存储单元 实时钟分钟存储单元 实时钟小时存储单元 30s无操作返回计数单元1 12

《微机原理及接口技术》课程设计 3FH 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH 4CH 4DH 52H 60H 61H 64H 65H 30s无操作返回计数单元2 时钟设定、闹钟设定分钟个位暂存单元 时钟设定、闹钟设定分钟十位暂存单元 时钟设定、闹钟设定小时个位暂存单元 时钟设定、闹钟设定小时十位暂存单元 随机数产生存储单元 解题闹钟随机数高四位存储单元 解题闹钟随机数低四位存储单元 解题闹钟算式正确答案存储单元 按键消抖中间存储单元 按键消抖中间存储单元 按键消抖中间存储单元 按键消抖中间存储单元 按键消抖中间存储单元 闹铃初始计数单元 按键行列码存储单元 键值存储单元 键值新态存储单元 键值旧态存储单元

13

《微机原理及接口技术》课程设计

第五章 局部程序设计说明

1.自检模块

功能简述

该模块主要功能为在开机时进行有关接口部件及数码显示器、指示灯、蜂鸣器等适当自检。

程序设计思路及方案

当产品开机进入工作状态后,立即开始自检模块的功能,检验产品硬件功能完好,以确保系统各部分功能能够正常实现。 原理说明及部分代码

将控制数码管的位码及段码分别赋值为全1和全0,使数码管全亮如图所示。代码CLR P3.2使蜂鸣器响,同时点亮L0-L15的16个LED灯,以走马灯形式循环一遍,一秒后关闭蜂鸣器和数码管,并在数码管做常规显示,即显示当前时间。30H为控制跑马灯寄存器,R4为跑马灯的循环次数,66H为存入此时的30H值即第几个灯亮,代码RL A作用是左移使下一个LED亮,代码MOV P1,#0FFH使此时亮的灯灭巡回亮完就全关,代码DJNZ R4,L8判断是否到最后一个灯,是否还需要循环。完成自检模块后,即可进行后面的功能实现。

2.键盘扫描子模块

功能简述

该模块主要功能为实现4*4的键盘扫描功能,扫描当前所按下4*4键盘的按键存入相应存储单元,并获得键值,以备后面的操作和功能实现。 程序设计思路及方案

该模块在主流程中调用键盘扫描子程序(LCALL),运用反转法扫描键盘,得到所按下按键的相应行列码。当用户未按下按键时,相应存储单元存入未按下信息,即为10H,当用户按下按键时,系统相应存储单元存入已按下信息,即00H-0FH。通过扫描,并与键码表比较行列码,相等说明扫描到所按下的按键,将键值赋值到61H储存单元,以便后面的使用。

原理说明及部分代码

61H为键值存储单元,给61H单元赋初值,通过扫描所按下按键的行列码与键码表比

14

《微机原理及接口技术》课程设计

较,找到相等的即说明有键按下,且能精确得到相应键码,若找不到相等键码则说明为按下按键。

键号值从00H开始,最多进行16次的键码查表,DPTR指向键码表首地址,置当前键号于A中,代码MOVC A,@A+DPTR查表读取键码表中当前键号对应位置的键码,与8位行列码比较,不同则转NK查下一个,相同表明找到当前按下的键号,代码INC 61H使键号值加1,代码DJNZ R5,KY判断未查完键值表则继续,查完则无按键或出现异常行列码,结束并返回。

3.按键消抖子模块

功能简述

该模块的主要功能为提供用户校时功能。 程序设计思路及方案

将新得到的键号存入旧的键号,将前4次得到的电平值推送至4AH-4DH单元中,获得键号并存为新态键号,比较5次得到的电平值,若电平值不一致则新态不变,若电平值一致则存为新态键号。 原理说明及部分代码

当前态键号为10H,而新态键号不为10H时,才可认为有按键按下;若前态和新态键号都为10H时,则认为未按下按键。

代码MOV 65H,64H将新得到的键号存入旧的键号,即64H为新态键值存储单元,65H为旧态键值存储单元,代码

MOV 4DH,4CH MOV 4CH,4BH MOV 4BH,4AH MOV 4AH,49H

将前4次得到的电平值推送至4AH-4DH单元中,获得键号并存为新态键号,代码 MOV A,4DH CJNE A,4CH,XD CJNE A,4BH,XD CJNE A,4AH,XD CJNE A,49H,XD

比较5次得到的电平值,若电平值不一致则新态不变,若电平值一致则存为新态键号。

4.时钟设定子模块

功能简述

15

《微机原理及接口技术》课程设计

该模块的主要功能为解决用户校时调时功能。 程序设计思路及方案

当用户按下时钟设定功能键时,显示时钟设定界面并采用数字输入式调整当前时间,实现校时调时功能。 原理说明及部分代码

利用进程码进行设定,当满足相应进程条件时才可继续进行相应的程序设定。 代码JB 23H.1,SB使响铃时按下时钟设定键无效,代码CJNE @R1,#00H,S10判断进程码是否为00H,若进程码为00H则开始进入时钟设定模式。代码MOV 20H,#10H将进程码置10H,开始设置小时十位,小时数十位置1位闪并屏蔽无关位。代码CJNE A,#3,S1判断是否键值小于3,因为小时数只允许0到24的数值范围,键号大于等于3即不符合要求则退出。代码SETB 21H.0为拆字标志位置位(不拆字),若为0则开始拆字。代码JNB 21H.2,SZ判断按键是否放开,若为1为放开,则重新置位,键值赋值给小时十位,代码MOV 44H,34H将键值给中间记忆单元44H,保存小时的十位,无按键按下标志位清零。接下来的代码将进程码置11H,开始设置小时个位,以此类推设置时钟个位和分钟十位及个位。

CLR 21H.2 ;无按键按下标志位清零

MOV 20H,#11H ;进程码置11H

5.闹钟设定子模块

功能简述

该模块主要功能为实现用户闹钟时间设定功能 程序设计思路及方案

当用户按下闹钟设定功能键时,显示闹钟设定界面并采用数字输入式调整闹钟响铃时间,实现闹钟设定功能。 原理说明及部分代码

利用进程码进行设定,当满足相应进程条件时才可继续进行相应的程序设定。 代码JB 23H.1,NC使响铃时按下闹钟设定键无效,代码CJNE @R0,#00H,N20判断进程码是否为00H,若进程码为00H则开始进入闹钟设定模式。代码MOV 20H,#20H将进程码置20H,开始设置小时十位,小时数十位置1位闪并屏蔽无关位,代码CJNE A,#3,S1判断是否键值小于3,因为小时数只允许0到24的数值范围,键号大于等于3即不符合要求则退出。代码JNB 21H.2,NC判断按键是否放开,若为1为放开,则重新赋值,代码

MOV 34H,A MOV 44H,34H

将键值赋值给中间记忆单元,44H,保存小时十位。代码MOV 20H,#21H将进程码置21H,开始设置小时个位,以此类推设置时钟个位和分钟十位及个位。

16

《微机原理及接口技术》课程设计

6.整点报时、闹钟模式设定子模块

功能简述

该模块主要功能为提供用户整点报时、闹钟模式设定功能。 程序设计思路及方案

当用户按下模式设定功能键时,显示模式设定界面并采用数字输入式进行模式设定,通过按键按下实现整点报时、闹钟模式设定功能,即设定整点报时和闹钟响铃模式。 原理说明及部分代码

利用进程码进行设定,当满足相应进程条件时才可继续进行相应的程序设定。 代码JB 23H.1,MA使响铃时按下时钟设定键无效,获取键值,判断是否按下模式设定键,若按下按键为模式设定键则开始进入模式设定界面。

代码CJNE @R0,#30H,M31判断进程码是否为30H,若是则开始进行整点报时模式设定,若不是则跳转M31,即跳转设置闹钟模式。将数码管高四位清零,保证闪烁的时候只有一个位有效,代码SETB 21H.7将整点报时位位闪并屏蔽无关位,即置1时才闪烁当前所设置位。代码

CJNE A,#00H,M1 SJMP M13

M1:CJNE A,#01H,M12 SJMP M13

M12:CJNE A,#06H,MA

判断是否键值等于0,即整点报时功能关闭,判断是否键值等于1,即整点一声短促报时,判断是否键值等于6,即快到整点时连续响6声报时,代码JNB 21H.2,MA判断按键是否放开,若为1为放开,则重新赋值,代码

MOV 34H,A MOV 44H,34H

将键值赋值给中间记忆单元44H,保存为整点报时模式。代码MOV 20H,#31H将进程码置31H,进入闹钟模式设定,并以此类推进行闹钟模式设定。闹钟模式有关闭闹钟模式、常规闹钟模式即到点响铃30秒、解题闹钟模式。

7.时钟设定、闹钟设定和模式设定保存、取消与退格模式子模块

功能简述

该模块主要功能为提供用户时钟设定、闹钟设定和模式设定的保存、取消和退格功能。 程序设计思路与方案

当用户进行时钟设定、闹钟设定或模式设定时,设定完成后按下确定键即可更改当前时间;按下取消键即可取消设定退回常规显示状态,并且不更改当前状态;若输入有误按

17

《微机原理及接口技术》课程设计

下退格键即可返回前一位设定。系统只支持常规24小时制的时间设定,若输入时间值不符合常规模式,则输入无效。同时,模式设定时,整点报时设定只支持0、1和6输入,闹钟模式设定只支持0、1和2输入。 原理说明及部分代码

利用进程码进行设定,当满足相应进程条件时才可继续进行相应的程序设定。 通过键盘按下确定、取消、退格键,程序内部通过21H.1、21H.3、23H.0判断是当前按下哪个设定键,在时钟设定21H.3置位状态下,也就是在10H-13H进程下。按下确定键,显缓上的时钟和分钟会将41H-44H暂存数据单元拼字回存到3BH和3CH单元中,并把3AH秒钟存放单元清零。按下取消键,返回00H进程。在11H-13H进程下按下退格键,进程码减1。在闹钟设定21H.1置位状态下,也就是20H-23H进程下,按下确定键,显缓上的时钟和分钟将会拼字回存到25H和26H闹钟时钟和分钟存储单元中,退格键和取消键功能与时钟设定的退格键、取消键功能相同,模式设定的确定、取消、退格键原理与闹钟设定相同。

拼字回存子程序如下,拼字回存设分和分钟到闹钟设定单元。 MOV A,44H SWAP A ORL A,43H MOV 25H,A MOV A,42H SWAP A

8.整点报时和闹钟模式设定子模块

功能简述

该模块主要功能为提供用户整点报时模式设定和闹钟响铃方式设定,其中整点报时模式有短促式报时音、六声式报时音和关闭报时三个模式,闹钟模式设定模块有常规闹铃、解题闹钟模式和关闭闹铃三个模式。 程序设计思路及方案

当用户按下模式设定按键时,显示界面将进入模式设定界面,即如图所示。可通过键盘采用数字输入式设定整点报时或闹钟响铃模式。

如图所示“Ed”为整点报时模式设定,系统只支持输入0,1或6。0表示整点报时功

18

《微机原理及接口技术》课程设计

能关闭,即系统到达整点时将不报时;1表示系统到达整点时有一声短促音报时;6表示整点时有6声连续报时,即在59分55秒时开始每秒有一声短促响铃,直到00分00秒时有一声较长的响铃,后关闭响铃。

如图所示“FS”为闹钟响铃模式设定,系统只支持输入0,1或2。0表示闹铃功能关闭,即系统到达闹钟设定时间时不响铃;1表示常规闹铃,即系统到达闹钟设定时间时有“滴滴滴”的连续响铃,直到按下取消键或者连续响铃达到30秒,响铃才停止;2表示解题闹钟模式,即系统到达闹钟设定时间时,显示界面将显示一道算术题,只有当用户输入正确答案或者连续响铃达到五分钟,响铃才停止,若按下取消键,响铃并不停止,而是另换一题算术题以供作答。 原理说明及部分代码

整点报时模块,在00H进程下读取28H中存放的模式码,选择进入模式,模式1中检测分钟和秒钟是否为零,产生短促音后再判断是否到01s将短促音关闭,模式6中用了22H单元存放进程码,从55s开始实现五短一长的响铃。

闹钟响铃模块,在00H进程下,10ms不停循环比较25H和26H中所存储的闹钟时间是否与3CH和3BH一致,若一致则读取响铃模式,模式0为关闭闹钟响铃,模式1为常规响铃模式,软件延时30秒,若在此过程有取消键按下,则2FH单元清零即强制关闭蜂鸣器。模式2为解题闹钟模式,即调用解题闹钟生成子模块和响铃模块。

9.按键音子模块

功能简述

该模块主要功能为用户按下按键时回馈短促按键音以提供良好操作手感。 程序设计思路及方案

为了避免各模块之间的冲突问题,通过标志位解决按键音子模块与其他子模块间的冲突问题。

原理说明及部分代码

按键音子模块是为了给用户提供良好的操作手感,按键按下启动蜂鸣器响。由于按键音和响铃都用到了蜂鸣器,两者就会互相抑制而覆盖,蜂鸣器效果将不够理想,因此采用两个单元,一个单元做按键音的标志位,一个单元做响铃的标志位,这两个单元分别使蜂鸣器响起,不会互相干扰。

代码MOV A,64H将按键按下的键号存入64H单元,判断是否有按键按下,代码CJNE @R0,#00H,AJ判断只要有一个位是\"1\",则蜂鸣器就会响。

19

《微机原理及接口技术》课程设计

10.时钟设定位闪子模块

功能简述

该模块主要功能为在设定键盘输入状态下通过闪烁提示当前所修改位置. 程序设计思路与方案

为了避免显示位与位之间的冲突问题,通过标志位解决位与位之间的冲突问题,时钟十位闪烁标志位为21H.7,时钟个位闪烁标志位为21H.6,分钟十位闪烁标志位为21H.5,分钟个位闪烁标志位为21H.4。 原理说明及部分代码

在时钟设定和闹钟设定的进程中当前所设置位要闪烁,因此在每位段码输出前要先判断是否当前位要输出,使用位闪标志位,采用2HZ频率闪烁,利用39H单元即存放1/100s,除以25判断位码最后一位是0还是1,是0则当前位数码管不亮,是1则当前位数码管亮,即达到闪烁目的。

11.30s无操作返回子模块

功能简述

该模块主要功能为当用户按下模式设定按键进入设定模式时,若30秒都无操作,则系统自动退出设定模式,返回常规显示模式。 程序设计思路及方案

判断20H进程码,若不是在00H进程下,则无操作30秒后自动退出设定模式,若30s内有按键按下,则将30秒计数单元清零。 原理说明及部分代码

首先检查是否为00进程,如果为00进程,表示为常态,未进行任何按键操作,则对30s无操作的计数单元清零。当不为00进程时,则为有按键操作的其他进程,此时需要判断30s内是否有按键按下,要完成计时和按键按下的判断。当判断旧键号和新键号均为无按下的状态时,开始计时,对相应的单元3EH加1,若计到30s仍无按键操作,则自动对20H、21H赋值00H,回到常态,完成30s无操作的相关功能。

12.实时钟子模块

功能简述

该模块主要功能为精确实时钟计时。 程序设计思路及方案

利用定时方式1产生中断进行精确实时钟计时。 原理说明及部分代码

20

《微机原理及接口技术》课程设计

当定时器1满足中断条件(即定时器计满200us),发生中断,找到中断路口地址001BH,跳转到子程序IT1P。子程序的开头和结尾分别对累加器A和PSW进行入栈和出栈,保证完成中断回到主循环后,能保存累加器和PSW的数据。进入IT1P子程序表示完成200us计时,此时先对38H单元加1,用以做200us计时单元。同时判断38H是否为36次,即是否计满36*200us=10ms?当时间未到10ms,则跳出子程序,继续等待中断发生,再过200us再进入程序,为38H单元加1。当计满10ms,对200us单元38H清零,并对百分秒单元39H加1,判断计满100次即1s的时间,将百分秒单元清零,对秒单元3A单元加1,之后按照时间规律,每60s对秒单元清零、分钟单元加1;每60min对分钟单元清零、小时单元加1„„但处理秒、分和时的加1需要十进制加1(BCD码加1),使用ADD累加并用DA进行十进制调整,可以完成此功能。

13.显示更新子模块

功能简述

该模块主要功能为将显示缓存单元30H-37H的数据通过查表法找到相应的段码表将要显示的内容显示到数码管上。 程序设计思路及方案

通过单元指针逐个将显示缓存单元30H-37H的数据,查表法找到相应的段码表将要显示的内容显示到数码管上,再通过循环和判断执行相应程序。 原理说明及部分代码

置显缓首位,位码首位,查询相关的字段码,输出字段码,保存显示1ms,消除串显,指向下一个单元,在30H-37H单元循环。

14.解题闹钟生成子模块

功能简述

该模块主要功能为当用户设定闹钟模式为解题闹钟时,在闹钟时间到达响铃的同时随机产生一道算术题供用户解答,只有当用户输入正确答案或连续响铃到达五分钟,响铃才停止。

程序设计思路及方案

利用主流程对45H单元按BCD码加1,大约10ms调用一次,随机数的产生子程序分一个单元存随机数,用4条语句就可以实现按BCD码加1 的功能(100次循环,每大约10MS左右调用一次),即可产生00-99H的BCD码,从而产生随机数,存入相应单元,比较所取数,按大小顺序生成减法即可产生算术题。 原理说明及部分代码

题目生成后结题者输入正确答案。如是正确答案则会关闭闹钟,若错误则响铃5分钟。

21

《微机原理及接口技术》课程设计

第六章 系统功能与操作说明

系统功能

数字闹钟的闹铃功能在数字手表、以及手机、电脑、数码产品中均有类似的应用,有提供多组闹铃设定,也有提供“贪睡”功能(定间隔重复闹铃),但依然因为可以轻易关掉闹钟而容易迟到误事,近来流行带算术解题功能的闹钟软件应用于手机及平板电脑中,闹铃响起后随机生成算术题,须答对才停止响铃,可如此重复十次,促进提神并醒来。

本次设计的数字时钟利用AT89S51单片机作为核心芯片,实现数字钟常规功能,增设算术解题关闹功能,对产品单片机控制程序进行初步设计,辅以按键、蜂鸣器和LED显示器,以实现具有计时、校时、闹钟设定等功能。

用户可以设置所需时间闹铃,在闹铃之前系统会通过用户的选择常规闹铃还是算术解题闹铃功能。若用户关闭闹铃,则系统到达相应的时间将不会响铃;若用户选择常规闹铃,则系统到达相应时间将持续响铃五分钟或按下取消键为止;若用户选择解题闹铃,则闹铃响起后随机生成算术题,须答对后才停止响铃,可如此重复多次,使用户清醒并具有提神作用。

用户界面及操作说明

针对用户界面按键设置和使用做相应说明。 常规显示界面及其说明

常规显示状态下,8位数码管是显示“时钟 - 分钟 - 秒钟”,当用户按下进入设定界面后,数码管就是显示相应设定界面。进入相应的设定界面之后,若是30s无操作,则系统将返回常规显示状态。

数码管显示界面,从右到左分别为第一位至第八位

常规显示状态,即显示当前时间

22

《微机原理及接口技术》课程设计

用户操作界面如图所示

时间设定模式界面

当用户按下时钟设定功能键,显示界面将进入时钟设定模式,即如图所示。可通过键盘采用数字输入式设定实时钟的时钟、分钟参数,设定完成后按下确定键即可更改当前时间;按下取消键即可取消设定退回常规显示状态,并且不更改当前时间;若输入有误按下退格键即可返回前一位设定。系统只支持常规24小时制的时间设定,若输入时间值不符合常规模式,则输入无效。设定完成后秒钟自动清零。如图所示数字分别表示时钟和分钟。

闹钟设定模式界面

当用户按下闹钟设定功能键,显示界面将进入闹钟设定模式,即如图所示。可通过键盘采用数字输入式设定闹钟的时钟、分钟参数,设定完成后按下确定键即可设定闹钟响铃时间;按下取消键即可取消设定退回常规显示状态,并且闹钟设定时间无效;若输入有误按下退格键即可返回前一位设定。系统只支持常规24小时制的时间设定,若输入时间值不符合常规模式,则输入无效。设定完成后,当系统时间到达设定时间,则按照用户设定的闹钟响铃模式响铃。如图所示,分别表示时钟和分钟。

23

1 4 7 取消2 5 8 0 3 6 9 退格 时钟设定 闹钟设定 模式设定 确定 《微机原理及接口技术》课程设计

整点报时、闹钟响铃模式设定界面

当用户按下模式设定功能键,显示界面将进入模式设定,即如图所示。可通过键盘采用数字输入式设定整点报时或闹钟响铃模式。

如图所示“Ed”为整点报时模式设定,系统只支持输入0,1或6。则0表示整点报时功能关闭,即系统到达整点时将不报时;1表示系统到达整点时有一声短促音报时;6表示整点时有6声连续报时,即在59分55秒时开始每秒有一声短促响铃,直到00分00秒时有一声较长的响铃。

如图所示“FS”为闹钟响铃模式设定,系统只支持输入0,1或2。则0表示闹铃功能关闭,即系统到达设定闹铃时间时不响铃;1表示常规闹铃,即系统到达设定闹铃时间时有“滴滴滴”的连续响铃,直到按下取消键或者连续响铃达到30秒,响铃才停止;2表示解题闹钟模式,即系统到达设定闹铃时间时,显示界面将显示如图所示的算术题,只有当用户输入正确答案或者连续响铃达到五分钟,响铃才停止,若按下取消键,响铃并不停止,而是另换一题算术题以供作答。

注:若按下功能键无操作,则30秒后系统显示界面自动返回常规显示界面。

24

《微机原理及接口技术》课程设计

第六章 课程设计总结

25

《微机原理及接口技术》课程设计

附录:程序代码清单

;综合应用实验(89S51实验板程序示例) ORG 0000H ;复位入口 LJMP MAIN

ORG 001BH ;定时器1中断服务子程序入口(进行实时钟计时) LJMP IT1P

ORG 0030H

MAIN:MOV SP,#6FH ;总初始化。设定栈底指针

LCALL D40MS ;稍加延时(40mS),以待各芯片均退出复位状态 MOV DPTR,#0FEFFH ;对8255A(U3)接口芯片初始化

MOV A,#89H ;设定A输出(驱动字段)、B口输出(驱动字位),C口输入 MOVX @DPTR,A ;写入方式控制字 MOV DPTR,#0FEFDH ;DPTR指向U3-B口

MOV A,#0FFH ;置八位均显示的字位码八位全点亮 MOVX @DPTR,A ;关显示(位驱动全为'0'无效) MOV DPTR,#0FEFCH ;八位全点亮 MOV A,#00H MOVX @DPTR,A

MOV DPTR,#0FDFFH ;对8255A(U5)接口芯片初始化 MOV A,#8BH ;设定A口输出,B口输入,C口输入 MOVX @DPTR,A ;写入方式控制字 MOV DPTR,#0FDFCH ;DPTR指向U5-A口

MOV A,#0FFH ;置八位输出均为'1'无效 MOVX @DPTR,A ;令L8-15初始不亮 CLR P3.2 ;蜂鸣器响 LCALL D1S ;延时1S SETB P3.2 ;关蜂鸣器

/*跑马灯初始化,检验LED灯是否损坏*/

MOV R4,#8 ;跑马灯的循环次数

MOV 66H,#0FEH ;30H为控制跑马灯寄存器 L0:MOV P1,66H

LCALL D40MS ;亮40MS MOV A,66H

RL A ;左移使下一个LED亮

MOV 66H,A ;存入此时的30H值即第几个灯亮

DJNZ R4,L0 ;判断是否到最后一个灯,是否还需要循环 MOV P1,#0FFH ;使此时亮的灯灭巡回亮完就全关

26

《微机原理及接口技术》课程设计

MOV R4,#9 ;此时带进位标志的左移,则需要多循环一次 MOV A,#0FEH ;同上,使L8亮

SETB C ;带进位标志左移,最后一位停在C进位标志上 L8:MOV DPTR,#0FDFCH ;指向U5的A口 L8-L15 MOVX @DPTR,A ;输出驱动L8-15,即L8-L15 LCALL D40MS ;延时(40mS)

RLC A ;带进位标志左移

DJNZ R4,L8 ;判断是否到最后一个灯,是否还需要循环 MOV P1,#0FFH ;同上,灯灭

SETB EA MOV 38H,#00H ;38H MOV 39H,#00H MOV 3AH,#45H ; MOV 3BH,#59H ; MOV 3CH,#08H ; MOV TMOD,#26H MOV TL1,#00H ; MOV TH1,#00H ; SETB ET1 ; SETB TR1 ;/*进程码设置*/

MOV 20H,#00H ; MOV 21H,#00H ; MOV 22H,#00H ; MOV 23H,#00H ; MOV 24H,#00H ; MOV 25H,#09H ; MOV 26H,#00H ; MOV 27H,#00H ; MOV 28H,#01H ; MOV 2EH,#00H ; MOV 2FH,#00H MOV 64H,#10H MOV 65H,#10H MOV 52H,#20

/*主流程*/ LOOP:LCALL NZ

LCALL KEY ; LCALL XDAJ ;LCALL AJY ; LCALL CZ ;LCALL SHAN ;

开中断总允许

单元为实时钟200uS计数单元,清0 单元为10mS计数单元,清0 秒单元初值 分单元初值

时单元初值,时钟初值08:59:45

初始化T1为定时方式2,T0为计数方式2。 置T1计数初值

即每约200uS请求中断 开T1中断允许 启动T1定时工作 赋初始进程码00H 进程码标志位 整点报时进程码

闹钟模式响铃方式标志位 闹铃DDD进程码 闹钟设置小时初值 闹钟设置分钟初值 闹钟设置模式初值 整点报时模式初值 蜂鸣器中间继电器 调用键盘扫描子程序 键盘滚存消抖 按键音

调用显示内容送显缓子程序(拆字) 调用时钟设定位闪子程序

27

; ;39H ; 《微机原理及接口技术》课程设计

LCALL KEY_A ;调用时钟设定子程序

LCALL BC ;调用时钟设定保存、取消、退格子程序 LCALL KEY_B ;调用闹钟设置子程序

LCALL KEY_C ;调用整点报时音闹钟模式设定子程序 LCALL TU ;调用30秒无操作退出子程序 LCALL DISP ;调用显示更新子程序 LCALL ED ;整点报时

SJMP LOOP ;反复循环主流程

/*拆字子程序*/

CZ:JB 21H.0,CZ0 ;是否拆字标志位,为0才拆字,为1跳转 JB 23H.6,CZ0 ;换题不拆字标志位,闹钟模式 MOV A,20H ;获取进程码

CJNE A,#10H,CZ5 ;进程码为10H,设置时钟时,不等则跳转20H MOV R0,#3BH ;只显示时和分,取分

MOV 37H,#0AH ;A-08-59,初始显示当前时间,第0AH个为“A” MOV 36H,#10H ;第10H个为“-” MOV 44H,34H ;时 MOV 43H,33H

MOV 42H,31H ;分 MOV 41H,30H

CZ5:CJNE A,#20H,CZ11 ;进程码为20H,设置闹钟时,不等则跳转30H MOV 37H,#0BH ;B-00-00,初始显示0点0分,”b” MOV 36H,#10H ;”-” MOV 34H,#00H ;时 MOV 33H,#00H

MOV 31H,#00H ;分 MOV 30H,#00H

SETB 21H.0 ;置1,不拆字

SJMP CZ6 ;cz6记忆最后一次拆字的时和分 CZ11:CJNE A,#30H,CZ1 ;进程码为30H,设置整点及闹钟铃响模式时,不等则拆字显示 MOV 37H,#0EH ;ED-0 FS-0,初始显示整点和闹钟铃响模式都为0,”e” MOV 36H,#0DH ;”d” MOV 35H,#10H ;“-” MOV 34H,#00H ;”0” MOV 33H,#0FH ;”F” MOV 32H,#05H ;”s” MOV 31H,#10H ;”-” MOV 30H,#00H ;”0” SETB 21H.0 ;不拆字 SJMP CZ6

CZ1:CJNE A,#00H,CZ2 ;不为10H,20H,30H,即无按下设置功能键

28

《微机原理及接口技术》课程设计

MOV R0,#3AH ;取秒,开始拆字实时种

CZ2:MOV R1,#30H ;置显示缓冲单元首地址(对应于最右显示位) CZ3: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 ;指向显缓下一个个位单元 MOV @R1,#10H

INC R1 ;指向显缓下一个个位单元 INC R0 ;指向下一个时钟数据单元 CJNE R0,#3DH,CZ3 ;未完继续,判断是否已拆完

CZ6:MOV 44H,34H ;记忆最后一次拆字的时和分 时; MOV 43H,33H MOV 42H,31H ;分 MOV 41H,30H

CZ0:RET ;子程序返回

/*显示更新子程序*/

DISP: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 A,#0FFH ;此三行使每位显示后立即关掉,否则第一位会较亮 MOV DPTR,#0FEFCH MOVX @DPTR,A

INC R0 ;指向下一显示缓冲单元 MOV A,R3 ;取出原来的位码

JB ACC.7,DISP2 ;判断若已显示到最左位则结束,是则跳转DISP2,否则继续

RL A ;未完,字位码左移1位 MOV R3,A ;回存新的位码

LJMP DISP1 ;转下一位的显示驱动

29

《微机原理及接口技术》课程设计

DISP2:

MOV 34H,44H ;将记忆的时分重新给显缓 MOV 33H,43H ;恢复原来数值,防止数值丢失 MOV 31H,42H MOV 30H,41H

MOV A,45H ;获取随机数

ADD A,#1 ;每10mS左右加一,按BCD加1 DA A ;BCD码调整 MOV 45H,A RET

TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H ;字段码表。\"0\"~\"6\" DB 0F8H,80H,90H,88H,83H,0C6H,0A1H ;\"7\"~\"9\",\"A\"~\"D\" DB 86H,8EH,0BFH,00H,0FFH,0F6H ;\"E\全亮,空格,\"=\"

/*时钟设定子程序*/

KEY_A:JB 23H.1,SZ ;在响铃时按下时钟设定键无效; MOV A,64H ;获取键值 MOV R1,#20H

CJNE A,#10H,SE ;无按键按下,不等则跳转SE,放开后才 有效

SETB 21H.2 ;无按键按下标志位置位,置1无按键按下,为0有按下 SE:CJNE A,#0AH,SD ;判断是否按下时钟设定键,否则跳转SD, CJNE @R1,#00H,SD ;判断是否在00H进程

SETB 21H.3 ;时钟设定标志位置位,为1是设置开始

SD:JNB 21H.3,SZ ;标志位置位则向下执行,为0不设置,退出 SJMP S00 SZ:LJMP SC

S00:CJNE @R1,#00H,S10 ;判断进程码是否为00H

MOV 20H,#10H ;进程码置10H,开始设置小时十位 S10:CJNE @R1,#10H,S11 ;判断进程码是否为10H ANL 21H,#0FH

SETB 21H.7 ;小时数十位位闪并屏蔽无关位 CJNE A,#3,S1 ;判断是否键值小于3 S1:JNC SZ

SETB 21H.0 ;拆字标志位置位(不拆字),为0拆 JNB 21H.2,SZ ;键放开后赋值,0为有按下 MOV 34H,A ;键值给小时十位

MOV 44H,34H ;键值给中间记忆单元,44H,保存小时的十位 CLR 21H.2 ;无按键按下标志位清零

MOV 20H,#11H ;进程码置11H,开始设置小时个位 SJMP SC

S11:CJNE @R1,#11H,S12 ;判断进程码是否为11H ANL 21H,#0FH ;高四位清零

SETB 21H.6 ;小时数个位置1位闪并屏蔽无关位

30

《微机原理及接口技术》课程设计

MOV R1,#44H

CJNE @R1,#2,S5 ;判断小时数十位是否为2,否则个位无限制,s5 CJNE A,#3,S2 ;小时数十位是为2限输0~3,否则s2 S5:CJNE A,#10,S2 ;小时数十位是为0、1无限制 S2:JNC SC

JNB 21H.2,SC ;键放开后赋值 MOV 33H,A ;键值给小时个位

MOV 43H,33H ;键值给中间记忆单元,43H,保存小时个位 CLR 21H.2 ;无按键按下标志位清零

MOV 20H,#12H ; SJMP SC

S12:CJNE @R1,#12H,S13 ; ANL 21H,#0FH

SETB 21H.5 ; CJNE A,#6,S3 ; S3:JNC SC

JNB 21H.2,SC ; MOV 31H,A ; MOV 42H,31H ; CLR 21H.2 ; MOV 20H,#13H ; SJMP SC

S13:CJNE @R1,#13H,S10 ; ANL 21H,#0FH SETB 21H.4 ; CJNE A,#10,S4 S4:JNC SC

JNB 21H.2,SC ; MOV 30H,A ; MOV 41H,30H ; CLR 21H.2 ; MOV 20H,#10H ; SC:RET

/*闹钟设定子程序*/

KEY_B:JB 23H.1,NC ; MOV A,64H ; MOV R0,#20H

CJNE A,#10H,NF ; SETB 21H.2 ; NF:CJNE A,#0BH,NE1 ;钟设定

CJNE @R0,#00H,NE1 ;

进程码置12H,开始设置分钟十位 判断进程码是否为12H 分钟数十位位闪并屏蔽无关位 分钟数限输0~5 键放开后赋值 键值给分钟数十位 键值给中间记忆单元 无按键按下标志位清零 进程码置13H 判断进程码是否为13H ;高四位清零

分钟数个位置1位闪并屏蔽无关位 键放开后赋值 键值给分钟数个位 键值给中间记忆单元 无按键按下标志位清零 进程码置10H,恢复 在响铃时按下闹钟设定键无效;23H.1, 获取键值 无按键按下,否则跳转NF,放开后有效

无按键按下标志位置位,无按键按下为1有效

判断是否按下闹钟设定键,否则跳转NE1,0B为k11即闹判断是否在00H进程

31

《微机原理及接口技术》课程设计

SETB 21H.1 ;闹钟设定标志位置位,为1则开始设置 NE1:JNB 21H.1,NC ;标志位置1有效则开始设置闹钟 SJMP N00 NC:LJMP NA

N00:CJNE @R0,#00H,N20 ;判断进程码是否为00H

MOV 20H,#20H ;进程码置20H,开始设置小时十位 N20:CJNE @R0,#20H,N21

ANL 21H,#0FH ;高四位清零

SETB 21H.7 ;小时数十位置1位闪并屏蔽无关位 CJNE A,#3,N1 ; N1:JNC NC

JNB 21H.2,NC ; MOV 34H,A ; MOV 44H,34H ; CLR 21H.2 ; MOV 20H,#21H ; SJMP NA

N21:CJNE @R1,#21H,N22 ; ANL 21H,#0FH

SETB 21H.6 ; MOV R1,#44H

CJNE @R1,#2,N5 ; CJNE A,#3,N2 ; N5:CJNE A,#10,N2 N2:JNC NA

JNB 21H.2,NA ; MOV 33H,A ; MOV 43H,33H ; CLR 21H.2 ; MOV 20H,#22H ; SJMP NA

N22:CJNE @R1,#22H,N23 ; ANL 21H,#0FH

SETB 21H.5 ; CJNE A,#6,N3 ; N3:JNC NA

JNB 21H.2,NA ; MOV 31H,A ; MOV 42H,31H ; CLR 21H.2 ; MOV 20H,#23H ; SJMP NA

N23:CJNE @R1,#23H,N00 ; ANL 21H,#0FH

判断是否键值小于3 键放开后赋值 键值给小时十位,

键值给中间记忆单元,44H,保存小时十位 无按键按下标志位清零,即有按下 进程码置21H,开始设置小时个位 判断进程码是否为21H 小时数个位位闪并屏蔽无关位 判断小时数十位是否为2 小时数十位是为2限输0~3 键放开后赋值 键值给小时个位

键值给中间记忆单元,43H,保存小时个位 无按键按下标志位清零

进程码置22H,开始设置分钟十位 判断进程码是否为22H 分钟数十位位闪并屏蔽无关位 分钟数限输0~5 键放开后赋值 键值给分钟数十位

键值给中间记忆单元,42H,保存分钟十位 无按键按下标志位清零

进程码置23H,开始设置分钟个位 判断进程码是否为23H 32

《微机原理及接口技术》课程设计

SETB 21H.4 ;分钟数个位位闪并屏蔽无关位 CJNE A,#10,N4 N4:JNC NA

JNB 21H.2,NA ;键放开后赋值 CLR 21H.2

MOV 30H,A ;键值给中间记忆单元,41H,保存分钟个位 MOV 41H,30H ANL 21H,#0FH

MOV 20H,#20H ;进程码置20H,恢复 NA:RET

/*整点报时音闹钟模式设定子程序*/

KEY_C:JB 23H.1,MA ;在响铃时按下时钟设定键无效;23H.1 MOV A,64H ;获取键值 MOV R0,#20H

CJNE A,#10H,MS ;无按键按下,按下放开才有效 SETB 21H.2 ;无按键按下标志位置位

MS:CJNE A,#0CH,MN ;判断是否按下模式设定键,0C为k12,即模式设定 CJNE @R0,#00H,MN ;判断是否在00H进程

SETB 23H.0 ;模式设定标志位置位,为1则开始设置 MN:JNB 23H.0,MA ;标志位置位则向下执行 M00:CJNE @R0,#00H,M30 ;判断进程码是否为00H

MOV 20H,#30H ;进程码置30H,开始设置整点报时 M30:CJNE @R0,#30H,M31 ;判断进程码是否为30H,否则跳转M31 ANL 21H,#0FH ;高四位清零

SETB 21H.7 ;整点报时位位闪并屏蔽无关位,置1才闪 CJNE A,#00H,M1 ;判断是否键值等于0,整点不报时 SJMP M13

M1:CJNE A,#01H,M12 ;判断是否键值等于1,整点短声 SJMP M13

M12:CJNE A,#06H,MA ;判断是否键值等于6,连续响6声 M13:JNB 21H.2,MA ;键放开后赋值 MOV 34H,A ;键值给整点模式

MOV 44H,34H ;键值给中间记忆单元,44H,保存 CLR 21H.2 ;无按键按下标志位清零

MOV 20H,#31H ;进程码置31H,开始设置闹钟模式 SJMP MA

M31:CJNE @R1,#31H,M30 ;判断进程码是否为31H,否则跳转M30 ANL 21H,#0FH

SETB 21H.4 ;闹钟模式位位闪并屏蔽无关位 CJNE A,#3,M4 ;判断是否键值小于3

M4:JNC MA ;判断是否借位标志,有借位继续,无则退出 JNB 21H.2,MA ;键放开后赋值

33

《微机原理及接口技术》课程设计

MOV 30H,A ;键值给闹钟模式单元 MOV 41H,30H ;键值给中间记忆单元 ANL 21H,#0FH

SETB 21H.7 ;整点报时位位闪并屏蔽无关位 CLR 21H.2 ;无按键按下标志位清零 MOV 20H,#30H ;进程码置30H,恢复 MA:RET

/*时钟设定。闹钟设定和模式设定确定、取消、退格子程序*/

BC:JNB 21H.3,BD ;时钟设定,21H.3为时钟设定标志 JNB 21H.2,BD ;21H.2为是否有按键按下标志 MOV A,64H ;取键值

CJNE A,#0EH,B1 ;时钟设定,k13为取消 MOV 20H,#00H ;返回初始状态,即不设定 MOV 21H,#00H ;返回初始状态

B1:CJNE A,#0FH,BA ;时钟设定 ,k14退格

MOV R1,#20H ;10H进程则在第一位,退格无效 CJNE @R1,#10H,B2 ;否则跳转B2 SJMP BD ;是则退出 B2:DEC 20H ;不在10进程则进程码减1 CLR 21H.2 ;清零

BA:CJNE A,#0DH,BD ;时钟设定 确认 MOV A,44H ;小时数小于24则拼字赋值 SWAP A ORL A,43H

CJNE A,#24H,BX ;判断是否大于24小时

BX:JNC BD ;小于24则向c借位,有借位为1,无则为0退出 MOV 3CH,A ;分钟数拼字并赋值 MOV A,42H SWAP A ORL A,41H MOV 3BH,A

MOV 3AH,#00H ;秒清零 MOV 20H,#00H ;进程码返回00H MOV 21H,#00H

BD:JNB 21H.1,BB JNB 21H.2,BB MOV A,64H

CJNE A,#0EH,BE ;闹钟设定 取消 MOV 20H,#00H ;进程码返回00H MOV 21H,#00H

BE:CJNE A,#0FH,BF ;闹钟设定 退格

34

《微机原理及接口技术》课程设计

MOV R1,#20H CJNE @R1,#20H,BG SJMP BB BG:DEC 20H CLR 21H.2

BF:CJNE A,#0DH,BB ;闹钟设定保存 MOV A,44H SWAP A ORL A,43H

CJNE A,#24H,BXX BXX:JNC BB MOV 25H,A

MOV A,42H SWAP A ORL A,41H MOV 26H,A MOV 20H,#00H ;进程码返回00H MOV 21H,#00H

BB:JNB 23H.0,B8 ;模式设定 取消 JNB 21H.2,B8 MOV A,64H

CJNE A,#0EH,B5 MOV 20H,#00H MOV 21H,#00H CLR 23H.0

B5:CJNE A,#0FH,B6 ;模式设定 退格 MOV R1,#20H CJNE @R1,#30H,B7 SJMP B8 B7:DEC 20H CLR 21H.2

B6:CJNE A,#0DH,B8 ;模式设定保存 MOV 28H,44H MOV 27H,41H

MOV 20H,#00H ;进程码返回00H MOV 21H,#00H CLR 23H.0 B8:RET

/*按键音子程序*/

AJY:MOV A,64H ;按键按下的键号存入64 CJNE A,#10H,J1 ;判断是否有键按下 CLR 2FH.4 ;是

35

《微机原理及接口技术》课程设计

SJMP J2

J1:SETB 2FH.4 ;不是 J2:MOV R1,#2EH MOV R0,#2FH CJNE @R0,#00H,AJ CJNE @R1,#00H,AJ

SETB P3.2 ;开启蜂鸣器,短暂按键音 SJMP JS

AJ:CLR P3.2 ;关闭蜂鸣器 JS:RET

/*时钟设定位闪子程序*/

SHAN:MOV A,39H ;取39H单元(1/100秒)内容 MOV B,#25

DIV AB ;两数相除 JB ACC.0,AN ;为1跳转 JNB 21H.7,A1

MOV 34H,#12H ;时钟的十位灭掉 A1:JNB 21H.6,A2

MOV 33H,#12H ; 时钟的个位灭掉 A2:JNB 21H.5,A3

MOV 31H,#12H ; 分钟的十位灭掉 A3:JNB 21H.4,AN

MOV 30H,#12H ;分钟的个位灭掉 AN:RET

/*整点报时模式设定*/

ED:MOV A,20H ;读取进程码

CJNE A,#00H,EDS ;读取整点报时模式 MOV R1,#28H

CJNE @R1,#00H,E1 ;模式0为关闭

E1:CJNE @R1,#01H,E2 ;模式1为一声短促报时

MOV A,3BH ;检验分钟是否为0,不为0则跳出 JNZ EDS ;累加器为非0转移 MOV A,3AH ;检验秒是否为0,为0则蜂鸣器响, JNZ EDD SETB 2EH.0 SJMP E2

EDD:MOV 3DH,3AH ;01秒关闭蜂鸣器 DJNZ 3DH,EDS CLR 2EH.0 SJMP E2

36

《微机原理及接口技术》课程设计

EDS:LJMP EDR

E2:CJNE @R1,#06H,EDS ;模式6,从55秒开始连续6声报时 MOV A,22H ; 55,读取整点报时进程码 CJNE A,#00H,EE MOV 22H,#01H EE:CJNE A,#01H,EE1

MOV A,3BH ;若不是59分则跳出 CJNE A,#59H,EDS MOV R0,#3AH CJNE @R0,#55H,EDS MOV A,39H MOV B,#50 DIV AB

JB ACC.0,E11 ; SETB 2EH.1

E11:JNB ACC.0,E12 ; CLR 2EH.1 MOV 22H,#02H E12:SJMP EDS

EE1:MOV A,22H ;56 CJNE A,#02H,EE2 MOV A,3BH ; CJNE A,#59H,EDS MOV R1,#3AH CJNE @R1,#56H,EDS MOV A,39H MOV B,#50 DIV AB

JB ACC.0,E21 SETB 2EH.2 E21:JNB ACC.0,E22 CLR 2EH.2 MOV 22H,#03H E22:SJMP EDS

EE2:MOV A,22H ;57

CJNE A,#03H,EE3 ; MOV A,3BH CJNE A,#59H,EDS MOV R1,#3AH CJNE @R1,#57H,EDR MOV A,39H MOV B,#50 DIV AB

JB ACC.0,E31

;55秒时,蜂鸣器1赫兹频率响 ;39H为10ms计数单元,则可得1赫兹 直接寻址位为1转移 直接寻址位为0转移 若不是59分则跳出 ;56秒时,蜂鸣器1赫兹频率响 若不是59分则跳出 ;57秒时,蜂鸣器1赫兹频率响 37

《微机原理及接口技术》课程设计

SETB 2EH.3 E31:JNB ACC.0,E32 CLR 2EH.3 MOV 22H,#04H E32:SJMP EDR

EE3:MOV A,22H ;58 CJNE A,#04H,EE4 MOV A,3BH CJNE A,#59H,EDR MOV R1,#3AH CJNE @R1,#58H,EDR MOV A,39H MOV B,#50 DIV AB

JB ACC.0,E41 SETB 2EH.4 E41:JNB ACC.0,E42 CLR 2EH.4 MOV 22H,#05H E42:SJMP EDR

EE4:MOV A,22H ;59 CJNE A,#05H,EE5 MOV A,3BH CJNE A,#59H,EDR MOV R1,#3AH CJNE @R1,#59H,EDR MOV A,39H MOV B,#50 DIV AB

JB ACC.0,E51 SETB 2EH.5 E51:JNB ACC.0,E52 CLR 2EH.5 MOV 22H,#06H E52:SJMP EDR

EE5:MOV A,22H ;00 CJNE A,#06H,EDR MOV A,3BH CJNE A,#00H,EDR MOV R1,#3AH CJNE @R1,#00H,E61 SETB 2EH.6 SJMP EDR E61:CLR 2EH.6

;若不是59分则跳出 ;58秒时,蜂鸣器1赫兹频率响 若不是59分则跳出 ;59秒时,蜂鸣器1赫兹频率响 ;分钟不为0则跳出 ;0秒时关闭蜂鸣器,进程码返回初始值 38

; 《微机原理及接口技术》课程设计

MOV 22H,#00H EDR:RET

/*闹钟模式响铃方式子程序*/ NZ:MOV A,20H

CJNE A,#00H,ZNR MOV A,25H ;读取闹钟小时数

CJNE A,3CH,NZZ ;是否与实时钟小时相等,不等则跳转判断是否响铃 MOV A,26H ; MOV R1,#3AH ; MOV R0,#39H ; CJNE A,3BH,NZZ ; CJNE @R1,#00H,NZZ ; CJNE @R0,#10,NZ1 NZ1:JNC NZZ SETB 23H.1 NZZ:JNB 23H.1,ZNR ; ZN1:MOV A,27H ; CJNE A,#00H,ZN2

CLR 23H.1 ; ZN2:CJNE A,#01H,ZN3 ; LCALL DDD ; MOV A,64H ; CJNE A,#0EH,ZN21 ; SJMP ZN22 ; ZN21:DJNZ 2AH,ZN3 MOV 2AH,#15 DJNZ 2BH,ZN3 MOV 2BH,#100 ZN22:CLR 23H.1

MOV 2FH,#00H LJMP ZNR ZN3:MOV A,27H CJNE A,#02H,ZNR LCALL DDD LCALL JTZ ZNR:RET

/*闹钟响铃子程序*/ DDD:JNB 23H.1,DDR MOV A,24H ; CJNE A,#00H,DD1

读取闹钟分钟数 读取秒钟 读取10ms

是否与实时钟分钟相等,不等则跳转判断是否正在响铃是否与实时钟秒钟相等,不等则跳转判断是否正在响铃;1ms内判断是否正在响铃 促发响铃

判断是否正在响铃

闹钟模式0,为关闭闹钟 关闭闹钟铃声

闹钟模式1,为常规闹铃 响铃30s 读取键值

是否按下取消键,否则响铃30s

按下取消键则关闭铃声并恢复初始状态 ;闹钟模式2,为解题闹钟 ;闹钟响铃时设定功能键无效 读取闹铃进程码 39

; 《微机原理及接口技术》课程设计

DJNZ 52H,DDR MOV 52H,#10 MOV 24H,#01H SETB 2FH.0 SJMP DDR

DD1:CJNE A,#01H,DD2 DJNZ 52H,DDR MOV 52H,#10 MOV 24H,#02H CLR 2FH.0 SJMP DDR

DD2:CJNE A,#02H,DD3 DJNZ 52H,DDR MOV 52H,#10 MOV 24H,#03H SETB 2FH.1 SJMP DDR

DD3:CJNE A,#03H,DD4 DJNZ 52H,DDR MOV 52H,#10 MOV 24H,#04H CLR 2FH.1 SJMP DDR

DD4:CJNE A,#04H,DD5 DJNZ 52H,DDR MOV 52H,#10 MOV 24H,#05H SETB 2FH.2 SJMP DDR

DD5:CJNE A,#05H,DDR DJNZ 52H,DDR MOV 52H,#40 MOV 24H,#00H CLR 2FH.2 DDR:RET

/*解题闹钟生成子程序*/ JTZ:JB 21H.0,JT4 SETB 21H.0 ; CLR 23H.6 MOV A,45H ; ANL A,#0F0H ; SWAP A ;

题目是否产生,为1跳转产生题目 不为1则置1 ;解题闹钟是否拆字,解题不拆字 读取随机数 获取高四位 交换高低四位

40

; 《微机原理及接口技术》课程设计

MOV 46H,A ;保存高四位 MOV A,45H ANL A,#0FH ;获取低四位 MOV 47H,A CJNE A,46H,JT ;比较十位个位

JT:JNC JT2 ;判断借位标志,有借位则为1,否则跳转 MOV 34H,46H ;较大数 MOV 33H,#10H ;减号 MOV 32H,47H ;较小数 SJMP JT3

JT2:MOV 34H,47H ; MOV 33H,#10H

MOV 32H,46H ; JT3:MOV 37H,#12H MOV 36H,#12H MOV 35H,#12H MOV 31H,#13H MOV 30H,#00H

MOV 44H,34H ; MOV 43H,33H MOV 42H,31H MOV 41H,30H

MOV A,34H ; CLR C SUBB A,32H

MOV 48H,A ; JT4:SETB 21H.4 ; MOV A,64H ; CJNE A,#10,JJ1 JJ1:JNC JJ2 MOV 30H,A

MOV 41H,30H ; JJ2:MOV A,64H

CJNE A,#0DH,JJR ; MOV A,41H

CJNE A,48H,JJR ; SJMP ZNR1 ; JJR:DJNZ 2AH,JJ3 ; MOV 2AH,#200 DJNZ 2BH,JJ3 MOV 2BH,#150

ZNR1:CLR 21H.0 ;始状态

CLR 23H.1

较小数 较大数 ;关闭暂时不用的数码管位 保存此次题目 计算题目 保存题目结果

产生题目后,最后一位闪烁 读取键值,判断是否按下 显示所按键值并保存到41H 按确定并比较正确答案 若答案错误则响铃5分钟 若答案正确则关闭响铃

响300秒即5分钟,并跳转判断是否换题 响铃5分钟或答案正确则关闭闪烁,并恢复初41

《微机原理及接口技术》课程设计

CLR 21H.4 MOV 2FH,#00H MOV P1,#0FFH

JJ3:MOV A,64H ;读取键值

CJNE A,#0EH,JJRR ;若按下取消键,则换题 CLR 21H.0 SETB 23H.6 JJRR:RET

/*键盘扫描子程序*/

KEY:MOV DPTR,#0FEFFH ;键盘扫描子程序(反转法)。 MOV A,#81H MOVX @DPTR,A ;C口先初始化为高4位输出方式驱键行线、低4位输入方式键列线 MOV DPTR,#0FEFCH MOV A,#0FFH MOVX @DPTR,A

MOV DPTR,#0FEFEH ;DPTR指向C口 MOV A,#00H

MOVX @DPTR,A ;键盘行线(高4位)输出驱动全'0'

MOVX A,@DPTR ;输入键盘列线电平(低4位)存60H单元 MOV 60H,A

MOV DPTR,#0FEFFH MOV A,#88H MOVX @DPTR,A ;C口改初始化为高4位输入驱键行线、低4位输出驱键列线 MOV DPTR,#0FEFCH MOV A,#0FFH MOVX @DPTR,A

MOV DPTR,#0FEFEH ;DPTR指向C口 MOV A,#00H

MOVX @DPTR,A ;键盘列线(低4位)输出驱动全'0' MOVX A,@DPTR ;输入键盘行线电平(高4位)在A中 ANL 60H,#0FH ;保留列线电平值所在的低4位 ANL A,#0F0H ;保留行线电平值所在的高4位 ORL 60H,A ;将列线电平值、行线电平值组合成8位行列码于60H单元中 MOV 61H,#00H ;键号值从00H开始

MOV R5,#10H ;设定最多进行16次的键码查表 MOV DPTR,#KEY_N ;DPTR指向键码表首地址 KY:MOV A,61H ;置当前键号于A中

MOVC A,@A+DPTR ;查表读取键码表中当前键号对应位置的键码 CJNE A,60H,NK ;与8位行列码比较,不同则转NK查下一个

SJMP NKR ;相同,表明查到了当前按下的键号,转KN进行键功能处理 KEY_N:DB 7EH,0EEH,0EDH,0EBH ;键码表。K12,K0, K1, K2键码 DB 0DEH,0DDH,0DBH,0BEH ;K4, K5, K6, K8键码

42

《微机原理及接口技术》课程设计

DB 0BDH,0BBH,0E7H,0D7H ;K9, K10,K3, K7键码 DB 0B7H,77H,7DH,7BH ;K11,K15,K13,K14键码 NK:INC 61H ;键号值加1 DJNZ R5,KY ;未查完键值表则继续

NKR:RET ;查完,说明无按键或出现异常行列码,结束并返回

/*按键消抖子程序*/

XDAJ:MOV 65H,64H ;将新得到的键号存入旧的键号

MOV 4DH,4CH MOV 4CH,4BH MOV 4BH,4AH

MOV 4AH,49H MOV A,61H MOV 49H,A MOV A,4DH

CJNE A,4CH,XD CJNE A,4BH,XD CJNE A,4AH,XD

CJNE A,49H,XD MOV 64H,A XD:RET

/*30秒无操作退出*/

TU:MOV A,20H CJNE A,#00H,TA TC:MOV 3EH,#00H ; MOV 3FH,#00H SJMP TB

TA:MOV R1,#65H CJNE @R1,#10H,TC

MOV R0,#64H CJNE @R0,#10H,TB

INC 3EH MOV A,3EH

;CJNE A,#40,TB ;15S! CJNE A,#80,TB ;30S INC 3FH MOV A,3FH

;CJNE A,#7,TB ;15S! CJNE A,#7,TB ;30S MOV 20H,#00H MOV 21H,#00H

;将前4次得到的电平值推送至4AH-4DH单元中 ;获得键号并存为新态键号 ;比较5次得到的电平值 ;若电平值不一致则新态不变 ;若电平值一致则存为新态键号 指向20H进程码单元

;判断20H进程码单元是否是00进程

在计时30S无操作退出期间若有按键再次按下则清零 ;指向旧键号(20H进程码单元不是00进程) ;旧键号为不按下,指向新键号 ;新建号为无按下则开始计时30秒后返回常规显示 43

; 《微机原理及接口技术》课程设计

CLR 23H.0 TB:RET

D1MS:MOV R7,#115 ;软件延时1mS子程序

D1MS1:NOP ;(1+8*115+2)*12/11059.2=1.0015mS NOP NOP NOP NOP NOP

DJNZ R7,D1MS1 RET

IT1P:PUSH ACC ; PUSH PSW

DJNZ 40H,DONE ; MOV 40H,#18 MOV A,39H

ADD A,#1 ; DA A ;200uS MOV 39H,A ; CJNE A,#00,DONE ; MOV 39H,#0 ;10mS MOV A,3AH ; ADD A,#1 DA A

MOV 3AH,A

CJNE A,#60H,DONE ; MOV 3AH,#0 ; MOV A,3BH ; ADD A,#1 DA A

MOV 3BH,A

CJNE A,#60H,DONE ; MOV 3BH,#0 ; MOV A,3CH ; ADD A,#1 DA A

MOV 3CH,A

CJNE A,#24H,DONE ; MOV 3CH,#0 ; DONE:POP PSW ; POP ACC

定时器1服务子程序。保护现场 每200uS加1 满10mS?

计数单元清0 每10mS加1 满1S?

计数单元清0

秒单元(按BCD码)加1 满1分钟? 秒单元清零

分钟单元(按BCD码)加1 满1小时? 分钟单元清零

小时单元(按BCD码)加1 满24小时? 小时单元清零 恢复现场 44

《微机原理及接口技术》课程设计

RETI ;中断返回

D1S:MOV R7,#8 ;软件延时1S子程序 D1S2:MOV R6,#200 ;(1+(1+(1+3*200+2)*200+2)*8+4)*12/11059200HZ=1.047S D1S1:MOV R5,#200 D1S0:NOP

DJNZ R5,D1S0 DJNZ R6,D1S1 DJNZ R7,D1S2 RET

D40MS:MOV R6,#80 D30MS1:MOV R5,#200 ;[1+(1+3*200+2)*61+4]*12/11059.2KHZ=39.9mS D30MS0:NOP

DJNZ R5,D30MS0 DJNZ R6,D30MS1 RET

END

;软件延时40mS子程序

45

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- awee.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务