8255并行接口与交通灯控制

只为记录汇编实验(8255考试重点)

①了解8255A的CS端口

8255A的CS端口-----Y1(288H~28FH)

控制寄存器地址        28BH

A口的地址            288H

B口的地址            289H

C口的地址            28AH

②连接电路,此图用到的是PC端因此用C口,也就是MOV DX,28AH

如果是A口则使用的是MOV DX,288H

③看流程图直接按流程走

流程① 设置8255A口输出C口输出

MOV AL,80H
	MOV DX,28BH
	OUT DX,AL

 流程②南北路口绿灯亮,东西路口红灯亮

MOV AL,24H
	MOV DX,28AH
	OUT DX,AL

流程③长延时 引用子程序

CALL  DELAY 

长延时子程序代码如下

;长延迟
DELAY PROC NEAR
	PUSH CX
	PUSH DI
	MOV CX,2000H  ;设置外层循环次数
Y1:	
	MOV DI,2000H  ;设置内层循环次数
X1:	
	DEC DI       
	JNE X1
	LOOP Y1
	POP DI
	POP CX
	RET
DELAY ENDP

流程④南北口黄灯闪烁转红灯   东西口红灯转绿灯(黄灯闪烁四次)

MOV CX,4        ;黄灯闪烁次数
F1:
	MOV AL,44H  ;也就是0100 0100B L2和L6灯亮
	MOV DX,28AH ;C口地址给DX
	OUT DX,AL   ;AL中的值 在DX地址输出

	CALL S	    ;调用短延迟子程序

	MOV AL,04H  ;0000 0100B L2灯亮
	MOV DX,28AH ;C口地址给DX
	OUT DX,AL   
	
	CALL S      ;调用用短延迟子程序
	LOOP F1     ;循环F1也就是黄灯闪烁次数

短延迟  子程序 

;短延迟
S     PROC NEAR
	PUSH CX
	PUSH DI
	MOV CX,1500H  ;设置循环次数
YY:	MOV DI,1500H  ;设置循环次数
XX:	DEC DI        ;二重循环 内层
	JNE XX           
	LOOP YY       ;二重循环 外层
	POP DI
	POP CX
	RET
S ENDP

整体代码如下:

DATA SEGMENT
DATA ENDS
CODE SEGMENT
	ASSUME CS:CODE,DS:DATA
START:
	MOV AX,DATA
	MOV DX,AX

	MOV AL,80H
	MOV DX,28BH
	OUT DX,AL
F:
;状态1
	MOV AL,24H
	MOV DX,28AH
	OUT DX,AL
	
	CALL  DELAY
	
;状态2
	MOV CX,4
F1:
	MOV AL,44H
	MOV DX,28AH
	OUT DX,AL

	CALL S	

	MOV AL,04H
	MOV DX,28AH
	OUT DX,AL
	
	CALL S
	LOOP F1
;状态3
	MOV AL,81H
	MOV DX,28AH
	OUT DX,AL
	CALL DELAY

;状态4
	MOV CX,4
F2:
	MOV AL,82H
	MOV DX,28AH
	OUT DX,AL
	
	CALL S	

	MOV AL,80H
	MOV DX,28AH
	OUT DX,AL

	CALL S
	LOOP F2

	JMP F
;长延迟
DELAY PROC NEAR
	PUSH CX
	PUSH DI
	MOV CX,2000H
Y1:	
	MOV DI,2000H
X1:	
	DEC DI
	JNE X1
	LOOP Y1
	POP DI
	POP CX
	RET
DELAY ENDP	
;短延迟
S     PROC NEAR
	PUSH CX
	PUSH DI
	MOV CX,1500H
YY:	MOV DI,1500H
XX:	DEC DI
	JNE XX
	LOOP YY
	POP DI
	POP CX
	RET
S ENDP

	MOV AH,4CH
	INT 21H
CODE ENDS
END START

  • 21
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是一份使用8255A芯片模拟交通灯控制管理的C语言程序: ```c #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit WR = P3^5; // WR写入控制信号 sbit RD = P3^6; // RD读取控制信号 sbit CS = P3^7; // CS芯片选择信号 void delay(uint i) // 延时函数 { while(i--); } void init8255() // 8255初始化函数 { WR = 1; // 先置WR为高电平 RD = 1; // 先置RD为高电平 CS = 0; // 先置CS为低电平,选择8255 P0 = 0x80; // 将P0口置为1000 0000B,表示初始化模式 WR = 0; // 写入模式控制字 delay(10); // 延时 WR = 1; // 停止写入 P0 = 0x00; // 将P0口置为0000 0000B,表示A寄存器值 WR = 0; // 写入A寄存器初始值 delay(10); // 延时 WR = 1; // 停止写入 P0 = 0x00; // 将P0口置为0000 0000B,表示B寄存器值 WR = 0; // 写入B寄存器初始值 delay(10); // 延时 WR = 1; // 停止写入 P0 = 0x00; // 将P0口置为0000 0000B,表示C寄存器值 WR = 0; // 写入C寄存器初始值 delay(10); // 延时 WR = 1; // 停止写入 CS = 1; // 释放8255 } void main() { init8255(); // 调用初始化函数 while(1) { P0 = 0x01; // 将P0口置为0000 0001B,表示只有PA口为输出,PB、PC和PD口为输入 P1 = 0x08; // 将P1口置为0000 1000B,表示初始为北南方向绿灯亮 while(1) // 北南方向绿灯亮 { if(P2 == 0x03) // 如果东西方向有车辆 { P1 = 0x04; // 切换为北南方向黄灯 delay(3000); P1 = 0x02; // 切换为东西方向绿灯 delay(5000); break; } else if(P2 == 0x0C) // 如果南北方向有车辆 { P1 = 0x10; // 切换为东西方向黄灯 delay(3000); P1 = 0x20; // 切换为南北方向绿灯 delay(5000); break; } else // 如果东西和南北方向都没有车辆 { P1 = 0x08; // 保持北南方向绿灯 delay(5000); } } while(1) // 东西方向绿灯亮 { if(P2 == 0x03) // 如果南北方向有车辆 { P1 = 0x10; // 切换为东西方向黄灯 delay(3000); P1 = 0x08; // 切换为北南方向绿灯 delay(5000); break; } else if(P2 == 0x0C) // 如果东西方向有车辆 { P1 = 0x02; // 切换为北南方向黄灯 delay(3000); P1 = 0x01; // 切换为东西方向绿灯 delay(5000); break; } else // 如果东西和南北方向都没有车辆 { P1 = 0x02; // 保持东西方向绿灯 delay(5000); } } } } ``` 在这份程序中,我们将PA口设置为输出,PB、PC和PD口设置为输入,用于检测东西和南北方向的车辆情况。初始时,我们将北南方向绿灯亮,向东西方向和南北方向轮流检测车辆情况,当检测到有车辆时切换灯光,没有车辆时继续保持当前灯光。在检测车辆情况时,我们通过读取P2口的值来判断。在切换灯光时,我们通过将P1口的值赋为对应的二进制数来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值