交通信号灯控制系统——微机程序设计

1、设计任务

    交通信号灯控制系统:要求能显示剩余时间和控制红、黄、绿三色灯的显示。

2、总体方案设计与方案论证

(1) 总体方案设计

    设计路口交通灯控制系统,使用LED显示单元的两组发光二极管(红黄绿)分别模拟十字路口的两组交通灯。

a、南北路口的绿灯、东西路口的红灯同时亮20秒。数码管20秒倒记时显示。
b、南北路口的黄灯亮5秒,同时东西路口的红灯继续亮。数码管5秒倒记时显示。
c、南北路口的红灯、东西路口的绿灯同时亮20秒。
d、南北路口的红灯继续亮、同时东西路口的黄灯亮5秒。
e、转(1)重复。(并能在此基础添加一些功能,如紧急开关按下,时间暂停,两组路口都显示红灯)

(2) 方案论证

    将交通灯的显示规律进行观察,发现有“红绿、红黄、绿红、黄红”四种状态,将交通灯的显示抽象为这四种状态的循环切换,如需产生不同的时间,只需将每种状态直接加入一个延时程序即可,为了更加准确的记录时间和显示剩余时间,我们觉得采用8253来控制一秒,循环执行十次就是十秒,二十次就是二十秒。这样便可以完成任务。
    由上论证可知,方案可行,可以进行具体设计和操作。

3、总框图及总体软件设计说明

(1) 总框图

(2) 总体软件设计说明

a、通过8253计数,每1s输出一个脉冲,刷新10次,持续十秒钟,重复减一直至零为止;
b、8255的C口低四位作为输入输出端口,C口高四位控制某个数码管显示,B口控制数码管显示值,A口控制交通灯;
c、交替选中数码管的高低位码,计数的同时数码管显示数字,并且交通灯亮;
d、8253锁存并读数进行;
e、计数至零时状态转换,数码管重新显示下一状态的数字,交通灯转换至下一状态;       
f、重复上述过程,使交通灯的四个状态不断循环秒钟;

4、接口电路逻辑图及硬件设计说明,或系统资源使用说明

(1) 接口电路逻辑图

(2) 硬件设计说明

8253芯片说明

    8253有3个独立的16位计数器,有6种工作方式。
    利用8253的减法计数器原理,每送来一个脉冲就减1,减到0产生一个定时信号输出。
    因为计数频率为2MHz,计数器的最大数值为65536,所以最大的定时时间为0.5us*65536=32.768ms,达不到1S的要求,因此需要用两个计数器级联来解决问题。
    将2MHz的的时钟信号直接加在CLK0输入端,并让计数器0工作在方式2,选择计数初始值为5000,则从out0端可得到2MHz/5000=400Hz的脉冲,周期为0.25ms。再将该信号连到CLK1输入端,并使计数器1工作在方式2下,为了使out1输出周期为20s的波形,所以取时间常数为400.然后由out1输出到8255的PC0上,通过上升下降沿来判断1s是否结束。

8255芯片说明

     8255A可为外设提供3个8位I/O端口,即A口,B口,C口,每个端口又可分两组编程,能工作于3种操作模式。
    该实验使用8255A来作为输入输出的控制操作,将C口分为上下口,分别由A,B口控制。PC0用来接收8253的out1输出的信号,通过沿来判断是否完成1S计时。PC1用来判断有无紧急键按下,若为高电平则是紧急状态,使四个路口的红灯都亮。
    C口的高四位用来控制数码管的显示位数,测试知数码管为低电平有效,当状态控制字分别为1101,1110时对应的第二位和第一位亮。然后进行循环。
    A口作为输出端连接到发光二极管上,通过接收状态控制字来显示对应的灯。
    B口也是作为输出端按顺序连接到数码管的LA,B,C,D,E,F,G,H上。

5、局部程序框图及其设计说明

    首先,利用8253初始化,使其产生周期为一秒的脉冲,将主程序中规定的循环次数(即、秒数)在子程序中控制产生脉冲的个数,一个脉冲即为一秒。
    判断是否为一个脉冲,采用上升沿判断,出现一个上升沿即产生一个脉冲,循环次数减一,直到有n个脉冲,即已经过了n秒。
    紧急键的按下在延时过程中进行判断,如果按下,则循环判断紧急键的状态,并一直输出紧急状态的情况。当紧急键放开,则继续紧急前的状态继续延时。

    延时的剩余次数即为剩余时间,因此,只要将CX的值显示在数码管处即可达成显示时间的目的。
    CX中存有两位数,此时,将CX的值处以10,在AH和AL中分别得到余数(个位数字)和商值(十位数字)。
    让两位数字同时显示,则需要将两位数字分别在数码管的高低两位显示出来,并且不断循环显示,此时显示频率很快,肉眼看上去就是两位同时亮的状态。

6、源程序清单(详细注释)

CODE SEGMENT
 ASSUME CS:CODE
START:MOV AX,CS
      MOV DS,AX
      MOV DX,203H           ;8255初始化,连接端口IOY0
      MOV AL,10000001B      ;A口输出接LED,B口输出接数码管,C0~C3输入,C4~C7输出
      OUT DX,AL
      CALL INITIAL_8253     ;8253初始化
