老师让我们用8255A扩展51单片机IO口,8255A有2根地址线,8位数据线,51单片机P0口既要输出地址信号又要输出数据信号,接入一个74LS373锁存器可以完美的控制8255A,只需要算出外设的地址,用MOVX指令就能控制对外设的读与写,其中MOVX指令对P0,ALE,WR,RD引脚的控制是怎么完成对8255A的读与写,这让我感到好奇MOVX指令它的时序。

简单总结一下74LS373的功能:

74LS373 是 8位透明锁存器,具有三态输出,主要用于数据总线的数据锁存与缓冲。
其核心功能包括:
1.数据锁存:当锁存使能(LE)有效时,输入数据直接传输到输出端;当LE无效时,数据被锁存,输出保持稳定。
2.三态控制:通过输出使能(OE)控制输出状态(有效或高阻态)、避免总线冲突。                          3.引脚功能:DO-D7:8位数据输入。Q0-Q7:8位数据输出。LE (Latch Enable):锁存使能(高电平透明,低电平锁存)。OE (Output Enable):输出使能(低电平有效,高电平输出高阻态)。VCC/GND:电源(+5V)和地。

8255A的地址A1A0为地址线,00PA口,01PB口,10PC口,11控制口,单片机控制8255A必须要输出地址信号给A1A0,同时输出数据并且WR信号有效,才能让8255接收命令并且写入控制口数据,这一过程只需要一条MOVX指令就能实现。

硬件连接设计

1.地址锁存器(74LS373):

·输入:连接至51单片机的P0口(复用地址/数据总线)。
·输出:Q0、Q1:分别连接至8255A的A0 、 A1引脚,用于选择内部寄存器。                                  ·锁存使能(LE):连接至单片机的ALE 信号,确保在ALE下降沿锁存地址低8位。

2.8255A配置:

·数据总线(DO-D7):连接至P0口。
·片选(CS):由高位地址(如P2.7)通过译码电路产生,例如当P2.7=0时选中8255A。
·控制信号:
·RD、WR:直接连接至单片机的对应引脚。
·RESET:接受控复位电路。         

3.地址译码:

·高8位地址(如P2口):可通过简单逻辑(如门电路)或译码器(如74LS138)生成片选信号,我这  里直接接P2.7作片选信号。
·低2位地址(Q1Q0):直接选择8255A 内部寄存器(PA、PB、PC、控制寄存器)。                          ·PA口地址:7FFCH (A1A0=00),PB口地址:7FFDH (A1A0=01),PC口地址:7FFEH (A1A0=10)
控制寄存器地址:7FFFH(A1A0=11)

proteus8仿真

原理图下

汇编程序下

通过读取8255APB口数据输出给PA口验证电路,程序汇编测试代码

          ORG  0000H
		  LJMP START
		  ORG  0030H
  START:  MOV SP,#60H
DSP8255:  MOV DPTR,#7FFFH
		  MOV A,#82H
		  MOVX @DPTR,A
	DS1:  MOV DPTR,#7FFDH
		  MOVX A,@DPTR
		  MOV 40H,A
		  MOV DPTR,#7FFCH
		  MOVX @DPTR,A
		  SJMP DS1
		  END

这是我仿真示波器的信号图下

蓝色的是P0.0引脚,黄色的是ALE信号,红色的是74LS373的输出Q0,绿色的是WR信号。左边是执行MOVX @DPTR,A产生的,右边是执行MOVX A,@DPTR产生的,根据观察我得出51单片机执行MOVX @DPTR,A指令对P0,ALE,WR引脚时序。

MOVX写指令执行过程

执行MOVX @DPTR,A指令单片机会干什么?我弄了一个无限循环MOVX @DPTR,A指令,电路不变,观察它们之间的逻辑。

循环执行MOVX @DPTR,A环程序与信号图

	ORG 0000H
	MOV DPTR,#0FFFFH
	MOV A,#00H
XH:	MOVX @DPTR,A
	SJMP XH
END

总结:

单片机ALE默认输出周期性脉冲(频率 =晶振频率/6)。首先此时ALE,WR均为高电平状态,单片机会把DPTR的地址数据直接发送至P2与P0口,然后直接将ALE信号变为低电平,在很短的时间(下降沿)锁存低地址信号给74LS373(低电平之后74LS373会一直保持输出低地址信号),然后直接将A的数据传给P0口(数据信号),此时ALE任然保持着低电平即74LS373输出低地址,P2口输出高地址(包括片选)不变,接着会让WR引脚变为低电平,此时8255A会接收数据(过程时间极短),最后先让WR恢复高电平,ALE恢复高电平。最后我想到一个问题,单片机ALE会输出周期性脉冲,这会不会影响单片机8255A之间的时序导致出错?我思考了一下完全不会出现这种问题,因为在8255A没有接收到WR信号时,它会无视这些信号,只有出现上面这种时序信号才能正常接收数据。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