|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
MCS-51单片机外部RAM的地址空间为64K,地址总线为16位,访问外接RAM可执行如下4条指令:
. K, Q% \" m8 m- k8 i" HMOVX A,@DPTR8 t& |7 |+ h$ d- B7 B; Q2 \
MOVX @DPTR,A' u) h* _& Y( @8 T( n5 p
MOVX A,@RI9 Q7 r, ^/ o9 A) o# h' `! I
MOVX @RI,A: z* \: J( W4 p# |2 m' t
其中DPTR为16位地址寄存器,地址高8位存于DPH,地址低8位存于DPL;Ri(I=0,1)是8位寄存器,作为地址指针时仅存低8位地址。
+ ` j9 |- a! R4 HMCS-51执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接RAM的数据读/写操作。在这两个阶段,P0口、P1口上的地址选通是有区别的。; y3 V4 H% ^0 b0 `" I* g8 A7 _
执行“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的数据信息。
% e. X$ a0 V" b0 W/ A' Q* B执行“MOVX A,@Ri”和“MOVX @RI,A”指令时,取指阶段舆“movx a, @ dptr”和“movx @ dptr, a”过程完全相同。但在执行对外部RAM的读/写阶段,低8位地址来自Ri;高8位地址来自P2口锁存器(P2 SFR)。
' p: }# `# w# N& B( _0 S1 t: f由上所述,用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个,大大方便了程序设计。; y! C d' l9 k
下面以数据块传送子程序为例,说明R0和R1对外接RAM间接寻址的程序设计方法。假定数据块的源首地址为1000H,目的首地址为3045H,数据块长度为50H,程序清单如下所示:# I: x- L3 C A8 C" K( J! |. a; A
程序1—用DPTR做地址指针! E9 K. ?1 Q G( l; u# K+ n
MOV R2,#00H
& U, C0 j1 Z8 {& K4 H! r& H) R% `MOV R3,#10H# v# w" T( l+ F, `( N/ ~
MOV R4,45H
2 |' b4 _/ t( X: [; w4 _MOV R5,#30H
; `8 G( o$ G5 ~; o2 l0 v% ]& \/ XMOV R7,#50H
" a4 F6 l+ c1 |$ [4 tLOOP: MOV DPL,R23 I( {* e0 ~( W- Z
MOV DPH,R3 v8 j$ {) M, `
MOVX A,@DPTR
0 V: {+ V3 V9 B n0 U INC DPTR# U- B4 g" h: c* n+ c2 w
MOV R2,DPL0 A) R% X7 D% z) \1 r8 e
MOV R3,DPH- v5 B0 i+ y, G9 L( ^! L
MOV DPL,R4, w0 l( V$ H- \0 a& s
MOV DPH,R5
8 c( a4 |- x+ p( P8 x MOVX @DPTR,A1 q }1 y X/ ^ k& z$ [+ C( p
INC DPTR
& p5 V# S" f/ ^( K0 s* Z MOV R4,DPL
$ a: n6 d+ @( {5 _$ W8 J MOV R5,DPH
" E) V' y' |6 J& Z5 G/ H DJNZ R7,LOOP4 V# i J0 n! h1 R
RET
! ?9 b) `) H" Z" Z5 c4 ^ 4 @" E$ [! q: \
程序2—使用R0和R1做地址指针
! V7 U& Y# K+ Y' K* b; bMOV DPTR,#1000H) T6 A3 D( l( I7 ?6 p
MOV P2,#30H
2 j6 }9 x! k! ^+ D2 E! {MOV R0,#45H
' z, S: ]; U" E# C9 r8 RMOV R7,#50H
+ z7 D: F' N' ?: T. h- c% O' hLOOP: MOVX A,@DPTR0 G) a! i: k8 Z: j) t
MOVX @R0,A
: b% M8 [9 M) F& iINC DPTR
: [3 I: w1 O5 Y+ F& H: c* C' _INC R0
$ S9 z1 s0 L1 A' A' C, n4 ZDJNZ R7,LOOP
# u* b! _( c8 V1 a% [, VRET
/ T6 T( \$ D! H5 J; a( B7 a$ E程序1用了19条指令,程序2用了10条指令。适当应用R0和R1地址指针,可以大大提高程序运行效率。
0 Q/ D* W8 \& n% q3 u在应用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中。( J) s, @% C# c: u' e% q' k F
在中断服务程序中,如果要用到地址指针,必须在保护现场程序段保护使用的地址指针,即使用“PUSH P2”和“PUSH Ri”指令。在中断返回之前又必须在恢复现场程序段恢复使用过的地址指针,即用“POP RI”和“POP P2”指令。# z( L* F2 R9 d! |) D9 Z0 l$ R8 x
当单片机进入等待方式或节电方式,且又用硬件复位返回到原来的正常操作状态时,由于复位对P2 SFR写入FFH,改变了页地址。因此,在单片机进入等待方式或节电方式之前,也必须先将P2 SFR内容进行保护。当状态恢复进入原正常操作程序入口处时,再恢复P2 SFR的内容。" `1 X8 X/ u( T7 S9 S" }; n
. N7 O& u, Q1 Q 摘自《嵌入式系统应用》 |
|