汇编语言与微机接口课程设计-多功能电子钟

写在前面

视频:

https://www.bilibili.com/video/BV1634y1r7xS/

一、课程设计目的

掌握综合使用基本输入输出设备、通用接口芯片、专用接口芯片的方法;
掌握实时处理程序的编制和调试方法。

二、设计内容及具体要求

设计一个定时显示装置,用实验仪的八个LED数码管显示时间,时间显示格式为24小时制,如14-35-45。具体完成如下几个功能:
1)通过键盘设置时间。
2)整点报时功能。分秒值为59分55秒时开始报时,每秒钟蜂鸣器鸣叫一声,到整点报时停止。
3)设置闹钟功能。闹钟时间到,蜂鸣器开始鸣叫,鸣叫时间最长半分钟。可通过按键停止蜂鸣。
在这里插入图片描述
键盘控制时钟的启停和时间的设置,键的定义参见上图。
F键(启停键)—— 程序启动后,按下该键时钟启动;再次按下该键,暂停计时,显示当前时间。
C键(设置键)—— 按下C键后,为时钟设置时、分、秒初始值。
D键(设置键)—— 按下D键后,设置闹钟的时、分初始值。
E键(闹钟控制键)——闹钟响的时候,按下该键,闹钟停止。

三、所需实验器件

使用星研实验箱,8255系列模块、8253模块、8259模块、小键盘、数码管、蜂鸣器。

四、设计的方案及电路原理图

设计总体方案

利用 8255 8255 8255控制小键盘、数码管。值得说明的是,在本设计方案中,为了输出某个频率的声波波形并进行整点报时,使用的是 8255 8255 8255 P C 4 PC_4 PC4 P C 5 PC_5 PC5端口与软件程序连接进行控制,而非用 8253 8253 8253控制。
利用 8253 8253 8253控制计时,每秒产生一个 1 s 1s 1s的中断信号。该中断信号送入 8259 8259 8259,并由 8259 8259 8259进行中断服务子程序,进行计时,并对时间进行计算。
在给出电路原理图之前,需说明各个芯片的作用与分工。
8255 8255 8255各端口分工: 8255 8255 8255 A A A端口工作在方式 0 0 0输出,控制数码管的段码。 8255 8255 8255 B B B端口工作在方式 0 0 0输出,不仅控制数码管的位码,而且控制键盘列线的扫描。 8255 8255 8255 C C C端口低 4 4 4位工作在方式 0 0 0输入, P C 0 PC0 PC0 P C 1 PC1 PC1控制键盘第一、二行行值的读入。 P C 4 PC4 PC4 P C 5 PC5 PC5控制蜂鸣器。本程序采用软件而非硬件对 8255 8255 8255进行控制。 8255 8255 8255端口号为 270 H   273 H 270H~273H 270H 273H
8259 8259 8259作用:接收来自 8253 8253 8253的中断请求, 8253 8253 8253每一秒计时都会中断一次,该中断由 8259 8259 8259统一控制。 8259 8259 8259为单片,边沿触发,单片方式,使用 I C W 4 ICW_4 ICW4。中断类型号 08 H 08H 08H。一般全嵌套、非缓冲、非自动结束中断。 8259 8259 8259 I R 0 IR_0 IR0接收来自 8253 8253 8253的中断。 8259 8259 8259端口号 250 H   251 H 250H~251H 250H 251H
8253 8253 8253用于计时与控制蜂鸣器。 8253 8253 8253 0 0 0口用于计时,给 8259 8259 8259发出计时中断。工作在方式 2 2 2,计数值 31250 / 1 = 31250 31250/1=31250 31250/1=31250 8253 8253 8253 1 1 1口用于控制整点报时的蜂鸣器,工作在方式 3 3 3,计数值 31250 / 500 = 62 31250/500=62 31250/500=62

硬件连线方案

