一、实验目的
通过编写汇编语言在电路箱硬件上实际运用8255,进一步深化对于8255芯片工作方式0的理解。学会控制LED、数码管等元件,通过编写小的程序实现简易的交通系统模拟。在此基础上,能够利用中断考虑相对复杂的情况。进一步完成对真实路况的考虑。
二、实验设备与环境
硬件上,使用实验室的TPC-ZK-II硬件实验箱,系统由USB总线接口模块、TPC-ZK-II实验系统及集成开发环境软件组成。USB总线接口模块通过USB总线电缆与pc机相连,模块直接插在TPC-ZK-II实验系统上。具体硬件见使用指导书。


软件上,使用TPC-ZK-II集成开发环境。为用户提供了程序的编辑、汇编、调试、运行等功能。

三、实验内容与指标
3.1设计要求
(1)实际学习十字路口交通灯原理,确定实现的算法流程。
(2)利用实验箱的硬件电路要求,完成对8255芯片的运用。
(3)编程实现并调试完成交通信号灯的模拟控制。
(4)分析设计方案,并比较和实际交通信号灯技术的性能差别。
3.2设计目标和性能比较
3.2.1基础功能
通过编程,控制8255芯片输出到LED排灯,实现对于东西、南北信号灯亮灭情况的模拟。如通行/禁行时间30s,原绿灯向黄灯闪烁3s、红灯向保持不变,随后路灯红绿交替重新30s计时。

3.2.2扩展功能
通过编写程序,是数码管以倒计时的形式显示实时倒计时时间。此外,如果遇到特殊情况,可以通过按键处理一下两种情况:1.当红灯时间大于6s,按下一个按键可以使两方向的红绿灯翻转,使行人获得优先的通过权。2.当路口遇到突发状况,可按下按键,使两方向路口全红10s,使紧急车辆通过后恢复形式。
3.3硬件电路图
通过功能的确定以及一系列调试,最终确定硬件电路图如下。其中L7、 L6、 L5 作为南北路口的交通灯与 PC7、 PC6、 PC5 相连,L2、 L1、 L0 作为东西路口的交通灯与 PC2、 PC1、 PC0 相连。编程使六个灯按交通灯变化规律燃灭。