A1:   MOV DX,200h           ;8255的A口接
      MOV AL,01101111B      ;东西红,南北绿
      OUT DX,AL             ;将灯状态传送给LED显示
      MOV CX,20             ;计时20秒
      CALL action
      MOV DX,200h           ;东西红,南北黄     
      MOV AL,01111011B
      OUT DX,AL
      MOV CX,5          ;计时5秒
      CALL action
      MOV DX,200h           ;东西绿,南北红   
      MOV AL,10011111B
      OUT DX,AL
      MOV CX,20             ;计时20秒
      CALL action  
      MOV DX,200h           ;东西黄,南北红    
      MOV AL,10110111B
      OUT DX,AL
      MOV CX,5              ;计时5秒
      CALL action
      JMP A1                ;循环到状态A1,即东西红,南北绿
EXIT: MOV AH,4CH
      INT 21H


action PROC
      PUSH AX
      PUSH DX
      PUSH CX
      mov ah,al                 ;保存紧急状态前的路灯的状态  
LOOP2:
      mov dx,202h
      in al,dx
      test al,02h               ;判断c口倒数第二位是否有状态
      JnZ L1                    ;无紧急状态         
                            ;有紧急键则转到紧急键处理
      CALL DISP             ;显示当前时间  
      mov dx,200h
      mov AL,00111111B      ;路口都显示红灯
      out dx,al
      JMP LOOP2
L1:   mov dx,200h
      mov al,ah
      out dx,al
      CALL DISP
L2:   MOV DX,202h               ;检测1s是否计完
wait1:
      CALL DISP
      IN AL,DX
      TEST AL,01H
      JZ wait1                  ;若1s没计数完,继续    
wait2:
      CALL DISP
      IN AL,DX
      TEST AL,01H
      JNZ wait2   
      LOOP LOOP2             ;20s或5s计数完全?若没计数完,继续
      POP CX
      POP DX
      POP AX
      RET 
action ENDP

INITIAL_8253  PROC          ;8253初始化,1s
      PUSH AX
      PUSH DX
      mov al,00110101B
      mov dx,20Bh
      out dx,al
      mov al,00h
      mov dx,208h
      out dx,al
      mov al,50h
      mov dx,208h
      out dx,al
      mov al,01110101B
      mov dx,20Bh
      out dx,al
      mov al,00h
      mov dx,209h
      out dx,al
      mov al,04h
      mov dx,209h
      out dx,al
      POP DX
      POP AX
      RET
INITIAL_8253 ENDP

time1 PROC near
        lea di,time
        lea si,x1
        MOV CX,2
        MOV AL,11101111b        ;AL=DFH 1101 1111  控制 Y1~Y5 循环点亮
        MOV [si],AL      
l31:        mov dx,202h
        mov al,0ffh
        out dx,al
        MOV DX,201H         ;B口输出段码
        MOV AL,[DI]
        OUT DX,AL    
        INC DI      
        MOV AL,[si]
        MOV DX,202H         ;c口输出
        OUT DX,AL
        ROl byte ptr[si],1          ;循环左移一位   
        loop l31
        RET
time1 ENDP

DISP PROC                       ;数码管显示
        PUSH AX
        PUSH BX
        PUSH DX
        PUSH CX     
        lea di,time
        MOV AX,CX
        MOV CL,0AH              ;将CL中16进制数转化为十进制数
        DIV CL
        MOV BX,OFFSET table1
        XLAT
        mov [di],al
        inc di
        mov al,ah
        MOV BX,OFFSET table1
        XLAT
        mov [di],al         
        call time1      
        POP CX
        POP DX
        POP BX
        POP AX
        RET
DISP ENDP

table1 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH  
time db 2 dup(?)
x1 db ?

code ends
    end start

7、系统功能与操作说明

a、南北路口的绿灯、东西路口的红灯同时亮20秒。数码管20秒倒记时显示。
b、南北路口的黄灯亮5秒,同时东西路口的红灯继续亮。数码管5秒倒记时显示。
c、南北路口的红灯、东西路口的绿灯同时亮20秒。
d、南北路口的红灯继续亮、同时东西路口的黄灯亮5秒。
e、转a循环
f、期间,紧急开关按下,时间暂停,两组路口都显示红灯;紧急开关拨起,继续暂停前的状态继续

8、总结

    这个设计是利用四种状态来表示两个路口的红绿灯状态,使用这样化整为零的方法,再利用8255对四种状态进行切换控制,使每种状态之间利用一个延时子程序先进行大概的延时,再利用8253进行对一秒钟的准确延时,利用循环的方式,循环十次为十秒,则完成了对每种信号灯状态的准确定时;为了解决AB口都被占用,而还需要输出口进行对数码管高低位选择的控制,则想到了使用C口的高四位进行该项操作,至于之后的紧急状态的设置,则靠C口的低四位进行输入控制,只需判断相应位置的状态便可以进行这一类的操作。
    整个实验最困难的地方就是最开始对四种状态的分析,世界上的任何事物总可以使用各种状态来表示,事物的变换规律也可以使用状态之间的转化来体现出来。我们可以将身边的事物转化为某种逻辑关系,这样就能实现各种功能的设备了。
展开阅读全文

没有更多推荐了,返回首页