功能要求
1、用 8255A 驱动三种颜色的 6 只发光二极管,模拟十字路口交通灯的功能。
2、当某一方向的红灯亮时,若该方向有车辆通过,则用扬声器发声报警,不同方向的
告警声音要有所区别。
3、通过中断进行定时,通过 LED 显示倒计时。
硬件组成
软件实现
主程序框图
中断服务子程序
蜂鸣器程序
时钟变换程序
代码如下
DATA SEGMENT 'DATA' ;数据段
DATA ENDS
STACK SEGMENT STACK ;堆栈段
STA DB 245 DUP(0)
STACK ENDS
CODE SEGMENT 'CODE' ;代码段
ASSUME CS:CODE,DS:DATA,SS:STACK
ICW1 EQU 13H ;单片8259,上升沿中断,写ICW4
ICW2 EQU 20H ;中断号为20H
ICW4 EQU 03H ;工作在8086/88 方式,自动结束
OCW1 EQU 0DFH ;允许IR5中断
START:
MOV AX,DATA
MOV DS,AX
CLI;禁能中断
PUSH DS
;中断向量表初始化
MOV AX ,0
MOV DS ,AX
MOV BX, (20H +5)*4 ;IR5中断号
MOV AX, CODE
MOV CL, 4
SHL AX, CL
ADD AX, OFFSET CLOCK_INT ;时钟中断入口地址
MOV [BX], AX
MOV AX, 0
INC BX
INC BX
MOV [BX], AX
POP DS
MOV DX, 400H
MOV AL, ICW1 ;单片8259,上升沿中断,写ICW4
OUT DX, AL
MOV DX, 402H
MOV AL, ICW2 ;中断号为20H
OUT DX, AL
MOV AL, ICW4 ;工作在8086/88 方式,自动结束
OUT DX, AL
MOV AL, OCW1 ;允许IR5中断
OUT DX, AL
STI ;启动中断
MOV DX,006H
MOV AL,36H ;设置8253计数器0,为方式3,先低位再高位
OUT DX,AL
MOV DX,000H
MOV AX,1000 ;1000倍分频输出100Hz方波
OUT DX,AL
MOV DX,000H
MOV AL,AH
OUT DX,AL
MOV DX,006H
MOV AL,76H ;设置8253计数器1,为方式3,先低位再高位
OUT DX,AL
MOV DX,002H
MOV AX,2250 ;2250倍分频,输出100Hz方波
OUT DX,AL
MOV DX,002H
MOV AL,AH
OUT DX,AL
MOV AL,89H ;设置8255的ABC口
MOV DX,206H
OUT DX,AL
MOV CH,15 ;设置默认时间为15秒
MOV AL,0DEH ;① 南北方向红灯亮,东西方向绿灯亮
MOV DX,200H
OUT DX,AL
MOV CL,0 ;设置显示模式为0
AGAIN:
MOV DX,204H
IN AL,DX
TEST AL,01H;0东西方向有车辆通过 按钮按下
JNZ A2
A10: TEST AL,01H
IN AL,DX
JZ A10
CMP CL,2
JNE DX0
;东西方向红灯,且有车辆通过
JMP DX2
DX0:CMP CL,3
JNE DX1
;东西方向红灯,且有车辆通过
JMP DX2
DX2:CALL BEEP1
DX1:JMP DIS
A2:TEST AL,02H;南北方向有车辆通过 按钮按下
JNZ DIS
A20: TEST AL,02H
IN AL,DX
JZ A20
CMP CL,0
JNE NB0
;南北方向红灯,且有车辆通过
JMP NB2
NB0:CMP CL,1
JNE NB1
;南北方向红灯,且有车辆通过
JMP NB2
NB2:CALL BEEP2
NB1:
JMP DIS
DIS: MOV AL,CH ;获取当前时间
MOV AH,0
MOV BL,10
DIV BL
SHL AL,1 ;时长数据处理,将十位放到高4位
SHL AL,1
SHL AL,1
SHL AL,1
OR AL,AH ;将个位放到低4位
MOV DX,202H
OUT DX,AL ;第一个数码管显示时长的十位,第二个数码管显示时长的个位
JMP AGAIN
;接收8253的1Hz中断
CLOCK_INT:
PUSH AX
PUSH DX
CLI
;正常交通灯模式
DEC CH ;时长减1
CMP CH,0 ;判断倒计时是否减到0
JNE C00
INC CL ;模式加1
CMP CL,1
JNE CLK1
;CL=1,则进入②
MOV CH,5 ;设置时长为5秒
MOV AL,0DDH ;②南北方向红灯亮,东西方向黄灯亮
MOV DX,200H
OUT DX,AL
JMP C00
CLK1: CMP CL,2
JNE CLK2
;CL=2,则进入③
MOV CH,15 ;设置时长为15秒
MOV AL,0F3H ;③南北方向绿灯亮,东西方向红灯亮
MOV DX,200H
OUT DX,AL
JMP C00
CLK2: CMP CL,3
JNE CLK3
;CL=3,则进入④
MOV CH,5;设置时长为5
MOV AL,0EBH;④南北方向黄灯亮,东西方向红灯亮
MOV DX,200H
OUT DX,AL
JMP C00
CLK3: CMP CL,4
JNE C00
MOV CL,0
;CL=4,则赋值为0,进入①
MOV CH,15;设置时长为15
MOV AL,0DEH;①南北方向红灯亮,东西方向绿灯亮
MOV DX,200H
OUT DX,AL
JMP C00
C00: STI
POP DX
POP AX
IRET
;蜂鸣器报警1
BEEP1 PROC NEAR
PUSH DX
PUSH AX
MOV DX,006H
MOV AL,0B7H;设置8253计数器2,为方式3,先低位再高位
OUT DX,AL
MOV DX,004H;8253计数器2
MOV AL,80H;0080倍分频
OUT DX,AL
MOV AL,00H
OUT DX,AL
CALL DELAY
MOV DX,006H
MOV AL,0B5H;设置8253计数器2,为方式2
OUT DX,AL
POP AX
POP DX
RET
BEEP1 ENDP
;蜂鸣器报警2
BEEP2 PROC NEAR
PUSH DX
PUSH AX
MOV DX,006H
MOV AL,0B7H;设置8253计数器2,为方式3,先低位再高位
OUT DX,AL
MOV DX,004H;8253计数器2
MOV AL,00H;0100倍分频
OUT DX,AL
MOV AL,01H
OUT DX,AL
CALL DELAY
MOV DX,006H
MOV AL,0B5H;设置8253计数器2,为方式2
OUT DX,AL
POP AX
POP DX
RET
BEEP2 ENDP
;延时子程序
DELAY PROC NEAR
PUSH CX
PUSH BX
MOV BX,1000
DLY2:MOV CX,100
DLY1:NOP
NOP
NOP
LOOP DLY1
DEC BX
JNZ DLY2
POP BX
POP CX
RET
DELAY ENDP
CODE ENDS
END START
功能特点
十字交通灯及警报主要运用8255、8253、8259的综合设计,实现红绿灯的变化,实现了由红转绿转黄在转红的特点,并且红灯和绿灯都是保持在15s的时长,黄灯保持在5s。之后车辆的通行是通过按钮来模拟,当有红灯时,若此时按下按钮代表有红灯闯过,则对应的蜂鸣器会发出声响,同时南北方向和东西方向的蜂鸣器声音不同,是因为两个蜂鸣器的频率不同。