目 录
一、方案说明 …………………………………………………………… 3
1.1、硬件方面…………………………………………………………… 3
1.2、硬件连接图 ……………………………………………………… 3
1.3、接线说明 …………………………………………………………… 4
1.4、软件方面 …………………………………………………………… 4
1.5、流程图 ……………………………………………………………… 5
二、源程序代码 ……………………………………………………… 6
三、调试现象 ……………………………………………………………11
四、心得体会 ……………………………………………………………13
五、参考文献 ……………………………………………………………14
一、方案说明
1.1 硬件方面:
8253 的 CLK0 口由于输入一个 2MHZ 的脉冲所以要求采用串联
的方式 OUT0 与 CLK1 连接,GATE0 与 GATE1 一起连接到 5V 的电
源上,最终使 OUT1 口产生 1HZ 的方波,脉冲输入到 8259 的 IR1
端,产生中断,调中断服务子程序。在加入紧急车道后,单脉冲连
到 8259 的 IRO 端,产生一个优先级为高一级的中断请求信号。
1.2 硬件连接图
OUT0
GATE0
8253 CLK0
OUT1
GATE1
CLK1
5V
8259
IR1
IR0
8255
PA7
PA0
PB7
PB0
PC7
PC0
C
B
.
.
.
.
.
.
8 位数码管
5V
2
1.3 连线说明:
————
————
————
C5 区:CS、A0、A1 ————
C5 区:OUT0
————
C5 区:OUT1
C5 区:GATE0
C5 区:GATE0
C5 区:CLK0
B3 区:CS、A0
————
B3 区:INT、INTA ————
B3 区:IR0
————
B4 区:CS、A0、A1 ————
B4 区:PA 口、PB 口 ————
B4 区:PC 口
————
————
A3 区:CS3、A0、A1
C5 区:CLK1
B3 区:IR1
C5 区:GATE1
C1 区:VCC
B2 区:2MHZ
A3 区:CS2、A0
ES8688:INTR、INTA
B2 区:单脉冲( )
A3 区:CS1、A0、A1
G5 区:C 口、B 口
G6 区:JP65(LED 灯)
1.4 软件方面:
主程序先对各个硬件初始化,在开 CPU 中断,然后空操作,等待
中断。执行低级中断(IR1)时,8255 的 PA 口负责选数码管,PB
口负责显示数字,通过查表法查出 0~9 的数码管编码。
采用循环扫描方法,人眼即可看到连续的二位数。当倒计时减到零
时,对红绿灯取反。若手动上下拨动单脉冲一次,则产生一个优先
级高一级的中断(IR0),程序转而执行此中断处理程序,处理完后
返回继续执行低级中断(IR1)。
3
1.5 流程图
开始
8255 初始化
4 盏红灯闪烁
CX=0?
Y
8253 初始化
N
调 8259 初始化程序
调类型号 n=9 的程序
东西方向绿灯亮
南北方向红灯亮
主程序
数码管显示 60
CPU 开中断
是否有 IR1
N
Y
计数器自减 1
数码管显示 0?
Y
红绿灯取反输出
N
4
紧急通行程序
主程序
循环值入栈
是否是 IR0 中断
4 盏红灯闪烁
结束中断服务程序
继续执行主程序
循环值出栈
继 续 处 理 未 完 成 的
低级中断
二、源程序代码
DATA SEGMENT
IO8259_0 EQU 0E000H
IO8259_1 EQU 0E001H
K8255A EQU 0F000H
K8255B EQU 0F001H
K8255C EQU 0F002H
K8255K EQU 0F003H
ADD8253_0 EQU 0D000H
ADD8253_1 EQU 0D001H
ADD8253_2 EQU 0D002H
ADD8253_C EQU 0D003H
COUNTER
RED_ON EQU CCH
RED_OFF EQU 0FFH
E_W
EQU 066H
TAB2 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
COUNT DB ?
SCAN DW 485
DATA ENDS
STCK SEGMENT STACK
EQU 60H
;8259 地址
;8255 地址
;8253 地址
;倒计时数
;红灯亮
;红灯灭
;东西方向通行
;扫描次数
DW 64 DUP(?)
STCK ENDS
CODE SEGMENT
5
ASSUME CS:CODE , DS:DATA,SS:STCK
START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
NOP
MOV DX,K8255K
MOV AL,80H
OUT DX,AL
;写 8255 控制字,A,B,C 均为输出,方式 0
START1: MOV DX,K8255C
;C 口输出,控制灯
MOV CX,4
FLASH: MOV AL,RED_ON
;红灯亮
OUT DX,AL
CALL DELAY
MOV AL,RED_OFF
OUT DX,AL
CALL DELAY
LOOP FLASH
START2: MOV DX,D003H
MOV AL,35H
OUT DX,AL
MOV AX,2000H
MOV DX,D000H
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,D003H
MOV AL,75H
MOV DX,AL
MOV AX,1000H
MOV DX,D000H
OUT DX,AL
MOV AL,AH
MOV DX,AL
CALL Init8259
CALL WriIntver_8
CALL WriIntver_9
MOV CL,E_W
MOV AL,CL
MOV DX,K8255C
OUT DX,AL
MOV COUNT,COUNTER
STI
NOP
JMP $
START3:
;调延时
;红灯灭
;写 8253 控制字
;0#,方式 2,BCD
;写计数初值,根据输入设定,方波频率 1HZ
;写 8253 控制字
;1#,方式 2,BCD
;调 8259 初始化子程序
;调写中断向量表子程序
;调写中断向量表子程序
;写计数值(红绿灯变换的间隔时间)
;给出中断以外 CPU 的工作
6
Init8259 PROC NEAR
MOV DX,IO8259_0
MOV AL,13H
OUT DX,AL
MOV DX,IO8259_1
MOV AL,08H
OUT DX,AL
MOV AL,09H
OUT DX,AL
MOV AL,0FCH
OUT DX,AL
RET
Init8259 ENDP
WriIntver_9 PROC NEAR
PUSH ES
MOV AX,0
MOV ES,AX
MOV DI,24H
LEA AX,INT_9
STOSW
MOV AX,CS
STOSW
POP ES
RET
;8259 初始化子程序
;写 ICW1,边沿触发,单片,需写 ICW4
;写 ICW2,确定中断类型号
;写 ICW4
;写 OCW1,除 IR0、IR1 全屏蔽
;写中断向量表子程序
;中断类型号 9,对应 24H,25H,26H,27H 四个单元
;取中断服务程序 IP
;取中段服务程序 CS
WriIntver_9 ENDP
WriIntver_8 PROC NEAR
;写中断向量表子程序
PUSH ES
MOV AX,0
MOV ES,AX
MOV DI,20H
LEA AX,INT_8
STOSW
MOV AX,CS
STOSW
POP ES
RET
WriIntver_8 ENDP
INT_9:MOV AL,COUNT
SUB AL,01H
DAS
MOV COUNT,AL
PUSH AX
PUSH DX
;中断类型号 8,对应 20H,21H,22H,23H 四个单元
;取中断服务程序 IP
;取中段服务程序 CS
;中断服务程序
7
PUSH BX
PUSH CX
PUSH SCAN
LOO: MOV AL,55H
;保护循环值,否则取数码管显示会破坏
;选高位数码管
;暂存 AH
;十进制转数码管编码
;调延时
;显数
;清除
;选低位数码管
;十进制转数码管编码
;显数
;清除
;循环扫描
MOV DX, K8255A
OUT DX,AL
MOV AL,COUNT
MOV AH,AL
MOV CL,4
SHR AL,CL
LEA BX,TAB2
XLAT
MOV DX, K8255B
OUT DX,AL
CALL DL1ms
MOV AL,0
OUT DX,AL
MOV AL,0AAH
MOV DX, K8255A
OUT DX,AL
MOV AL,AH
SHL AL,CL
SHR AL,CL
XLAT
MOV DX, K8255B
OUT DX,AL
CALL DL1ms
MOV AL,0
OUT DX,AL
DEC SCAN
CMP SCAN,0
JNZ LOO
POP SCAN
POP CX
CMP COUNT,0
JNZ STOP
MOV COUNT,COUNTER
NOT CL
MOV AL,CL
MOV DX,K8255C
OUT DX,AL
;计数到零则重新置数,并将灯取反,未到零则直接结束中断子程序
STOP: MOV DX,IO8259_0 ;结束中断服务,写 OCW2,给 8259 送 EOI 命令,LSR1 清零
MOV AL,20H
OUT DX,AL
8