MCS-51单片机扩展并行I/O实现读与写(8255A与理解MOVX指令时序)
摘要:51单片机通过8255A扩展IO口时,需使用74LS373锁存器配合P0口复用地址/数据总线。74LS373在ALE下降沿锁存地址信号(A1A0),8255A根据地址选择寄存器(PA/PB/PC/控制口)。MOVX指令自动生成时序:先输出地址并锁存,再传输数据,通过WR/RD信号控制读写。Proteus仿真验证了该设计,程序成功实现PB口数据转发至PA口。时序分析表明,ALE周期性脉冲不影响
老师让我们用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信号时,它会无视这些信号,只有出现上面这种时序信号才能正常接收数据。
更多推荐



所有评论(0)