EDA365电子工程师网

标题: MCS-51单片机地址指针及其应用 [打印本页]

作者: Dedy01    时间: 2016-8-15 15:03
标题: MCS-51单片机地址指针及其应用
MCS-51单片机外部RAM的地址空间为64K,地址总线为16位,访问外接RAM可执行如下4条指令:7 ?2 @, E" t: Z( m5 D1 T
MOVX A,@DPTR. k/ W; ~6 L2 f8 {" B8 Y) [+ u
   MOVX      @DPTR,A8 N# |1 z& f1 Q$ m( S8 K
MOVX    A,@RI
5 e/ v9 h, P- W1 pMOVX    @RI,A
3 S9 \. F4 i  g3 Q2 W其中DPTR为16位地址寄存器,地址高8位存于DPH,地址低8位存于DPL;Ri(I=0,1)是8位寄存器,作为地址指针时仅存低8位地址。" X" ~$ v0 w0 u2 a6 \
MCS-51执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接RAM的数据读/写操作。在这两个阶段,P0口、P1口上的地址选通是有区别的。
  T1 q' |8 {7 S, U. Y- w7 p执行“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的数据信息。
/ ?( L3 p: O& d  m7 e" a) `, f执行“MOVX        A,@Ri”和“MOVX     @RI,A”指令时,取指阶段舆“movx a, @ dptr”和“movx @ dptr, a”过程完全相同。但在执行对外部RAM的读/写阶段,低8位地址来自Ri;高8位地址来自P2口锁存器(P2 SFR)。
- a* ^6 O  S6 c6 F, T3 d由上所述,用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个,大大方便了程序设计。
7 P6 R' E( w, V1 W$ t下面以数据块传送子程序为例,说明R0和R1对外接RAM间接寻址的程序设计方法。假定数据块的源首地址为1000H,目的首地址为3045H,数据块长度为50H,程序清单如下所示:& c  T1 `' D8 a& X
程序1—用DPTR做地址指针& Z, F' A% }1 \% U$ C
MOV      R2,#00H6 s; G, |+ V/ H' K; \
MOV      R3,#10H
9 x4 J& M( c3 g8 r2 P0 oMOV      R4,45H( Z, P5 B2 [9 M- D+ e+ S6 y* Y  k
MOV      R5,#30H
+ x6 a- Z5 A8 TMOV      R7,#50H
# X) n3 Z* e9 s) v, BLOOP:    MOV      DPL,R2* Q7 H5 b; N# X8 e# j
               MOV      DPH,R30 i! F* J$ v2 i
               MOVX    A,@DPTR3 z( x4 L  B7 ]8 S4 g4 m- `
               INC         DPTR
; U; t. R6 s4 ~6 [- l               MOV      R2,DPL/ E& t, z# P7 R( u8 _
               MOV      R3,DPH
% M" v& s  D( m. {               MOV      DPL,R4
' ?; B% a7 ^" C4 t9 w               MOV      DPH,R56 w+ v  }4 N3 ?! _4 m7 d
               MOVX    @DPTR,A) J! y/ E9 i5 v( g
               INC         DPTR# E6 \5 C: f6 l! f3 b' _
               MOV      R4,DPL" G! b+ X" y; Q- W% P
               MOV      R5,DPH6 H! Q# E. y; Q  b
               DJNZ      R7,LOOP
) k& E9 y; ^" G# t1 Q" I               RET
* j. [3 ~, Y. c $ Y7 N" p7 j/ k
程序2—使用R0和R1做地址指针
! m$ T% M& k. [5 `* OMOV      DPTR,#1000H
' N* `6 O5 U6 }  _2 cMOV      P2,#30H8 |- l( Q; Z! v- {, V5 a
MOV      R0,#45H9 V+ h4 d$ k* t2 c
MOV      R7,#50H" y$ b& ^) B& r4 g- a
LOOP:    MOVX    A,@DPTR. D) l0 [2 J4 h5 h
MOVX    @R0,A
* a5 p5 H& M. |& V6 D; x% OINC         DPTR
, F, h8 }7 s1 k# X: I; {INC         R0
& U0 a  c0 z. F0 }, m& H, Q9 sDJNZ      R7,LOOP
4 S: }8 V/ _  v7 N* m4 SRET: k$ i; X3 H3 Z, h# r
程序1用了19条指令,程序2用了10条指令。适当应用R0和R1地址指针,可以大大提高程序运行效率。4 ]; P0 \& g" S; I
在应用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中。' r& A. R: U& ~- i7 z  q
在中断服务程序中,如果要用到地址指针,必须在保护现场程序段保护使用的地址指针,即使用“PUSH P2”和“PUSH Ri”指令。在中断返回之前又必须在恢复现场程序段恢复使用过的地址指针,即用“POP RI”和“POP P2”指令。
. K, y; C1 B" T) z2 i当单片机进入等待方式或节电方式,且又用硬件复位返回到原来的正常操作状态时,由于复位对P2 SFR写入FFH,改变了页地址。因此,在单片机进入等待方式或节电方式之前,也必须先将P2 SFR内容进行保护。当状态恢复进入原正常操作程序入口处时,再恢复P2 SFR的内容。
6 @2 j: {% O1 p' V0 X' P* r + W8 l3 q# O2 u4 m
                                            摘自《嵌入式系统应用》
作者: helendcany    时间: 2016-8-16 09:33
资源多,学习不止步,共同进步
5 S5 w/ i5 D. _0 b7 K& C




欢迎光临 EDA365电子工程师网 (http://bbs.elecnest.cn/) Powered by Discuz! X3.2