微机原理与接口技术课程设计——交通信号灯的设计

课程设计的要求:

① 南北方向的红灯亮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秒之后,南北方向黄灯灭,红灯亮。此刻,东西方向由红灯变为绿灯。可重复上述过程。当从键盘任意按下一个键,便可以停止。

  • 19
    点赞
  • 234
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值