一、设计的目的要求
学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识
对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。
通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,
使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得
到全面提高。
该系统的要求利用 8253 定时器设计一个具有时、分、秒显示的电子时钟,
并定义一个启动键,当按下该键时时钟从当前设定值(可在显示缓冲区中予
置)开始走时。
二、系统的主要功能
该系统是一个简单的利用 8253 定时器、8255 可并行通信接口和中断控制
器 8259 设计的电子时钟系统,在该系统中设有一个启动键,启动键未按下时,
显示初始化界面“HELLO”;当按下启动键时,8253 定时器开始计时(8253
的初值为 10000,接 1MHz 的脉冲,即当 8253 计满 100 时正好是 1S),当计时
计满 100 时,8259 便产生一次中断,在 LED 显示器便显示系统预先设计好的初
始值“02.59.55”便开始从秒位开始加 1,当加到 10S 时,10s 位加 1,加到 60S
时分位加 1,同时秒位清零。
该系统主要接口部件有:可并行通信接口 8255 一片,计数器/定时器 8253
一片,中断控制器 8259 一片,七段 LED 数码管显示器 6 个以及译码电路等。
其中各个部件的初始化如下:
1、可并行通信接口 8255 的控制字是方式选择控制字,A 口工作在方式 0
(即基本输入输出方式)下,并且为输出状态,B 口工作在方式 0 下,为输出
口,C 口为输出口,其初始化为:
8255 控制口地址为 20bh
A 端口地址为 208h
B 端口地址为 209h
C 端口地址为 20ah
mov dx,20bh
mov al,10000001b
1
out dx,al
2、做为计数器的计数器/定时器 8253,在设置好计数初值(即定时常数)
后,便开始减 1 计数,为 0 时,输出一个信号;控制字设置:BCD 为设置为计
数值为二进制格式,模式选择为模式 2(即为分频器,当控制字写入后,输出
段 OUT 变为高电平作为初始状态,当计数初值写入初值寄存器后,下一个时钟
脉冲时,计数初值被写到计数执行部件,然后计数执行部件做减 1 计数,减到
1 时,输出端 OUT 变为低电平;完成一次计数过程后,输出端 OUT 又变为高
电平,开始一个新的计数过程,由此可以周而复始的进行下去),读写指示位
为先写低 8 位字节,在读写高 8 位字节,计数器选择计数器 0。其中 8253 的计
数初值为 10000d,当接 1MHZ 的脉冲时,分频后的输出值为 0.01S。8253 的初
始化为:
dx , al
8253 控制端口地址为 203h
计数器 0 端口地址为 200h
mov al , 34h
mov dx , 203h
out
mov dx , 200h
mov ax , 10000d
out
dx , al
mov al , ah
out
dx , al
3、中断控制器 8259 的初始化为:
ICW1,用来指示 ICW1 的标志的 D4=1,LTIM 为 0(即中断请求为边沿触
发方式),系统只用一片 8259,所以 SNGL 为 1,因为初始化程序将用到
ICW4,所以,IC4 为为 1;
ICW2 设置中断类型码的初始化命令字,必须写到 8259 的奇地址端口中,
ICW2 是任选的,而 ICW2 一旦确定下来,8259 的 8 个中断请求信号输入引脚
IR0~IR7 所对应的 8 个中断类型码也确定了;
ICW4 方式控制初始化命令字,它也要求写入奇地址端口,不过 ICW4 并不
总是需要写入的,只有在 ICW1 的第 0 位为 1 时,才有必要设置 ICW4,其中,
D7~D5 三为总是为 0,作为 ICW4 的标识码,SFNM 位为 0,BUF 位为 0,M/S
2
位为 0,AEOL 位为 0,D0 为为 1 表示 8259 当前所在的系统为 16 位或 32 位系
统;
;ICW1 初始化
OCW1 中断屏蔽操作命令字,要求写入 8259 的奇地址端口;
mov al,13h
mov dx,210h
out
dx,al
mov al,08h
mov dx,211h
out
dx,al
mov al,01h
dx,al
out
in
al,dx
al,0feh
and
out
dx,al
该系统的主要工作原理为:在主程序中,要对各个用到的芯片进行初始
;ICW2 初始化
;ICW4 初始化
化,在对 8253 进行初始化时,使它用方式 2,每 10ms 产生一次脉冲。在系统
总 8253 的输入时钟频率为 1MHZ,定时常数设为 10000,则定时周期正好为
10ms。由于 8253 的定时输出与 8259 的 IR0 相连,所以,系统中每隔 10ms 便
由 8253 对 8259 产生一次中断请求,即每隔 10ms 执行一次中断处理程序。
本系统将与时间密切相关的两个模块即显示模块和计时模块放在中断处理
程序中,这样,就保证了 LED 的数字每隔 10ms 得到一次刷新,从而保证了数
字显示的稳定。中断处理程序完成计时功能要依靠两个方面,因为中断处理程
序是每 10ms 执行一次,但计时并不是一 10ms 为单位进行的,而是以秒为单位
进行的,所以,计时功能的事项一方面要利用 10ms 这个基准时间单位,另一
方面要借助于一个计数单元。计数单元的初始值为 100,每进行一次中断,便
使计数单元的内容减 1,也就是说,每 10ms 作一次计数。每当计数单元从 100
减为 0 时,说明已经经过了 10ms*100=1s 时间,于是使秒位加 1。秒位加 1 之
后,又须判断由此而可能引起的进位,如有进位,则应实现正确的修改。修改
完以后,再将 LED 显示一遍。
三、系统设计
1、接口电路设计
3
CPU
D7
D6
D5
.
.
D0
200
I
207
。 。 。
210
I
217
208
I
20F
译码器
PA7
D7
PA6
D6
PA5
.
PA4
.
PA3
D0
PA2
WR
PA1
RD
PA0
CS
PB7
A1
A0
PB6
RESET PB5
PC7
PB4
PB3
PC6
PB2
.
PB1
.
PC0
PB0
6 位七段 LED
数码管显示器
启动键
8259
A0
CS
INTA
WR
IR7
RD
IR6
D7
IR5
D6
.
.
.
.
IR0
D0
CAS0
INT
CAS1 SP/EN
GND CAS2
D7
.
.
D0
8253
CLK0
OUT0
GATE0
CLK1
OUT1
GATE1
CLK2
OUT2
GATE2
CS
2、 程序设计
主 程序框图
INTR
INTA
高电平
1M
开始
8255、8253、8259 初始化
显示提示信息
Y
判断启动键的状
态是“1”?
N
开中断并调用中断
处理程序开始计时
调用显示程序显示
系统计时结果
4
电子时钟中断处理程序流程图
将字符转换为段码
输出段码
输出位码
位码右移 1 位
恢复寄存器
中断返回
保护寄存器
计数单元减 1
计满 1 秒了吗?
Y
秒位加 1
计满 10 秒了吗?
Y
Y
10 秒位加 1
计满 60 秒了
分位加 1
计满 10 分了
Y
10 分位加 1
计满 60 分了
Y
时位加 1
计满 10 小时了吗?
Y
10 时位加 1
N
N
N
N
N
N
四、源程序清单:
5
code segment
assume cs:code,ds:code
start:
mov ax,cs
mov ds,ax
mov bp,0064h
jmp start1
portbit equ 208h
portseg equ 209h
start1:
;设置计数初值
;8255 初始化
;8253 初始化
;8259 初始化
;ICW1 初始化
;8253 写控制字
mov dx,20bh
mov al,10000001b
out dx,al
************************************************************
mov al,34h
mov dx,203h
out dx,al
mov dx,200h
mov ax,10000d
out dx,al
mov al,ah
out dx,al
************************************************************
mov al,13h
mov dx,210h
out dx,al
mov al,08h
mov dx,211h
out dx,al
mov al,01h
out dx,al
in al,dx
and al,0feh
out dx,al
************************************************************
push ds
mov ax,0
mov ds,ax
mov ax,offset intr
mov ds:word ptr[4*8],ax
mov ax,cs
mov ds:word ptr[4*8+2],ax ;设置中断向量
pop ds
************************************************************
;主程序开始
ab: mov dx,20ah
;OCW1 打开非屏蔽位
;ICW2 初始化
;ICW4 初始化
in al,dx
and al,1
6
lea bx,TABLE
lea di,BUFDA
mov cl,11011111b
next:
mov dx,208h
mov al,cl
out dx,al
mov al,[di+06]
xlat
mov dx,209h
out dx,al
push cx
mov cx,30h
delay1:
loop delay1
pop cx
cmp cl,11111110b
jz aaaa
inc di
ror cl,1
jmp next
;位码
;输出位码
;取段码
;输出段码
;软件延迟
;判断是否扫完一遍
;显示完一遍则返回
;循环右移一位
cmp al,01h
jz intr1
call aab
cli
jmp ab
intr1:
sti
jmp ab
;判断时钟是否启动
;若启动,则开中断
;没启动,则转显示
;关中断
;开中断
;检测时钟状态
************************************************************
;初始界面显示程序
aab:
aaaa: ret
************************************************************
;中断处理程序
intr proc near
push si
push ax
dec bp
jnz display
mov di,offset BUFDA
mov bp,0064h
mov al,[di+05]
inc al
mov [di+05],al
cmp al,0ah
jnz display
;保存寄存器的内容
;计数单元减 1
;如未计到 100,则直接转显示
;计数单元设置初值
;秒位加 1
;是否引起进位
;无进位则转显示
7
mov al,00
mov [di+05],al
mov al,[di+04]
inc al
mov [di+04],al
cmp al,06
jnz display
mov al,00
mov [di+04],al
mov al,[di+03]
inc al
mov [di+03],al
cmp al,0ah
jnz display
mov al,00
mov [di+03],al
mov al,[di+02]
inc al
mov [di+02],al
cmp al,06
jnz display
mov al,00
mov [di+02],al
mov al,[di+01]
inc al
mov [di+01],al
cmp al,04
jnz display
mov al,00
mov [di+01],al
mov al,[di]
inc al
mov [si],al
cmp al,02
jnz display
mov al,00
mov [di],al
call displ
mov dx,210h
mov al,20h
out dx,al
pop ax
pop si
iret
display:
intr endp
displ proc near
push dx
;有进位则本位清零,前一位加 1
;是否满 60 秒
;否,则转显示
;是则本位清零,而分位加 1
;是否引起分位有进位
;否,则转显示
;有进位,则本位清零,前一位加 1
;是否满 60 分
;否,则转显示
;有进位,则本位清零,前一位加 1
;是否引起时位有进位
;否,则转显示
;是则本位清零,前一位加 1
;是否满 24 小时
;否,则转显示
;是则本位清零
;调用显示程序
;手动结束中断
;被中断处理程序调用的显示程序
8