|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
MCS-51单片机外部RAM的地址空间为64K,地址总线为16位,访问外接RAM可执行如下4条指令:
1 m2 E& N! c/ a5 s1 d: d5 r* UMOVX A,@DPTR' f9 } g& y% U/ m1 s
MOVX @DPTR,A
, ^- v* S' R+ J" y4 {# J6 B4 L4 MMOVX A,@RI+ d( M9 Z$ d+ f. \" e0 b. R
MOVX @RI,A% b& b( H4 o8 h* Z0 ^
其中DPTR为16位地址寄存器,地址高8位存于DPH,地址低8位存于DPL;Ri(I=0,1)是8位寄存器,作为地址指针时仅存低8位地址。, I2 B, O% ~5 q; Q. l- J' i+ m9 h3 t8 N
MCS-51执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接RAM的数据读/写操作。在这两个阶段,P0口、P1口上的地址选通是有区别的。
' d, H1 ?5 j" ~7 h5 V& A9 x执行“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的数据信息。
. I {$ e$ r/ c9 @3 O3 i% x执行“MOVX A,@Ri”和“MOVX @RI,A”指令时,取指阶段舆“movx a, @ dptr”和“movx @ dptr, a”过程完全相同。但在执行对外部RAM的读/写阶段,低8位地址来自Ri;高8位地址来自P2口锁存器(P2 SFR)。
" O; z$ r+ \+ }" b" ]3 `由上所述,用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个,大大方便了程序设计。
+ C/ c: P3 _; {8 P下面以数据块传送子程序为例,说明R0和R1对外接RAM间接寻址的程序设计方法。假定数据块的源首地址为1000H,目的首地址为3045H,数据块长度为50H,程序清单如下所示:7 T/ |% Q' H! G* X' Z1 O. Z
程序1—用DPTR做地址指针
, O" G% H! t1 A6 b sMOV R2,#00H7 T* Z! Z' b( i' p' ~: t
MOV R3,#10H! B# E C" L) [; T
MOV R4,45H% R9 h+ R, m% b2 Q0 I e$ j' X
MOV R5,#30H
/ D+ [, ]: x4 @. m- IMOV R7,#50H
. U1 e' q: _. s# O# s Z3 ?2 h6 o9 h, RLOOP: MOV DPL,R20 v& q( ?! s; ]- j6 W& H: }
MOV DPH,R3
, A$ b$ F5 T" E MOVX A,@DPTR
4 ]4 K9 }+ ~$ p) B' G INC DPTR
2 b! M9 a0 Q4 ~4 |7 x MOV R2,DPL% z$ U1 F. a0 x: S7 t1 b( k
MOV R3,DPH; x; _/ z- ^" d0 J
MOV DPL,R4
5 ]& N" q( K e: x/ [0 I MOV DPH,R5: n B- Z8 J' O6 V0 x
MOVX @DPTR,A0 _; H0 B( v L# T
INC DPTR
4 _* c- G; F( q# v5 p2 |& O MOV R4,DPL5 ?' R, r3 h# Z
MOV R5,DPH7 L) D% m$ s; a0 a6 k2 S4 D; L
DJNZ R7,LOOP0 @/ ^0 w6 b K A
RET' Y6 b' Z( ^: x% y$ E S
9 `3 ]- {$ t2 `% r- N2 c! m7 J. Q0 a
程序2—使用R0和R1做地址指针6 ^- q$ W. F% @8 C3 K
MOV DPTR,#1000H
/ m" j$ d. Q. a+ Q jMOV P2,#30H& {9 n+ L) h( w) c7 D/ c
MOV R0,#45H
# W$ w' F& K0 b3 t0 h. R1 AMOV R7,#50H5 q1 O3 }4 r) r" @- _" [
LOOP: MOVX A,@DPTR
) \5 F( e% l) e) h9 B* _) TMOVX @R0,A
( ^1 L d' B: ~/ `& R! XINC DPTR
1 S8 H# W) q+ e: J$ V: C" A/ [2 iINC R0# {; f* e) ~( V7 o/ o. m* L8 g' B
DJNZ R7,LOOP1 A% F8 h: [. a) {7 M
RET3 ?. m8 H, }, k2 k; t$ z
程序1用了19条指令,程序2用了10条指令。适当应用R0和R1地址指针,可以大大提高程序运行效率。
8 q6 z: T/ W0 c% J' }" M在应用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中。# q4 M3 I- N b* m0 c/ C
在中断服务程序中,如果要用到地址指针,必须在保护现场程序段保护使用的地址指针,即使用“PUSH P2”和“PUSH Ri”指令。在中断返回之前又必须在恢复现场程序段恢复使用过的地址指针,即用“POP RI”和“POP P2”指令。
1 e& C9 k: E2 g当单片机进入等待方式或节电方式,且又用硬件复位返回到原来的正常操作状态时,由于复位对P2 SFR写入FFH,改变了页地址。因此,在单片机进入等待方式或节电方式之前,也必须先将P2 SFR内容进行保护。当状态恢复进入原正常操作程序入口处时,再恢复P2 SFR的内容。( d. h) p9 m% D% ]0 M4 d
; n; r; K$ V+ l! B) S$ z/ e
摘自《嵌入式系统应用》 |
|