您的位置:控制工程论坛网论坛 » 教程与手册 » MCS51单片机指针及其应用

常青树

常青树   |   当前状态:在线

总积分:1421  2025年可用积分:0

注册时间: 2008-09-28

最后登录时间: 2012-05-30

空间 发短消息加为好友

MCS51单片机指针及其应用

常青树  发表于 2008/10/1 6:46:08      681 查看 0 回复  [上一主题]  [下一主题]

手机阅读

MCS51单片机指针及其应用

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 的内容。

1楼 0 0 回复