|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
MCS-51单片机外部RAM的地址空间为64K,地址总线为16位,访问外接RAM可执行如下4条指令:! O9 r2 O5 j2 m. {1 s6 c( X
MOVX A,@DPTR3 q4 d1 T0 k2 {7 h F* g5 \2 @' J
MOVX @DPTR,A
1 e' t H$ |' v' [, e% K$ ZMOVX A,@RI
7 m# T% C4 |$ N+ Q: s5 w: |: y1 EMOVX @RI,A# T/ o6 l: l* D
其中DPTR为16位地址寄存器,地址高8位存于DPH,地址低8位存于DPL;Ri(I=0,1)是8位寄存器,作为地址指针时仅存低8位地址。
- }( G7 b) ^8 T/ ?3 K; ZMCS-51执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接RAM的数据读/写操作。在这两个阶段,P0口、P1口上的地址选通是有区别的。1 w1 m6 M9 Q- ]( g( r/ a! Z
执行“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的数据信息。# u, E r6 y9 Y7 J, I( i( }
执行“MOVX A,@Ri”和“MOVX @RI,A”指令时,取指阶段舆“movx a, @ dptr”和“movx @ dptr, a”过程完全相同。但在执行对外部RAM的读/写阶段,低8位地址来自Ri;高8位地址来自P2口锁存器(P2 SFR)。, w$ U$ y% D1 X, i4 V$ q
由上所述,用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个,大大方便了程序设计。
& C2 o, `3 L7 p! p( I( j下面以数据块传送子程序为例,说明R0和R1对外接RAM间接寻址的程序设计方法。假定数据块的源首地址为1000H,目的首地址为3045H,数据块长度为50H,程序清单如下所示:
O- a" P* X& R5 U程序1—用DPTR做地址指针
+ R! F8 F. d- p6 nMOV R2,#00H5 i! U3 X2 J" S
MOV R3,#10H- K. l4 ~% e8 [% y% [
MOV R4,45H
3 @8 _) p. U0 C7 ?MOV R5,#30H$ J8 [# k" d& h6 Q R9 a; h
MOV R7,#50H' {' E5 U3 m% |- D& g; j4 _
LOOP: MOV DPL,R2
/ {& K3 d' Q) }# b MOV DPH,R3- F: F, O7 U! H7 D: o* \
MOVX A,@DPTR
2 m- p; s# s+ n& j1 J/ g$ k+ Z$ D INC DPTR( o" f$ l# M" y4 r
MOV R2,DPL: l5 i0 u6 z) }
MOV R3,DPH
: ~6 w# G5 I' I7 |& @! {. w MOV DPL,R4/ B" e* a* @& Y) c4 r' u4 j9 m& O1 \
MOV DPH,R56 x0 A- \- u T6 N' [4 W: t2 {5 [
MOVX @DPTR,A
: k; [' Y9 b, e# r4 U/ [ INC DPTR
+ c. w! J m7 @/ A7 y MOV R4,DPL
* a$ \5 m2 h9 ^- m6 l2 H; f MOV R5,DPH' q" G- x& t8 P; w5 L/ D
DJNZ R7,LOOP' I" b( L) J) R1 E
RET
# @/ K& a7 E0 ^ 7 i9 C0 B" D) M% C8 _4 a; ]! W* Q5 P
程序2—使用R0和R1做地址指针7 C- e" U( N+ Z4 E) _+ }/ x
MOV DPTR,#1000H
+ S0 ^0 O( n3 \- H4 pMOV P2,#30H
6 H) {$ p' ]8 Q! U3 ^, Y6 zMOV R0,#45H5 y5 J3 t7 l7 ^7 J6 `0 l' s6 _
MOV R7,#50H
- [" `( I; `( W4 T2 y! VLOOP: MOVX A,@DPTR
- Y3 x T+ |) E6 h1 k8 A) eMOVX @R0,A, ~) ^- g' s1 R* ]: i
INC DPTR
4 P" E3 V9 L. y+ cINC R0
5 d3 T* x: E% N& T$ mDJNZ R7,LOOP% o( g7 T' v9 J* w% O
RET0 L) ~& \6 G0 [
程序1用了19条指令,程序2用了10条指令。适当应用R0和R1地址指针,可以大大提高程序运行效率。
9 h" a/ w" U8 `2 a7 x G( \7 d2 B在应用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中。
! P1 ]* ~. y5 p" }# J1 x在中断服务程序中,如果要用到地址指针,必须在保护现场程序段保护使用的地址指针,即使用“PUSH P2”和“PUSH Ri”指令。在中断返回之前又必须在恢复现场程序段恢复使用过的地址指针,即用“POP RI”和“POP P2”指令。
1 L5 j: R& P% Y' c- r* Q% T当单片机进入等待方式或节电方式,且又用硬件复位返回到原来的正常操作状态时,由于复位对P2 SFR写入FFH,改变了页地址。因此,在单片机进入等待方式或节电方式之前,也必须先将P2 SFR内容进行保护。当状态恢复进入原正常操作程序入口处时,再恢复P2 SFR的内容。
6 m, M, J( x% M
# I4 z& M$ C% G' E5 S" P8 g s 摘自《嵌入式系统应用》 |
|