① 南北方向的红灯亮16秒;同时东西方向的绿灯亮12秒;东西方向和南北方向的数码管(各两位)分别显示倒计时,下同。
② 12秒之后,东西方向的绿灯灭,黄灯(红灯和绿灯一起闪烁为黄灯)闪烁3秒。3秒之后,东西方向黄灯灭,红灯亮。同时南北方向的绿灯亮。
③ 12秒之后,南北方向的绿灯灭,黄灯闪烁3秒。3秒之后,南北方向黄灯灭,红灯亮。同时东西方向的绿灯亮。
④ 重复上述过程。
PC机一台,TD—PITE实验室装置一套
设计通过8255可编程并行接口实现了对南北、东西两个方向交通信号灯状态的转换控制;通过软件定时的方法实现了对两个方向车辆通行时间的计时控制和黄灯的闪烁控制;通过键盘与数码管显示两个双位数字计时。
① 8255结构
8255的内部结构及引脚如图1所示,8255工作方式控制字和C口按位置位/复位控制字格式如图2所示
8255A有三种工作方式:基本输入/输出方式、单向选通输入/输出方式和双向选通输入/输出方式:
方式0:基本输入/输出方式。方式0是8255A的基本输入/输出方式,其特点是与外设传送数据时,不需要设置专用的联络(应答)信号,可以无条件的直接进行I/O传送。
方式1:单向选通输入/输出方式。方式1是一种带选通信号的单方向输入/输出工作方式,其特点是:与外设传送数据时,需要联络信号进行协调,允许用查询或中断方式传送数据。
方式2:双向选通输入/输出方式。方式2为双向选通输入/输出方式,是方式1输入和输出的组合,即同一端口的信号线既可以输入又可以输出。
8255A的A,B,C三个端口的工作方式是在初始化编程时,通过向8255A的控制端口写入控制字来设定的。8255A由编程写入的控制字有两个:方式控制字和置位/复位控制字。方式控制字用于设置端口A, B, C的工作方式和数据传送方向;置位/复位控制字用于设置C口的PC7~PC0中某一条口线PCi(i=0~7)的电平。两个控制字公用一个端口地址,由控制字的最高位作为区分这两个控制字的标志位。
DATA SEGMENT
PORTA EQU 600H;8255的A、B、C口地址
PORTB EQU 602H
PORTC EQU 604H
PORTD EQU 606H ;8255的控制寄存器
DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;对应0~9
CHU DB 10
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,PORTD ;设定8255工作方式
MOV AL,80H ;选择工作方式0,A口和B口为输出
OUT DX,AL
LOOP1:
MOV DX,PORTA ;写A口发出的数据,北方向绿灯亮,西方向红灯亮
MOV AL,3CH
OUT DX,AL
CALL DALLY1
MOV CX,02H
MOV TIME2,04H
L1:
MOV DX,PORTA ;写A口发出的数据,北方向黄灯亮,西方向红灯亮
MOV AL,0FCH
OUT DX,AL
DEC TIME
DEC TIME2
CALL DALLY2
MOV DX,PORTA ;写A口发出的数据,北方向黄灯灭,东西方向红灯亮
MOV AL,30H
OUT DX,AL
DEC TIME
DEC TIME2
CALL DALLY2
LOOP L1
MOV DX,PORTA ;写A口发出的数据,北方向红灯亮,西方向绿灯亮
MOV AL,0C3H
OUT DX,AL
CALL DALLY11
MOV CX,02H ;黄灯闪烁的次数
MOV TIME,04H
L2:
MOV DX,PORTA ;写A口发出的数据,西方向黄灯亮,北方向红灯亮
MOV AL,0F3H
OUT DX,AL
DEC TIME
DEC TIME2
CALL DALLY2
MOV DX,PORTA ;写A口发出的数据,东西方向黄灯灭,北方向红灯亮
MOV AL,0C0H
OUT DX,AL
DEC TIME
DEC TIME2
CALL DALLY2
LOOP L2
MOV AH,1 ;判断功能,是否结束调用程序
INT 16H
JZ LOOP1
QUIT: MOV AX,4C00H
INT 21H ;系统功能调用
DALLY1 PROC NEAR ;软件延时子程序
PUSH CX
PUSH AX
MOV CX,0CH ;循环次数
MOV TIME,10H
MOV TIME2,0CH
PUSH CX
CALL DISPY1
POP CX
D3:
DEC TIME
DEC TIME2
PUSH CX
CALL DISPY1
POP CX
LOOP D3
POP AX
POP CX
RET
DALLY1 ENDP
DALLY11 PROC NEAR ;软件延时子程序
PUSH CX
PUSH AX
MOV CX,0CH ;循环次数
MOV TIME2,10H
MOV TIME,0CH
PUSH CX
CALL DISPY1
POP CX
D31:
DEC TIME
DEC TIME2
PUSH CX
CALL DISPY1
POP CX
LOOP D31
POP AX
POP CX
RET
DALLY11 ENDP
DALLY2 PROC NEAR ;软件延时子程序,黄灯亮与灭的闪烁时间间隔,
PUSH CX
PUSH AX
CALL DISPY1
POP AX
POP CX
RET
DALLY2 ENDP
DISPY1 PROC NEAR
MOV BX,OFFSET DTABLE
MOV AL,TIME
CBW ;将AX的高8位置0
MOV CL,CHU ;除数10
DIV CL ;商/十位数存入AL,余数/个位数存入AH
MOV SI,3000H ;定义一个缓冲区
MOV [SI],AL ;存入[SI],X1
MOV [SI+1],AH ;X2
MOV AL,TIME2
CBW ;将AX的高8位置0
MOV CL,CHU ;除数10
DIV CL ;商/十位数存入AL,余数/个位数存入AH
MOV [SI+2],AL ;存入[SI],X1
MOV [SI+3],AH
PUSH AX
PUSH CX
MOV CX,1DH;通过延时不断刷新数码管 ..........
C1: MOV AX,0FFFFH
C2: DEC AX
CALL DIS;调用显示子程序
JNZ C2
LOOP C1;通过循环调用不断刷新数码管显示
POP CX
POP AX
PUSH CX
PUSH AX
MOV CX,0AH
C3: CALL DIS
LOOP C3
POP AX
POP CX
RET
DISPY1 ENDP
DIS PROC NEAR ;数码管显示子程序
PUSH AX
PUSH DX
MOV SI,3000H ;找到存数的缓冲区
MOV AL,0FEH ;1111 1110B,选中X1数码管
MOV DX,PORTC ;选中PC口,进而选中数码管
OUT DX,AL
MOV AL,[SI] ;取出缓冲区中存放的键值
XLAT ;查表指令,将以BX为基地址,AL为位移量的字节存储单元中的数赋给AL
MOV DX,PORTB ;写入数码管A~Dp
OUT DX,AL
CALL DELAY1 ;调用延时函数
MOV AL,0FDH ;1111 1101H,选中X2数码管
MOV DX,PORTC
OUT DX,AL
MOV AL,[SI+1]
XLAT ;将((BX)+(AL))送给(AL)
MOV DX,PORTB
OUT DX,AL
CALL DELAY1
MOV AL,0FBH ;1111 1011B,选中X3数码管
MOV DX,PORTC
OUT DX,AL
MOV AL,[SI+2]
XLAT
MOV DX,PORTB
OUT DX,AL
CALL DELAY1
MOV AL,0F7H ;1111 0111B,选中X4数码管
MOV DX,PORTC
OUT DX,AL
MOV AL,[SI+3]
XLAT
MOV DX,PORTB
OUT DX,AL
CALL DELAY1
POP AX
POP DX
RET
DIS ENDP
DELAY1 PROC NEAR ;数码管显示延时函数
PUSH AX
PUSH CX
MOV CX,02H
C33: MOV AX,06FFH
C4: DEC AX
JNZ C4
LOOP C33
POP CX
POP AX
RET
DELAY1 ENDP
CODE ENDS
END START
首先,南北方向的红灯亮16秒,东西方向的绿灯亮12秒;东西方向的数码管从12开始倒计时,南北方向的数码管从16开始倒计时,12秒之后,东西方向的绿灯灭,黄灯(红灯和绿灯一起闪烁为黄灯)闪烁3秒,东西方向数码管从3开始倒计时。3秒之后,东西方向黄灯灭,红灯亮。此刻,南北方向的数码管已减小到0,红灯灭,绿灯亮。接着,东西方向的数码管从16开始倒计时,南北方向的数码管从12开始倒计时,12秒之后,南北方向的绿灯灭,黄灯(红灯和绿灯一起闪烁为黄灯)闪烁3秒,数码管从3开始倒计时,3秒之后,南北方向黄灯灭,红灯亮。此刻,东西方向由红灯变为绿灯。可重复上述过程。当从键盘任意按下一个键,便可以停止。