前期实验报告
一.实验题目:交通灯模拟系统.
二.实验目的
通过并行接口 8255 实现十字路口交通灯的模拟控制,进一步掌握并行口的
使用、定时器的定时和 LED 数码管的动态显示。
三.实验内容
利用 8255 端口 C 控制 LED 发光管。LED 发光管 L7(红)、L6(黄)、L5
(绿)作为南北路口的交通灯与 8255 的 PC7、PC6、PC5 相连,L2(红)、L1
(黄)、L0(绿)作为东西路口的交通灯与 PC4、PC3、PC2 相连。编程使六个
灯按交通灯变化规律亮灭。十字路口的交通灯的变化规律要求:
(1)南北路口的绿灯、东西路口的红灯同时亮 30 秒左右。
(2)南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮。
(3)南北路口的红灯、东西路口的绿灯同时亮 30 秒左右。
(4)南北路口的红灯继续亮、同时东西路口的黄灯闪烁若干次。
(5)转 1 重复。
1. 利用软件延时子程序实现 30 秒控制
2. 利用 8253 硬件延时实现 30 秒控制
3. 结合电路图(使用 8255 端口 A 和 PC1、PC0),利用 8253 定时,将绿灯亮的
剩余时间在两位 LED 数码管上动态显示出来。
五.初步实现方案和功能
(1) 利用试验箱上的 8255 电路,8253 定时器,8259A 中断控制器,LED 显示电
路和单脉冲发生器,按下图构成试验电路。8255 的地址选择:288H~28bH,8253
地址选择:280H~283H。
电路图(略)
(2) 令 8255 的 A 和 C 工作在方式 0 输出,8259 选择 IRQ3 中断,按实验要求(3)
编写顺序控制程序。若 PCi 输出高电平,则相应的 LED 数码管亮。8253 的计数
通道 0 和 1 的工作方式为方式 3,计数初值都为 1000,每一计数时间为一秒。
(3) 为快捷编写顺序控制程序,将灯显示规则细分为 16 种状态,每种状态的延
时时间及需要向 C 口写入的数据列入下表中。
1
状态
延时(s)
红
黄 绿
红 黄
绿
PC7 PC6 PC5
PC4 PC3 PC2
十六进制数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
30
1
1
1
1
1
1
30
1
1
1
1
1
1
0
0
0
0
0
0
0
1
1
1
1
1
1
1
0
1
0
1
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
30H
50H
10H
50H
10H
50H
10H
84H
88H
80H
88H
80H
88H
80H
总体的设计方案是:主程序控制灯和 LED 数码管的显示,而中断延时子程序控
灯的显示状态和 LED 数码管的倒计时(绿灯 30 秒计时:
29~00,黄灯 6 秒计时:6~1)数字显示。
1. 主程序流程图
开始
初始化 8255,8259,8253
设置循环初始值
是
取灯显示状态
否
0ffH 比较
是否相等
否
将灯状态从 C 口输出
将 倒 计 时 数 从 A 口 输
出、,并显示
判 断是 否
有键按下
是
停止程序退出
结束
2
2. 中断延时子程序
开始
否
flag=0?
是
绿灯倒计时数值减一
黄灯倒计时计数减一,
同时控制灯显示下一个状态
计数值送计数单元
否
计 算 值 是
否为 0
是
是
flag=0?
否
绿灯倒计时计数单元重新赋值 29
flag 取非
结束
主程序
; LED 发光管 L7、L6、L5 作为南北路口的交通灯与 8255 的 PC7、PC6、PC5
相连
; LED 发光管 L2、L1、L0 作为东西路口的交通灯与 8255 的 PC4、PC3、PC2
3
相连
; 红 黄 绿 红 黄 绿 0 0
.model small
.data
DENG db 30h,50h,10h,50h,10h,50h,10h
db 83h,88h,80h,88h,80h,88h,80h
db 0ffh
byte 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
byte 3,0
word ?
;存放要显示的十位和个位
;六个灯可能
;的状态数据
;结束标志
;段码
;位码
;控制灯显示
;存放灯状态,有绿灯为 0,黄灯非 0
led
buf
bz
N
flag
intseg
intoff
intimr
word 0
byte 0
dw ?
dw ?
db ?
.code
start:
mov
mov
mov
mov
out
ax,@data
ds,ax
dx,28bh
al,80h
dx,al
mov
mov
out
al,0
dx,28ah
dx,al
ax,350bh
21h
intseg,es
intoff,bx
mov
int
mov
mov
;
cli
push ds
mov
mov
mov
mov
int
pop
dx,offset intproc
ax,seg intproc
ds,ax
ax,250bh
21h
ds
;将 8255 设为 A 和 C 口输出
;关掉数码管显示
;中断设置
;设置新中断向量表项
4
al,21h
intimr,al
al,0f7h
21h,al
dx,283h
al,36h
dx,al
ax,1000
dx,280h
dx,al
al,ah
dx,al
dx,283h
al,76h
dx,al
ax,1000
dx,281h
dx,al
al,ah
dx,al
;
in
mov
and
out
mov
mov
out
mov
mov
out
mov
out
mov
mov
out
mov
mov
out
mov
out
sti
;向 8253 写控制字
;使通道 0 为工作方式 3
;写入循环计数初值 1000
;先写入低字节
;后写入高字节
;设 8253 通道 1 工作方式 3
;写入循环计数初值 1000
;先写低字节
;后写高字节
mov
mov
mov
out
cmp
jz
bx,N
al,DENG[bx]
dx,28ah
dx,al
al, 0ffh
a
;点亮相应的灯
a:
again:
mov N,0
bl,buf
mov
bh,0
mov
al,led[bx]
mov
dx,288h
mov
dx,al
out
al,2
mov
dx,28ah
mov
out
dx,al
call delay
;bl 为要显示的十位数
;求出对应的 led 数码
;自 8255 的 A 口输出
;使左边的数码管亮
;延时
5
;关掉数码管显示
;bl 为要显示的数
;求出对应的 led 数码
;自 8255 的 A 口输出
;使右边的数码管亮
;延时
;关掉数码管显示
;有键按下则退出
mov
mov
out
al,0
dx,28ah
dx,al
bl,buf+1
mov
bh,0
mov
al,led[bx]
mov
dx,288h
mov
dx,al
out
al,1
mov
dx,28ah
mov
out
dx,al
call delay
mov al,0
mov dx,28ah
out dx,al
mov ah,0bh
int 21h
test al,al
je again
cli
mov al,intimr
out 21h,al
mov dx,intoff
mov ax,intseg
mov ds,ax
mov ax,250bh
int 21h
sti
.exit
delay
proc
;延时
push cx
mov cx,3000
delay1:
loop delay1
pop cx
ret
delay
endp
6
;要显示的数减 1
proc
intproc
sti
push ax
push ds
;
mov ax,@data
mov ds,ax
;
cmp flag,0
jnz yellow
mov al,buf+1
dec al
cmp al,9
jb intp2
mov al,9
jmp intp
yellow:
inc N
mov al,buf+1
dec al
cmp al,6
jb intp2
mov al,6
jmp intp2
intp:
mov ah,buf
dec ah
cmp ah,9
jb intp1
mov ah,0
jmp intp2
intp1:
intp2:
mov buf,ah
mov buf+1,al
mov al,buf+1
7
e
mov ah,buf
cmp ax,0
jnz
cmp flag,0
jz
mov buf,02h
mov buf+1,09h
f
f:
e:
not flag
mov al,20h
out 20h,al
pop ds
pop ax
iret
intproc endp
end start
8