摘要
数字闹钟
1、通过 8253 定时器产生秒脉冲定时中断。在中断服务程序中实现秒、分、
小时的进位(24 小时制)。
2、将当前时分秒在七段 LED 显示器上显示(如:091132)。
3、可设置闹钟的时间当前值(对准时间),设置闹铃时间,闹铃功能的关闭和
开放.
关键词:数字闹钟,8253 定时器,LED 显示器,8255A 并行口
目 录
1.实验线路................................................................................................................... 1
2.设计思想................................................................................................................... 2
3.功能流程图............................................................................................................... 4
4.结果讨论................................................................................................................... 7
5.源程序以及注释....................................................................................................... 8
参考文献..................................................................................................................... 25
- 1 -
1.实验线路
实验线路如图 1 所示。
图 1 实验线路图
1
2.设计思想
一、概述:
程序主体设计:本程序共有分端口设置模块,计数模块,显示模块等几个模
块。
C--DISPLAY 12, 45, 37 ----将闹钟设置为 12:45: 37;
G--GO AHEAD----开中断,闹钟恢复走时
D--STOP TO DISPLAY-----关中断,闹钟停止走时
E--EXIT TO DOS----返回 DOS
M--SET THE CLOCK -----设置闹铃时间
F--OPEN THE CLOCK-----设置闹钟功能为开
B--CLOSE THE CLOCK-----设置闹钟功能为关
P--POSITION THE BENINNING DATE------设置闹钟的时间
二、计时器软件的设计:
主程序中,要对各个用到的芯片进行初始化,目的是使其每 20 豪秒产生一
次方波。8253A 的定时器输出与 8259A 的 IR2 连接,计数器 0 工作在模式 3(方
波发生器),计数值采用二进制格式,输出作为计数器 1 的输入, 计数器 1 工作在模
式2(分频器),计数值采用二进制格式,输出到总线IRQ2,向 CPU 发送时钟中断信号,
根据两个计数器的设置,系统每隔 20 毫秒便由 8253A 产生一次中断请求,即每
隔 20 豪秒执行一次中断处理程序。这个方法将与时间相关的两个模块即显示模
块和计时模块放在中断处理程序中,这样,就保证了数字显示的稳定,中断处理
程序完成计时功能要依靠两个方面,因为中断处理程序是每 20 豪秒执行一次,
但计时并不是以 20 豪秒为单位进行的,而是以秒为单位进行的,所以,计时功
能的实现一方面要利用 20 毫秒这个基准时间单位,另一方面借助一个计数单位。
计数单位的初始值为 50,每进行一次中断,便使计数单元的内容减 1。每当计数
单元从 50 减为 0 时,说明已经过了 1 秒时间。并判断是否有进位,如有则进行
修改,实现进位。并在 LED 上显示。
2
显示部分:
本程序显示部分用了 6 个共阴极 LED 作为显示管,显示程序要做到每送一
次段码就送一次位码,每送一次位码后,将位码中的 0 右移 1 位作为下次的位码,
从而可以实现从左到右使 6 个 LED 依次显示出相应的数字。虽然 CPU 每隔一定
时间便执行显示程序,但只要这个时间段不太长,由于人眼的视觉作用,就可以
在 6 个 LED 上同时见到数字显示。
程序中,用 8255A 的 PA 口作为输出,输出扫描信号,PB 口作为输入,读
进列值。
本程序用行扫描法来识别键盘的闭合键。先使第 0 行接地,其余行为高电平,
然后看第 0 行是否有键闭合,这是通过检查列线电位来实现的,即在第 0 行接地
时看是否有哪条列线变成低电平。如果有某条列线变为低电平,则表示第 0 行和
此列线位置上的键被按下如果没有,则说明第 0 行上没有键被按下。此后,再将
第 1 行接地,然后检测列线中是否有变为低电平的线。如此往下逐行扫描,直到
最后一行。为消除键的抖动,所以调用延迟程序,然后再判断具体按下的到底是
哪个键,如果得到的是 FFH,则程序在循环中等待。
计数部分:见流程图
时间设定模块
对于输入的检测,若超出范围,则对其置 F------,
3
3.功能流程图
一、程序主流程控制图(如图 2 所示)
C 键?
G 键?
D 键?
P 键?
M 键?
F 键?
B 键?
E 键?
N
N
N
N
N
N
N
N
Y
Y
Y
Y
Y
Y
Y
Y
显示初始化时间
开始计时
停止计时
设置时间
设置闹铃
开启闹铃
关闭闹铃
退出回到 DOS
图 2 程序主流程控制图
4
二、中断服务子程序流程图(如图 3 所示)
中断进入
收到 50 次中断?
计数值减一(初值为 50)
Y
N
进位处理部分
闹铃开?
Y
Y
闹铃时间到?
响铃
N
退出中断服务
图 3 中断服务子程序流程图
图
5
三、进位处理部分流程图(如图 4 所示)
秒加 1
分钟加 1
小时加 1
开始
N
秒钟是否到 59
(此部分的转换
从略)
Y
秒十位和各位赋值为 0 0
N
N
分钟是否到 59
(此部分的转换
从略)
Y
Y
分钟十位和各位赋值为 0 0
分钟是否到 23
(此部分的转换
从略)
小时十位和各位赋值为 0 0
闹铃判断响铃部分
图 4 进位处理部分流程图
6