D 3 D_3 D3 8255 8255 8255 C S ‾ \overline {CS} CS A 0 A_0 A0 A 1 A_1 A1连接A3区系统 C S ‾ \overline {CS} CS A 0 A_0 A0 A 1 A_1 A1 D 3 D_3 D3 P C 0 PC_0 PC0 P C 1 PC_1 PC1连接 F 5 F_5 F5 K L 1 KL_1 KL1 K L 2 KL_2 KL2
D 3 D_3 D3 J P 20 ( P B 0 . . . P B 7 ) JP_{20}(PB_0...PB_7) JP20(PB0...PB7) 8255 A 8255A 8255A口)、 B = J P 16 ( S E G A . . S E G P ) B=JP_{16}({SEG_A..SEG_P}) B=JP16(SEGA..SEGP) 8255 B 8255B 8255B口)分别连接 F 5 F_5 F5 A = J P 37 A=JP_{37} A=JP37(键盘列线)、 B = J P 36 B=JP_{36} B=JP36(段码)、 C = J P 35 C=JP_{35} C=JP35(位码)。
D 3 D_3 D3 P C 4 PC_4 PC4 P C 5 PC_5 PC5连接 F 8 F_8 F8区蜂鸣器。
B 3 B_3 B3 8259 8259 8259的片选 C S ‾ \overline {CS} CS A 0 A_0 A0连接A3区系统 C S ‾ \overline {CS} CS A 0 A_0 A0
C 4 C_4 C4 8253 8253 8253的片选 C S ‾ \overline {CS} CS A 0 A_0 A0 A 1 A_1 A1连接 A 3 A_3 A3区系统 C S 2 ‾ \overline {CS_2} CS2 A 0 A_0 A0 A 1 A_1 A1 C 4 C_4 C4 G A T E GATE GATE连接 C 1 C_1 C1 V C C ( + 5 V ) VCC(+5V) VCC(+5V) C 4 C_4 C4 C L K 0 CLK_0 CLK0连接 B 2 B_2 B2 31250 H z 31250Hz 31250Hz频率。 O U T 0 OUT_0 OUT0连接 B 3 B_3 B3 8259 8259 8259 I R 0 IR_0 IR0
在这里插入图片描述

五、软件的流程图

划分出软件设计模块,给出主程序和子程序的详细的设计流程图,并加以文字说明.

整体流程

在这里插入图片描述
主程序的总体流程如图所示。首先,对各个芯片进行初始化。也需要对内存进行初始化。初始化完成后,主程序循环地刷新数码管,并采用查询的方式判断是否有按键输入。若没有按键输入,则继续反复刷新数码管。若有按键输入,则判断该按键是哪个按键,根据按键的值处理该按键,调用后文涉及到的模块的子程序。在循环地刷新数码管与查询输入的过程中,接受时钟中断,进行计时。

数码管

在这里插入图片描述
数码管显示的过程如图所示。需要说明的是,数码管显示的流程与课本上讲解的大同小异,但仍然存在一定区别。星研开发环境中,位码端口多接了一个反相器,所以位码也是低有效。

键盘扫描

在这里插入图片描述

键盘读入过程如图所示。需要说明的是,由于在设计内存空间时,是直接将键盘量读入并按位置翻译成数码管的段码,所以需要调用一个子程序将数码管的段码翻译回数值。尽管键盘看起来是4行4列的,但是实质上是2行8列的。在细扫描读取的过程中,先控制列线在该位输出0,读该列的行值。若该列没有读取到0,则读取下一列。直到所有列都被读取完毕。

输入时间

在这里插入图片描述
此图为C键实现的设置时分秒功能流程:在设置时间的时分秒初始值时,先关中断,不进行计时。没设置的位被显示为横杠。在设置的过程中,可随时按键盘上的A键退出设置,此时,时钟的低位保持不变,时钟的高位为重新设置的值。在流程的每一步之间,都需要穿插适当延时。在“接受输入”的流程之前,都需要设置一定的延时。首先,从高到低,先设置小时。若小时的十位>=3,则输入不合法。需要重新输入。若小时的个位>=10或小时的十位>=2的情况下小时的个位>=4(即小时为24、25等值而不是20、21、22、23)等合法值,则需要重新输入小时的低位。接下来,设置分钟。若分钟的十位>=6,则输入不合法,重新输入。若分钟的个位>=10,则需要重新输入分钟的低位。同样的,需要设置秒钟。若秒钟的十位>=6,则输入不合法,需要重新输入。若秒钟的个位>=10,也需要重新输入秒钟的低位。在设置完时间后,按新设置的时间重新开始计时。

设置闹钟

在这里插入图片描述
此图为D键设置闹钟的流程,与C键实现的设置当前时分秒的流程是大同小异的。区别在于:D键不需要开关中断,因为后台仍然在计时。D键也不需要设置闹钟精确到秒。在设置闹钟时,调用到的内存区域也与C键不同,数码管显示的内容也不同。所以,调用的数码管显示的子程序也不同。在数码管显示时,只需显示前5位:小时十位、小时个位、横杠、分钟十位、分钟个位。剩余3位不显示。但是同样的,在流程的每一步,都需要设置延时。

