交通灯——汇编课程设计
XI`AN TECHNOLOGICAL UNIVERSITY 课程设计报告
西安工业大学课程设计(论文)用纸
东
西
向 南
北 向 西安工业大学课程设计报告
一、设计目的
1. 掌握交通灯的工作原理。
2. 进一步巩固8259、8254以及8255的应用。掌握综合设计能力。
二、设计任务与要求
1. 设计任务 设计一套十字路口的交通灯管理系统。按照顺序时间控制原则,利用中断控制器和定时器。采用定时中断方式设计实现。东西向和南北向均有红黄绿灯。具备倒计时功能。 南北向通行时间20秒,准备时间5秒。在准备时间里黄灯闪烁3次,闪烁频率为1 秒,周而复始。东西向通行时间40秒,准备时间5秒。在准备时间里黄灯闪烁3次, 闪烁频率为1秒,周而复始。东西向参照下边的时序控制图。 图6-1 时序控制图
2. 设计要求
(1) 硬件测试通过。接线完成。三个芯片分别测试通过。8259能够实现中
断。8254能够实现呼吸灯。8255能够控制L8—L15的亮与灭。
(2) 1S的定时中断程序能够进入。
(3) 交通灯控制程序
(4) 按KK1按钮开始工作。按KK2按钮停止工作。
(5) 代码转换程序。
(6) LED数码管动态显示程序。
(7) 倒计时程序。
(8) 白天/黑夜功能。
(9) 完善程序。
三、设计方案
1、设计思路
东西南北各三盏灯,每三盏分别为红、黄、绿三种颜色,总共十二盏灯,而实际情况下,东西方向灯亮灭一致,南北方向灯亮灭一致,故只需要按东西为一组,南北为一组,两组交错亮灭来设计控制系统,即可达到交通灯系统的控制目的。根据以上分析那么只需要控制东南或者西北六盏灯亮灭规律就能实现控制,另外两组对应一致就行了。
2、使用的I/O设备
I/O设备使用了KK1+键、8个LED小灯泡、共阴极8段显示数码管。
3、使用的芯片
使用了8259A中断控制器、8255并行输入输出接口芯片、8254定时/计数器芯片。
4、芯片的作用
8259A用于控制中断申请以及发生中断时执行对应的子程序,8255并行接口芯片用于向I/O设备输出控制灯泡或数码管点亮的数据代码,8254定时器利用频率脉冲来实现定时申请中断和动态显示8段数码管。
四、硬件线路设计
1、硬件接线图
2、端口地址说明
表6-1 实验箱8259端口地址说明
表6-2 实验箱IO端口地址说明
五、软件设计
1、程序流程图
2、R变量和M变量说明
P8255A、P8255B、P8255C、P8255M 为8255并行输入输出接口芯片的四个端口地址。
TIMER0、TIMER1、TIMER2、TIMERM 为8254计时器的四个端口地址。
DISCODE 为共阴极8段数码显示管,从0-F的显示代码。
COUNT 为计数变量,用于记录时间。
CTDOWN0 为倒计时时间变量。
POINT 为用于表示红绿灯4种状态的标志变量。
STA 为用于数码管动态显示的标志变量。
3、程序说明
此程序利用5ms的中断实现数码管的动态显示;1s的中断实现每秒使变量COUNT加一,来记录当前时刻的秒数;KK1+ 按键用于申请MIR7中断,来实现交通灯开启功能。
六、源程序
1、参考程序
P8255A EQU 0600H
P8255B EQU 0602H
P8255C EQU 0604H
P8255M EQU 0606H
TIMER0 EQU 06C0H
TIMER1 EQU 06C2H
TIMER2 EQU 06C4H
TIMERM EQU 06C6H
DA TA SEGMENT
DISCODE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0--7的显示代码
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;8--F的显示代码INDEX DB 00H,00H,00H,00H,00H,00H,0CCH,0CCH
DYNBUFF DB 00H,00H,00H,00H,00H,00H,00H,00H ;动态显示缓冲
LOCATN DB 00H,00H,00H,00H,00H,00H,00H,00H ;动态显示位置控制COUNT0 DB 100
CTDOWN0 DB 100
CTDOWN1 DB 100
CTDOWN2 DB 100
CTDOWN3 DB 100
DA TA ENDS
SSTACK SEGMENT PARA STACK 'STACK'
DW 32 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA,SS: SSTACK
START: MOV AX,DA TA
MOV DS,AX
;--------------------------------------------------------------- 8255初始化
INITA: NOP
;--------------------------------------------------------------- 中断芯片
INITB: PUSH DS
MOV AX,0000H
MOV DS,AX
MOV AX,OFFSET MIR7
MOV SI,003CH
MOV [SI],AX
MOV AX,CS
MOV SI,003EH
MOV [SI],AX
MOV AX,OFFSET MIR6
MOV SI,0038H
MOV [SI],AX
MOV AX,CS
MOV SI,003AH
MOV [SI],AX
MOV AX, OFFSET SIR1
MOV SI, 00C4H
MOV [SI], AX
MOV AX, CS
MOV SI, 00C6H
MOV [SI], AX
CLI
POP DS
;--------------------------------------------------------------- 主
MOV AL,11H
OUT 20H,AL ;ICW1
MOV AL,08H
OUT 21H,AL ;ICW2
MOV AL,04H
OUT 21H,AL ;ICW3
MOV AL,01H
OUT 21H,AL ;ICW4
;-------------------------------------------------------------初始化从片8259 MOV AL, 11H
OUT 0A0H, AL ;ICW1
MOV AL, 30H
OUT 0A1H, AL ;ICW2
MOV AL, 02H
OUT 0A1H, AL ;ICW3
MOV AL, 01H
OUT 0A1H, AL ;ICW4
;---------------------------------------------------------------
MOV AL,2BH ;OCW1 = 00101011B
OUT 21H,AL
MOV AL, 0FDH ;OCW1 = 1111 1101B
OUT 0A1H,AL
STI
AA1: NOP
JMP AA1
;--------------------------------------------------------------- 定时器芯片INITC: MOV DX, TIMERM
MOV AL,36H
OUT DX,AL
MOV DX, TIMER0 ;计数器0
MOV AL,0E8H
OUT DX,AL
MOV AL,03H
OUT DX,AL
MOV DX, TIMERM
MOV AL,76H
OUT DX,AL
MOV DX, TIMER1 ;计数器1
MOV AL,0E8H
OUT DX,AL
MOV AL,03H
OUT DX,AL
;---------------------------------------------------------------
BEGIN: NOP
AA2: JMP AA2
;---------------------------------------------------------------
MIR7 PROC NEAR
PUSH AX
PUSH DX
MOV AX,0137H
INT 10H
MOV AX,0120H
INT 10H
MOV AL,20H
OUT 20H,AL
POP DX
POP AX
IRET
MIR7 ENDP
;---------------------------------------------------------------
MIR6 PROC NEAR
PUSH AX
PUSH DX
MOV AL,20H
OUT 20H,AL
POP DX
POP AX
IRET
MIR6 ENDP
SIR1 PROC NEAR
PUSH AX
PUSH DX
MOV AL, 20H
OUT 0A0H, AL
OUT 20H, AL
POP DX
POP AX
IRET
SIR1 ENDP
CODE ENDS
END START
2、最终程序清单
P8255A EQU 0640H
P8255B EQU 0642H
P8255C EQU 0644H
P8255M EQU 0646H
TIMER0 EQU 0600H
TIMER1 EQU 0602H
TIMER2 EQU 0604H
TIMERM EQU 0606H
DA TA SEGMENT
DISCODE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0--7的显示代码DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;8--F的显示代码INDEX DB 00H,00H,00H,00H,00H,00H,0CCH,0CCH
DYNBUFF DB 00H,00H,00H,00H,00H,00H,00H,00H ;动态显示缓冲LOCATN DB 00H,00H,00H,00H,00H,00H,00H,00H ;动态显示位置控制COUNT DB 00H
CTDOWN0 DW 20,5,25,5
POINT DB 01H
CTDOWN2 DB 100
CTDOWN3 DB 100
STA DB 01H
DA TA ENDS
SSTACK SEGMENT PARA STACK 'STACK'
DW 100 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA,SS: SSTACK START: MOV AX,DA TA
MOV DS,AX
;--------------------------------------------------------------- 8255初始化INITA: NOP
;--------------------------------------------------------------- 中断芯片INITB: PUSH DS
MOV AX,0000H
MOV DS,AX
MOV AX,OFFSET MIR7
MOV SI,003CH
MOV [SI],AX
MOV AX,CS
MOV SI,003EH
MOV [SI],AX
MOV AX,OFFSET MIR6
MOV SI,0038H
MOV [SI],AX
MOV AX,CS
MOV SI,003AH
MOV [SI],AX
MOV AX, OFFSET SIR1
MOV SI, 00C4H
MOV [SI], AX
MOV AX, CS
MOV SI, 00C6H
MOV [SI], AX
CLI
POP DS
;--------------------------------------------------------------- 主
MOV AL,11H
OUT 20H,AL ;ICW1
MOV AL,08H
OUT 21H,AL ;ICW2
MOV AL,04H
OUT 21H,AL ;ICW3
MOV AL,11H
OUT 21H,AL ;ICW4
;-------------------------------------------------------------初始化从片8259 MOV AL, 11H
OUT 0A0H, AL ;ICW1
MOV AL, 30H
OUT 0A1H, AL ;ICW2
MOV AL, 02H
OUT 0A1H, AL ;ICW3
MOV AL, 11H
OUT 0A1H, AL ;ICW4
;---------------------------------------------------------------
MOV AL, 6FH ;OCW1 = 01101111B
OUT 21H, AL
MOV AL, 0FDH ;OCW1 = 1111 1101B
OUT 0A1H, AL
STI
;--------------------------------------------------------------- 定时器芯片INITC: MOV DX, TIMERM
MOV AL, 36H
OUT DX, AL
MOV DX, TIMER0 ;计数器0
MOV AX, 5000
OUT DX, AL
MOV AL, AH
OUT DX, AL
MOV DX, TIMERM
MOV AL, 76H
OUT DX, AL
MOV DX, TIMER1 ;计数器1
MOV AX, 18432
OUT DX, AL
MOV AL, AH
OUT DX, AL
;-------------------------------------------------------------
MOV DX, P8255M ;8255
MOV AL, 80H
OUT DX, AL
;----------------------------------------------------------
BEGIN: NOP
AA1: JMP AA1
;--------------------------------------------------------------- CONVERT PROC
PUSH BX
PUSH AX
MOV BX, OFFSET CTDOWN0
MOV AL, POINT
CMP AL, 01H
JZ P1
CMP AL, 02H
JZ P2
CMP AL, 03H
JZ P3
CMP AL, 04H
JZ P4
P1: MOV AX, [BX]
MOV CL, 10
DIV CL
JMP T1
P2: MOV AX, [BX+2]
MOV CL, 10
DIV CL
JMP T1
P3: MOV AX, [BX+4]
MOV CL, 10
DIV CL
JMP T1
P4: MOV AX, [BX+6]
MOV CL, 10
DIV CL
JMP T1
T1: MOV BX, OFFSET DISCODE
XLAT
MOV CH, AL ;十位
MOV AL, AH
XLAT
MOV CL, AL ;个位
POP AX
POP BX
RET
CONVERT ENDP
;----------------------------------------------------------------------
DISPL Y1 PROC NEAR ; 显示第一位PUSH AX
PUSH DX
MOV DX, P8255C
MOV AL, 11111110B ;十位
OUT DX, AL
MOV DX, P8255A
CALL CONVERT
MOV AL, CH
OUT DX, AL
POP DX
POP AX
RET
DISPL Y1 ENDP
DISPL Y2 PROC NEAR ; 显示第二位PUSH AX
PUSH DX
MOV DX, P8255C
MOV AL, 11111101B ;个位
OUT DX, AL
MOV DX, P8255A
MOV AL, CL
OUT DX, AL
POP DX
POP AX
RET
DISPL Y2 ENDP
DISPL Y PROC ;数码管动态显示代码
PUSH AX
MOV AL,STA
TEST AL,01H
JZ EVEN1
ODD: MOV STA,0
CALL DISPL Y1
JMP DONE
EVEN1: MOV STA,01H
CALL DISPL Y2
DONE: POP AX
RET
DISPL Y ENDP
;----------------------------------------------------------------------
MIR7 PROC NEAR
PUSH DX
STI
L1: MOV DX, P8255B ;南北绿,东西红
MOV AL, 38H ;0011 1000
OUT DX, AL ;Light
MOV AL, 01H ;POINT = 1
MOV POINT, AL
MOV COUNT, 0
MOV AL, 2BH ;OCW1 = 00101011B 开SIR2 5ms数码管动态显示中断OUT 21H, AL
MOV AL, 0FDH ;OCW1 = 1111 1101B 也打开MIR6
OUT 0A1H, AL
WAIT20: CMP COUNT, 20
JB WAIT20
MOV DX, P8255B;亮
MOV AL, 48H ;0100 1000
OUT DX, AL
INC POINT ; POINT = 2
MOV COUNT, 0
WAIT1: CMP COUNT, 1
JB WAIT1
MOV DX, P8255B ;灭
MOV AL, 08H
OUT DX, AL
MOV COUNT, 0
WAIT2: CMP COUNT, 1
JB WAIT2
MOV DX, P8255B ;亮
MOV AL, 48H
OUT DX, AL
MOV COUNT, 0
WAIT3: CMP COUNT, 1
JB WAIT3
MOV DX, P8255B ;灭
MOV AL, 08H
OUT DX, AL
MOV COUNT, 0
WAIT4: CMP COUNT, 1
JB WAIT4
MOV DX, P8255B;亮
MOV AL, 48H
OUT DX, AL
MOV COUNT, 0
WAIT5: CMP COUNT, 1
JB WAIT5
MOV DX, P8255B ;南北红,东西绿
MOV AL, 083H ;1000 0011
OUT DX, AL ;Light
;-------------------------------------------------------
INC POINT ;POINT = 3
MOV COUNT, 0
WAIT40: CMP COUNT, 25
JB WAIT40
INC POINT ;POINT = 4 MOV COUNT, 0
WAIT12: CMP COUNT, 1
JB WAIT12
MOV DX, P8255B ;灭
MOV AL, 80H
OUT DX, AL
MOV COUNT, 0
WAIT22: CMP COUNT, 1
JB WAIT22
MOV DX, P8255B ;亮
MOV AL, 84H
OUT DX, AL
MOV COUNT, 0
WAIT32: CMP COUNT, 1
JB WAIT32
MOV DX, P8255B ;灭
MOV AL, 80H
OUT DX, AL
MOV COUNT, 0
WAIT42: CMP COUNT, 1
JB WAIT42
MOV DX, P8255B ;亮
MOV AL, 84H
OUT DX, AL
MOV COUNT, 0
WAIT52: CMP COUNT, 1
JB WAIT52
MOV COUNT, 0
SWITCH: MOV BX, OFFSET CTDOWN0
MOV BYTE PTR[BX], 20
MOV BYTE PTR[BX+2], 5
MOV BYTE PTR[BX+4], 25
MOV BYTE PTR[BX+6], 5
JMP L1
POP DX
IRET
MIR7 ENDP
;--------------------------------------------------------------- MIR6 PROC NEAR
PUSH AX
PUSH BX
INC COUNT
MOV BX,OFFSET CTDOWN0
MOV AH,POINT
CMP AH,01H
JZ M1
CMP AH,02H
JZ M2
CMP AH,03H
JZ M3
CMP AH,04H
JZ M4
JMP QUIT6
M1: DEC BYTE PTR[BX]
JMP QUIT6
M2: DEC BYTE PTR[BX+2]
JMP QUIT6
M3: DEC BYTE PTR[BX+4]
JMP QUIT6
M4: DEC BYTE PTR[BX+6]
JMP QUIT6
QUIT6: MOV AL,20H
OUT 20H,AL
POP BX
POP AX
IRET
MIR6 ENDP
SIR1 PROC NEAR
PUSH AX
PUSH DX
STI
CALL DISPL Y
MOV AL, 20H
OUT 0A0H, AL
OUT 20H, AL
POP DX
POP AX
IRET
SIR1 ENDP
CODE ENDS
END START
七、调试过程