|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
MCS-51单片机外部RAM的地址空间为64K,地址总线为16位,访问外接RAM可执行如下4条指令:
' t0 r7 j2 V5 `% `" _MOVX A,@DPTR
5 p# {6 G0 R! H/ }' b' A+ } MOVX @DPTR,A4 p8 ]: b8 u0 i
MOVX A,@RI2 ^; r% O" ~. e! b
MOVX @RI,A
: j" q, Y, U7 Z; x5 Q3 Z3 l* s8 q7 t其中DPTR为16位地址寄存器,地址高8位存于DPH,地址低8位存于DPL;Ri(I=0,1)是8位寄存器,作为地址指针时仅存低8位地址。5 D3 J, y. e ?3 W
MCS-51执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接RAM的数据读/写操作。在这两个阶段,P0口、P1口上的地址选通是有区别的。4 `: w) _+ C( a& K
执行“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的数据信息。
+ Y$ X6 e6 |) u2 X6 I9 M1 c执行“MOVX A,@Ri”和“MOVX @RI,A”指令时,取指阶段舆“movx a, @ dptr”和“movx @ dptr, a”过程完全相同。但在执行对外部RAM的读/写阶段,低8位地址来自Ri;高8位地址来自P2口锁存器(P2 SFR)。. `! q8 t8 x! e- `
由上所述,用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个,大大方便了程序设计。
* j/ L' ]+ `' \" k) y6 k下面以数据块传送子程序为例,说明R0和R1对外接RAM间接寻址的程序设计方法。假定数据块的源首地址为1000H,目的首地址为3045H,数据块长度为50H,程序清单如下所示:
$ y& k) j" p- q0 _; l9 `程序1—用DPTR做地址指针
( U7 C* X) S% e4 O9 n" r7 ZMOV R2,#00H
6 w" d7 f2 Z, VMOV R3,#10H, _; g$ d# b+ |0 a
MOV R4,45H
9 _. t$ T; a4 f1 D2 j. W; X1 f2 |MOV R5,#30H
9 t* h h! n* A# l" ]8 bMOV R7,#50H" z, D6 v; R' J
LOOP: MOV DPL,R27 n3 r4 t6 y: E; j
MOV DPH,R3& A3 R; B% }. @# [3 n
MOVX A,@DPTR
4 E9 E2 E, e1 I INC DPTR
1 K g6 R; ~* ~4 z2 o9 g MOV R2,DPL
; }" ^8 d6 d! P7 R7 \5 p MOV R3,DPH* A0 f' w* S$ q& O
MOV DPL,R46 W* S. r' R$ e' v$ ~
MOV DPH,R5' {0 G; Q: k; Y- p$ v3 P
MOVX @DPTR,A
& H' z5 S4 s- C, z4 {: E | INC DPTR
$ b: v3 {! p) `2 j# [7 s MOV R4,DPL) A$ I% C5 l( `0 \! ^& q
MOV R5,DPH
1 d1 n- [& Z$ ^4 e DJNZ R7,LOOP
1 v- P+ S" a7 B; P( b RET
# v/ N. L6 z: ] 5 T. K d; r( d$ g
程序2—使用R0和R1做地址指针3 A, M; N' n' n; U" g# A
MOV DPTR,#1000H; F: t0 X8 ]; K
MOV P2,#30H
2 A0 M( x4 Q/ LMOV R0,#45H
! v7 L2 R' s& B) E! r# EMOV R7,#50H
+ v7 m) h0 J9 ^# H( yLOOP: MOVX A,@DPTR
$ d6 i8 p3 V6 P* P9 {/ f EMOVX @R0,A4 y# h9 t5 [! C- ?
INC DPTR& q% L( _' K" K
INC R0* u( y0 L; ~; [
DJNZ R7,LOOP
7 b1 z' }7 I/ h( [! V) NRET! o, h. U6 M3 x8 N
程序1用了19条指令,程序2用了10条指令。适当应用R0和R1地址指针,可以大大提高程序运行效率。 S4 ^/ q( T" E) {% t- R' Z
在应用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中。
( {5 S" u; w1 D6 N在中断服务程序中,如果要用到地址指针,必须在保护现场程序段保护使用的地址指针,即使用“PUSH P2”和“PUSH Ri”指令。在中断返回之前又必须在恢复现场程序段恢复使用过的地址指针,即用“POP RI”和“POP P2”指令。" d4 [; O& O0 ~( Q
当单片机进入等待方式或节电方式,且又用硬件复位返回到原来的正常操作状态时,由于复位对P2 SFR写入FFH,改变了页地址。因此,在单片机进入等待方式或节电方式之前,也必须先将P2 SFR内容进行保护。当状态恢复进入原正常操作程序入口处时,再恢复P2 SFR的内容。
/ o, b/ V( U2 e4 {" a $ p- O4 k+ o% m
摘自《嵌入式系统应用》 |
|