[微机原理]智慧交通路口控制实验

一、实验目的

        通过编写汇编语言在电路箱硬件上实际运用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,随后恢复到先前显示状态。

 八、总结

        对于多位数码管显示问题(以两位为例):出现重影的原因在于没有在切换位码之前刷新段码。由于数码排只能同时显示一种数字,因此需要在个十两位快速切换通关视觉暂留的现象来实现同时显示的效果。若不在两位切换之间刷新段码,那么切换后有一瞬间的段码与之前一致,便会造成阴影重叠的现象。

评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hamooddd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值