MCS-51单片机地址指针详细剖析
MCS-51单片机外部RAM的地址空间为64K , 地址总线为16位 , 访问外接RAM可执行如下4条指令:
MOVX A,@DPTR
MOVX @DPTR,A
MOVX A,@RI
MOVX @RI,A
【MCS-51单片机地址指针详细剖析】其中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的内容 。
推荐阅读
- MCS-51汇编语言程序的一般格式
- HT1621LCD驱动 PIC单片机
- AVR单片机控制的开关电源
- PIC单片机12F629烧录器电路设计与制作
- 51单片机 数码管的显示与译码器
- 单片机的电平匹配问题
- 运用模块方式写单片机程序
- 单片机轻松入门之二:流水灯
- 51单片机常见的六个问题
- 单片机独立按键与矩阵按键