原创 51单片机地址指针及其应用

2009-8-12 16:31 1745 12 12 分类: MCU/ 嵌入式
51单片机外部RAM的地址空间为64K,地址总线为16位,访问外接RAM可执行如下4条指令: 电子园51单片机学习网+d m1V(due(S7U5\6k&lmGS

MOVX A,@DPTR电子园51单片机学习网rR6V4D[*Y h;v


_|:fP7A0MOVX @DPTR,A电子园51单片机学习网.aC z:X#\ U&A bZ

电子园51单片机学习网 T"r!LY b4g%}(O%l m

MOVX A,@RI电子园51单片机学习网c0p5}s O+r(S"`,Oa


@/l RT,Dz)U] AO8l0MOVX @RI,A电子园51单片机学习网~a4E/x5d$N7d#un

电子园51单片机学习网np9yPHf

其中DPTR为16位地址寄存器,地址高8位存于DPH,地址低8位存于DPL;Ri(I=0,1)是8位寄存器,作为地址指针时仅存低8位地址。

uq0W9}b/Hr/j0

2p _U"dv5RP4ZT&i/e.J0     MCS-51执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接RAM的数据读/写操作。在这两个阶段,P0口、P1口上的地址选通是有区别的。电子园51单片机学习网 X%]Kq| u K

电子园51单片机学习网(W~ f(M2nZ

     执行“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的数据信息。

0u*?l0El)E.MK ^0

2xA"@ ]B0      执行“MOVX A,@Ri”和“MOVX @RI,A”指令时,取指阶段舆“movx a, @ dptr”和“movx @ dptr, a”过程完全相同。但在执行对外部RAM的读/写阶段,低8位地址来自Ri;高8位地址来自P2口锁存器(P2 SFR)。

Y p m,W3P\O0

T It-F8n[0       由上所述,用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个,大大方便了程序设计。

pbn%_T mK5@0 电子园51单片机学习网n3B0@iqaV:N+N

      下面以数据块传送子程序为例,说明R0和R1对外接RAM间接寻址的程序设计方法。假定数据块的源首地址为1000H,目的首地址为3045H,数据块长度为50H,程序清单如下所示:电子园51单片机学习网^hs u XwL6X.C


FoR,Sg*PI0程序1—用DPTR做地址指针电子园51单片机学习网m`IS}(zc(k*\[`


0F7\'L-sv;eZ0MOV R2,#00H电子园51单片机学习网:[!_l0^.Tm?


j:gi6|'n9s G3vZ0MOV R3,#10H

+HUprUGV?w0

&b/}R2mhNA({0MOV R4,45H电子园51单片机学习网7p8ddW-ra

电子园51单片机学习网a?a L.P0t#O

MOV R5,#30H电子园51单片机学习网)Uhf+JE(\T3{"n


N)bQX4gm!X aV,l0MOV R7,#50H电子园51单片机学习网?}Ae]*|

电子园51单片机学习网;Fx^Va6V/O9?0W

LOOP: MOV DPL,R2电子园51单片机学习网EEy,\5LjH3rX;Eo


9|g p'SIP&E}0MOV DPH,R3电子园51单片机学习网BX1S^A"S Q;qn


/?4^YlV9~0MOVX A,@DPTR

%I$\$j#s{;dJ'On0 电子园51单片机学习网v J/T~\o%n

INC DPTR电子园51单片机学习网\E\7?.ct


3@+x1q ]i5WV0MOV R2,DPL电子园51单片机学习网;E#E_mcx

电子园51单片机学习网OyK`;U[

MOV R3,DPH

I:cT I.F1bsF0 电子园51单片机学习网Rol+kZ+_2Y&s2X`

MOV DPL,R4

#\ltqg~(V4o0 电子园51单片机学习网G g,Q7qsY'mq

MOV DPH,R5

0]Q!w?"?U,L0I.j0 电子园51单片机学习网%bCa$F|+S"L$`

MOVX @DPTR,A

*v7K+D#GGJ D Gs0

6K:W2mZ r{8s$O&r0INC DPTR

&q4YH@PC0 电子园51单片机学习网%D-m'[wN

MOV R4,DPL

Z Z\.p?P0

8iR0t4sO;H.YQ0MOV R5,DPH电子园51单片机学习网Ls"^|&FxJQ$GK%GS

电子园51单片机学习网#p0QD'R m;U+`

DJNZ R7,LOOP

3_pbp1s-u0

nWX t a!e${0RET电子园51单片机学习网7s8A4`&hG7R.p2_


+B?N$b i7__P}vR0
thD.`3d"n/U$K#cN^;T0程序2—使用R0和R1做地址指针

DoxhC ?0 电子园51单片机学习网8B-mm R,`ef

MOV DPTR,#1000H

Jl6m\'OTk;N0 电子园51单片机学习网%Zp{n3w,T!t8s7I

MOV P2,#30H

m5B2BX9R7}-@(C4Cx@0 电子园51单片机学习网8Op#S8q `!C

MOV R0,#45H电子园51单片机学习网r1N.n? y9c:U

电子园51单片机学习网5k\L|2?WC|av

MOV R7,#50H电子园51单片机学习网$y E6@'e_Ed

电子园51单片机学习网(KCg gL'G&y

LOOP: MOVX A,@DPTR电子园51单片机学习网6t+ekn |t'^

电子园51单片机学习网 E*r/S3}0ry

MOVX @R0,A电子园51单片机学习网?&j6v0L#v x

电子园51单片机学习网C B i"~Y4@ uC5AYZHV

INC DPTR电子园51单片机学习网2JN,l%cZ


-b5L{ag0pINZ0INC R0

%g*mp%[F h0N0

fj?Z(U0DJNZ R7,LOOP

:ym.S%W0P(}0 电子园51单片机学习网{1|1^ pE#Kg

RET电子园51单片机学习网r&o7Ua [S'w,hb


wus)Rw(~*b0程序1用了19条指令,程序2用了10条指令。适当应用R0和R1地址指针,可以大大提高程序运行效率。电子园51单片机学习网4T T,~ScgBX

电子园51单片机学习网 L%o xXV"hzY2v

      在应用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中。电子园51单片机学习网jP&E;Z)FaOY,F4L


O;R:W0YPi k e.H0      在中断服务程序中,如果要用到地址指针,必须在保护现场程序段保护使用的地址指针,即使用“PUSH P2”和“PUSH Ri”指令。在中断返回之前又必须在恢复现场程序段恢复使用过的地址指针,即用“POP RI”和“POP P2”指令。

7Cm S!s.S[Oe0 电子园51单片机学习网7w5kIoX&nm's(T

      当单片机进入等待方式或节电方式,且又用硬件复位返回到原来的正常操作状态时,由于复位对P2 SFR写入FFH,改变了页地址。因此,在单片机进入等待方式或节电方式之前,也必须先将P2 SFR内容进行保护。当状态恢复进入原正常操作程序入口处时,再恢复P2 SFR的内容。电子园51单片机学习网 Y.kJ,@VM1M

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
12
关闭 站长推荐上一条 /3 下一条