MCS-51 单片机外部 RAM 的地址空间为 64K ,地址总线为 16 位,访问外接 RAM 可执行如下 4 条指令:
MOVX A,@DPTR
MOVX @DPTR,A
MOVX A,@RI
MOVX @RI,A
其中 DPTR 为 16 位地址寄存器,地址高 8 位存于 DPH ,地址低 8 位存于 DPL ; Ri(I=0,1) 是 8 位寄存器,作为地址指针时仅存低 8 位地址。
MCS-51 执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接 RAM 的数据读 / 写操作。在这两个阶段, P0 口、 P1 口上的地址选通是有区别的。
执行“ MOVX A,@DPTR ”和“ MOVX @DPTR,A ”指令时,在读指令代码阶段,由程序计数器( PC )提供 A0~A15 ,低 8 位地址稳定后,在单片机地址锁存信号 ALE 作用下, P0.X 口开始读入 MOVX 指令代码。在对外接 RAM 读写阶段,其过程与前述相同,只不过低 8 位地址不是来自程序计数器的低 8 位 PCL ,而是来自地址寄存器的高 8 位 DPH; 高 8 位地址不是来自程序计数器的高 8 位 PCH, 而是来自地址寄存器的高 8 位 PCH 。当 DPL 稳定后,由地址锁存器锁存, P0.X 口上出现的是读 / 写外接 RAM 的数据信息。
执行“ MOVX A,@Ri ”和“ MOVX @RI,A ”指令时,取指阶段舆“ movx a, @ dptr” 和“ movx @ dptr, a” 过程完全相同。但在执行对外部 RAM 的读 / 写阶段,低 8 位地址来自 Ri; 高 8 位地址来自 P2 口锁存器( P2 SFR )。
由上所述,用 R0 和 R1 对外接 RAM 的间接寻址,可看作是一种页面寻址,由 P2 锁存器( P2 SFR )的当前值决定了当前页面地址。 MCS-51 单片机在复位时, P2 SFR 为 FFH ,若程序运行中没有改变 P2 SFR 中的值, R0 和 R1 只能对 FF00H~FFFFH 范围的外接 RAM 进行间接寻址,即 FF 页面寻址。由于用指令改变 P2 SFR 的值并不影响程序正常运行,因此可以用 R0 和 R1 对 64K 外接 RAM 空间的任意一个单元进行间接寻址。这样就使 MCS-51 单片机外接 RAM 的地址指针由 1 个变成 3 个,大大方便了程序设计。
下面以数据块传送子程序为例,说明 R0 和 R1 对外接 RAM 间接寻址的程序设计方法。假定数据块的源首地址为 1000H, 目的首地址为 3045H, 数据块长度为 50H, 程序清单如下所示:
程序 1— 用 DPTR 做地址指针
MOV R2,#00H
MOV R3,#10H
MOV R4,45H
MOV R5,#30H
MOV R7,#50H
LOOP: MOV DPL,R2
MOV DPH,R3
MOVX A,@DPTR
INC DPTR
MOV R2,DPL
MOV R3,DPH
MOV DPL,R4
MOV DPH,R5
MOVX @DPTR,A
INC DPTR
MOV R4,DPL
MOV R5,DPH
DJNZ R7,LOOP
RET
程序 2— 使用 R0 和 R1 做地址指针
MOV DPTR,#1000H
MOV P2,#30H
MOV R0,#45H
MOV R7,#50H
LOOP: MOVX A,@DPTR
MOVX @R0,A
INC DPTR
INC R0
DJNZ R7,LOOP
RET
程序 1 用了 19 条指令,程序 2 用了 10 条指令。适当应用 R0 和 R1 地址指针,可以大大提高程序运行效率。
在应用 R0 和 R1 间址的外接 RAM 数据传送操作中,一般使用“ MOV P2,#ADDR ”和“ MOV A,@RI ”形式,其中 #ADDR 为高 8 位地址。在这两条指令之间不应插入有关改变 P2 SFR 值的指令。对 P2 口的读有两种情况:一种是读 P2 锁存器,如执行“ MOV A,P2” 指令,这并不会改变 P2 SFR 中的内容;另一种是读 P2 锁存器,如执行“ INC P2 ”指令,该指令中的 P2 既是源操作数,又是目的操作数,通常称为“读 — 修改 — 写”指令,即从 P2 SFR 中读出内容,修改后又写入 P2 SFR 中。
在中断服务程序中,如果要用到地址指针,必须在保护现场程序段保护使用的地址指针,即使用“ PUSH P2 ”和“ PUSH Ri ”指令。在中断返回之前又必须在恢复现场程序段恢复使用过的地址指针,即用“ POP RI ”和“ POP P2” 指令。
当单片机进入等待方式或节电方式,且又用硬件复位返回到原来的正常操作状态时,由于复位对 P2 SFR 写入 FFH ,改变了页地址。因此,在单片机进入等待方式或节电方式之前,也必须先将 P2 SFR 内容进行保护。当状态恢复进入原正常操作程序入口处时,再恢复 P2 SFR 的内容。