关停闹钟

在这里插入图片描述
此图为E键关停闹钟的流程。闹钟是否响的控制由变量stopclock值控制。按E键只会对stopclock取反码。在计时的中断服务子程序中,读取该stopclock值以控制闹钟是否会响。

计时开关

在这里插入图片描述
此图为F键开启或关闭计时的流程。闹钟是否响的控制由stop变量控制。先对stop取反。若stop值为0FFH,则关中断,暂停计时。若stop值为0,则开中断,重新启动计时。

六、软硬件调试过程

调试过程:软硬件的调试过程并非是一帆风顺的。本人的在课程设计中的工作多与硬件相关。在调试硬件时,可以先点击“全速运行”检测本次编程是否成功。若测试时发现出现问题,则在相应的模块的子程序设置断点,在断点处添加寄存器观察窗与变量观察窗,对程序进行调试与debug。需要说明的是,硬件运行中出现的问题并非完完全全与程序有关,也有可能与硬件的刷新率有关。有些问题在断点调试的过程中不容易发现,例如数码管的“闪烁”现象与键盘读入过快等问题。这些问题与解决办法在下文中将会展开叙述。

出现问题1

当我们机械地照搬课本上对于数码管显示的汇编代码时,我们并没有在机箱上正确地实现预期的效果(每一位分别显示不同数字)。经过我们单步调试与研究,我们发现:在实验环境所用机箱上,由于内部自带一个反相器,所以数码管的段码与位码都是低电平有效的,与课本存在一定的区别。
解决方法:修改代码,位码全改成低电平有效。

出现问题2

数码管出现“闪烁”的现象。该现象有两种表现:某一位上某时会出现不应当出现的数字并很快熄灭。或每一秒数码管都会短暂熄灭。
解决方法:首先,对于每个子程序,都需要找到其入口参数与出口参数,分析其使用的寄存器,将寄存器入栈保护。因为闪烁现象的原因之一就是软件内存放段码与位码的内存区域被某一子程序越界访问。其次,在数码管每一位显示完毕后都得设置“适当延时”。若延时过短,则某一位点亮后被立即熄灭,在全速运行时体现为亮度不够。若延时过长,则也会导致闪烁的现象,在某一位置闪出了不该出现的数字。在调试过程中,需要经过反复测试,才能确定合适的延时。该延时约为5次空操作所需时间。
每一秒,数码管都会短暂熄灭。这是因为中断服务子程序过于长,系统需要非常长的时间执行该中断服务子程序,而没有时间执行数码管显示。解决办法也很简单:在中断服务子程序中,插入几次对显示数码管的调用。

出现问题3

使用跳转指令时,被提示跳转指令超出范围,编译不通过。
解决方法:尽管理论上段内直接转移的位移量为64KB(-32768~32767),但实际上,星研环境中段内直接转移位移量只能为8位(-128~127)。超过这个范围,就会编译不通过。因此,在汇编程序内需要控制程序先跳转到一个范围在(-128~127)的某个位置,再在那个位置跳转到程序真正需要到达的位置。

出现问题4

扫描键盘时,本应当一次只读入一位数字,但是按下按键时把多位数字全读入成该按键的值。
解决方法:在扫描键盘子程序内设置一定的延时。经测试,该延时约为65536次空操作所需的时间。

七、设计总结

系统已经实现的功能:

1.利用8个LED数码管显示时间,时间的格式为HH-MM-SS。利用C键设置时钟的时、分、秒初始值。利用F键控制时钟的启动与停止。
2.整点报时功能。在每小时的59分55秒开始报时,每秒蜂鸣器响一次,到00分00秒停止。
3.设置闹钟功能。闹钟时间到,蜂鸣器开始响。通过按键停止蜂鸣器。利用D键设置闹钟的时、分初始值。利用E键关停闹钟声音。

值得改进的地方与改进措施:

由于时钟展示程序直接沿用了之前实验课上的8255开关量输入功能,本程序可能会将某个数的段码、行列码、数值反复转化,引入了过多冗余的过程。同时,可能由于某些软件子程序过长,我们在按键盘开关量时轻按可能无效,需要用大力度按压按键。
改进措施:对代码进行整理与重新组织,进一步将各个模块分离。

有哪些创新方法

可以在闹钟与报时时产生音乐,而非只是产生正弦波。

八、课程设计的收获及心得体会

附录:源程序清单(包含关键的注释)

https://download.youkuaiyun.com/download/qq_46640863/81571620

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zombo_tany

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值