四、程序流程图
设置一个数值表来查询下一次LED灯的状态,每次赋值后,都要对值进行判断,观察其是否到达最后一位,如果到达就应刷新指针,开启一个新的循环。若没到末尾,则进一步判断处于哪种状态,进而调用并执行不同的子过程。
长延时为30s的红绿显示,短延时为3s的黄灯闪烁状态,由于短延时没必要存在按键终端,且数码管只有一位,显示也比较简单。因此这里只展示长延时30s的子过程,通过多次调用小延时使得每个小循环为10s,大循环为30s。伴随着数码管的并行显示。小循环是由多次小延迟程序叠加而来,这样做的目的在于通过快速切换同时显示两位数码管。在每次数码管交替切换后,都会进行按键的判断,若有按键输入则会进行相应的按键处理,否则返回长延时继续执行。对于按键处理子过程,将寄存器事先压入栈,可以很好的保护现场,使得执行完特殊情况后能够恢复计时。
五、方案设计与讨论
在延时方面,由于需要特定延时时间,因此可以有两种思路解决时间问题。首先可以通过编写延时子过程解决,当前解决方法就是这样,但这样做会使数码管的同时显示存在一定的问题。另一种方法是从同学学习得知的,就是通过外循环来直接实现延时的效果,这样最大的好处是在数码管显示时可以变得稳定从而不会出现重影。
在延时时长方面,本程序比较死板,功能也相对固定、单一,只是实现了路口的基本情况模拟。此外,对于紧急情况的处理也可以进一步优化。如可以设置在紧急情况下可以不理会新的按键或者刷新延时时长等。
本方案既添加了全红的车辆紧急状态,又添加了行人优先的处理。随增加了复杂度,但在一定程度上增加了其可靠性、灵活性。
六、程序展示
;功能:东西、南北红/绿灯时间停留30s,黄灯闪烁3s,整体伴有数码管倒计时显示。紧急按键函数完成编写但硬件还需调试。
;端口:8255:288H-28BH,数码管位码:PA口,数码管段码:PB口。主核CLK:1MHZ,南北灯:PC7/6/5,东西灯:PC2/1/0。
DATAS SEGMENT
P8255A EQU 288H
P8255B EQU 289H
P8255C EQU 28AH
P8255S EQU 28BH
LAMP_TAB DB 24H ;north_south green
DB 44H,04H,44H,04H,44H,04H ;north_south yellow
DB 81H ;west_east green
DB 82H,80H,82H,80H,82H,80H ;west_east yellow
DB 0FFH
SM_TAB1 DB 6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H,3FH ;9,8,7,6,5,4,3,2,1,0
SM_TAB2 DB 5BH,06H,3FH ;2,1,0
SM_TAB3 DB 5BH,5BH,06H,06H,3FH,3FH,5BH,5BH,06H,06H,3FH,3FH;2,2,1,1,0,0
DATAS ENDS
STACKS SEGMENT
X DB 100 DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,P8255S
MOV AL,80H
OUT DX,AL
MAINLP: ;主循环信号灯显示
CALL OPLP
JMP MAINLP
EXIT:
MOV AH,4CH
INT 21H
OPLP PROC ;信号灯显示+数码管计时
MOV BX,0
MOV SI,0
LP1:
MOV DX,P8255C
MOV AL,LAMP_TAB[BX]
CMP AL,0FFH
JZ EX1
OUT DX,AL
INC BX
TEST AL,21H
JZ S1
CALL LONG30S ;绿灯情况下的计时与显示
JMP LP1
S1:
CALL SHORT05S
JMP LP1
EX1:
RET
OPLP ENDP
LONG30S PROC
PUSH CX
PUSH BX
PUSH AX
PUSH DX
PUSH SI
MOV CX,3
MOV SI,0
LP2:
MOV DI,0
PUSH CX
LP3:
MOV CX,50
LP4:
CALL BTTEST ;检测按键子程序
MOV AL,02H ;由于存在两位数码管,因此需要在两位数码管之间快速刷新
MOV DX,P8255A
OUT DX,AL
MOV AL,SM_TAB2[SI]
MOV DX,P8255B
OUT DX,AL
CALL DELAY_02S
MOV AL,SM_TAB1[DI]
MOV DX,P8255B
OUT DX,AL
MOV AL,01H
MOV DX,P8255A
OUT DX,AL
CALL DELAY_02S
LOOP LP4
INC DI
CMP DI,10
JNE LP3
INC SI
POP CX
LOOP LP2
POP SI
POP DX
POP AX
POP BX
POP CX
RET
LONG30S ENDP
SHORT05S PROC ;黄灯闪烁情况下的计时与显示
PUSH CX
PUSH BX
PUSH AX
PUSH DX
MOV AL,01H
MOV DX,P8255A
OUT DX,AL
MOV AL,SM_TAB3[SI]
MOV DX,P8255B
OUT DX,AL
CALL DELAY_05S
INC SI
POP DX
POP AX
POP BX
POP CX
RET
SHORT05S ENDP
BTTEST PROC ;紧急情况处理
PUSH DX
PUSH AX
PUSH BX
PUSH SI
MOV AH,06H
MOV DL,0FFH
INT 21H
CMP AL,13
JNE RENX
JMP ANS1
RENX:
CMP AL,32
JNE EXT2
JMP ANS2
ANS1:
MOV DX,P8255C
MOV AL,84H
OUT DX,AL
CALL BTSM
DEC BX
MOV AL,LAMP_TAB[BX]
OUT DX,AL
JMP EXT2
ANS2:
DEC BX
CMP BX,0
JE A21
MOV DX,P8255C
MOV AL,24H
OUT DX,AL
CALL BTSM
MOV AL,LAMP_TAB[BX]
OUT DX,AL
JMP EXT2
A21:
MOV DX,P8255C
MOV AL,81H
OUT DX,AL
CALL BTSM
MOV AL,LAMP_TAB[BX]
OUT DX,AL
JMP EXT2
EXT2:
POP SI
POP BX
POP AX
POP DX
RET
BTTEST ENDP
BTSM PROC
PUSH DX
PUSH CX
PUSH AX
PUSH DI
MOV DI,0
MOV CX,10
LP5:
MOV AL,01H
MOV DX,P8255A
OUT DX,AL
MOV AL,SM_TAB1[DI]
MOV DX,P8255B
OUT DX,AL
CALL DELAY_1S
INC DI
LOOP LP5
POP DI
POP AX
POP CX
POP DX
RET
BTSM ENDP
DELAY_02S PROC
PUSH CX
PUSH SI
MOV CX,60
DD1: MOV SI,4000
DD2: DEC SI
JNZ DD2
LOOP DD1
POP SI
POP CX
RET
DELAY_02S ENDP
DELAY PROC
PUSH CX
PUSH SI
MOV CX,30
DD1: MOV SI,4000
DD2: DEC SI
JNZ DD2
LOOP DD1
POP SI
POP CX
RET
DELAY ENDP
DELAY_05S PROC
PUSH CX
PUSH SI
MOV CX,3000
D1: MOV SI,4000
D2: DEC SI
JNZ D2
LOOP D1
POP SI
POP CX
RET
DELAY_05S ENDP
DELAY_1S PROC
PUSH CX
MOV CX,2
D3:
CALL DELAY_05S
LOOP D3
POP CX
RET
DELAY_1S ENDP
CODES ENDS
END START
七、实验结果与分析
端口:8255:288H-28BH,数码管位码:PA口,数码管段码:PB口。主核CLK:1MHZ,南北灯:PC7/6/5,东西灯:PC2/1/0。左侧三个灯为南北灯,右侧为东西灯,可以看到在一开始南北为绿灯,东西为红灯,数码管伴随着实时计时。
若按下行人按键(这里设置为空格键),则南北、东西状态对调,持续10s,随后恢复先前的状态。
当30秒计时完成后,随后南北灯进入3s的黄灯闪烁状态,同时东西仍然保持绿灯,在这个过程中数码管一直保持计时。
随后,转换到东西为绿灯,南北为红灯的状态,效果与之前一致。重新计时。
若按下紧急按键(这里设置的是回车),则南北、东西均为红灯,持续10s,随后恢复到先前显示状态。
八、总结
对于多位数码管显示问题(以两位为例):出现重影的原因在于没有在切换位码之前刷新段码。由于数码排只能同时显示一种数字,因此需要在个十两位快速切换通关视觉暂留的现象来实现同时显示的效果。若不在两位切换之间刷新段码,那么切换后有一瞬间的段码与之前一致,便会造成阴影重叠的现象。