找回密码
 注册
关于网站域名变更的通知
查看: 259|回复: 2
打印 上一主题 下一主题

MCS-51单片机地址指针及其应用

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-8-15 15:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
MCS-51单片机外部RAM的地址空间为64K,地址总线为16位,访问外接RAM可执行如下4条指令:5 _# l3 @: F5 O
MOVX A,@DPTR, f* Z& m% k. L' s
   MOVX      @DPTR,A
; ]5 ^2 u0 J9 R8 r5 K- @MOVX    A,@RI
- K7 o: Y% T0 ~( K0 WMOVX    @RI,A
6 z* A6 [: s- p3 E+ [" s其中DPTR为16位地址寄存器,地址高8位存于DPH,地址低8位存于DPL;Ri(I=0,1)是8位寄存器,作为地址指针时仅存低8位地址。! z# e3 ^- O4 ?6 v2 B: F
MCS-51执行上述指令时分为两个阶段:首先,是从外接程序存储器中取出指令代码,并进行分析。然后,执行对外接RAM的数据读/写操作。在这两个阶段,P0口、P1口上的地址选通是有区别的。
' K# V0 B9 q) r6 O. F- _执行“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- B6 j$ n4 U( i; C( M# [
执行“MOVX        A,@Ri”和“MOVX     @RI,A”指令时,取指阶段舆“movx a, @ dptr”和“movx @ dptr, a”过程完全相同。但在执行对外部RAM的读/写阶段,低8位地址来自Ri;高8位地址来自P2口锁存器(P2 SFR)。
7 z. c2 j/ |2 M由上所述,用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* u# g( l5 n2 U' }- B下面以数据块传送子程序为例,说明R0和R1对外接RAM间接寻址的程序设计方法。假定数据块的源首地址为1000H,目的首地址为3045H,数据块长度为50H,程序清单如下所示:
1 \' w$ }% l5 S2 Q/ U$ I8 C$ T程序1—用DPTR做地址指针0 X, D9 A- x" B3 x4 f" |) b
MOV      R2,#00H7 `- s+ l# V- g2 O7 z
MOV      R3,#10H
% X1 B8 s+ W0 n4 o! DMOV      R4,45H, ~% S3 m; Q" A
MOV      R5,#30H' r% h, c% b6 J. C5 v, p
MOV      R7,#50H
; x2 K$ H) L# T! m- {" A, ?& ]LOOP:    MOV      DPL,R2
* @7 D* u' G/ C               MOV      DPH,R3
' S4 ^8 J& Q% Y/ I3 X               MOVX    A,@DPTR! b- S  ]4 w; w. ~1 G. N# [
               INC         DPTR& M" I9 m8 y  J5 i, @5 {
               MOV      R2,DPL
7 z: e2 n, o. a& r, \               MOV      R3,DPH
! {4 j4 d; {4 w  Q" {               MOV      DPL,R4
. c: a2 ~, Y" k. b) p/ c0 F               MOV      DPH,R5" N* [/ S4 l% N* q  b
               MOVX    @DPTR,A
! a* R% B" Y4 S$ c( Q$ s1 N               INC         DPTR
# r% y% @$ t; ?: j* \- R               MOV      R4,DPL
% S" O, h4 e) h. ?& N               MOV      R5,DPH
( H4 s" I- R9 u% d1 H, W+ H; K3 i               DJNZ      R7,LOOP+ _" g, ^- ?' i5 |9 D$ g6 |/ B
               RET
5 ]/ Q9 h. K, ~) z+ M7 M- u
$ W2 _- o7 b4 u% o. Q% {程序2—使用R0和R1做地址指针& N8 b8 L* L4 I9 X" X4 U7 o
MOV      DPTR,#1000H
% V9 I3 P9 h# w; x# SMOV      P2,#30H9 O! O: l: C; o8 O4 l9 R- x7 J' J$ V
MOV      R0,#45H; Z1 w* E; E3 O: P, z4 t6 [# h
MOV      R7,#50H
# T2 v& G/ T0 l1 O1 u6 Y3 mLOOP:    MOVX    A,@DPTR
+ w6 b) Z( ~1 @  d- i9 F* KMOVX    @R0,A+ N, {* D1 G- W$ _1 Y
INC         DPTR
7 d+ f9 x! O, j& S- I  a" k# O7 `INC         R0
% |6 }+ U: V% UDJNZ      R7,LOOP
* x2 ]+ Y2 }- LRET8 T3 ^7 o* V9 G; w/ i3 J! H9 j0 v
程序1用了19条指令,程序2用了10条指令。适当应用R0和R1地址指针,可以大大提高程序运行效率。% v0 V( D2 j; a& u2 U* 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中。; j$ ^9 m2 ^$ i, V5 O) a, \; {
在中断服务程序中,如果要用到地址指针,必须在保护现场程序段保护使用的地址指针,即使用“PUSH P2”和“PUSH Ri”指令。在中断返回之前又必须在恢复现场程序段恢复使用过的地址指针,即用“POP RI”和“POP P2”指令。
6 F8 i1 I$ O5 v1 ?; S当单片机进入等待方式或节电方式,且又用硬件复位返回到原来的正常操作状态时,由于复位对P2 SFR写入FFH,改变了页地址。因此,在单片机进入等待方式或节电方式之前,也必须先将P2 SFR内容进行保护。当状态恢复进入原正常操作程序入口处时,再恢复P2 SFR的内容。
8 K! q8 A' v0 u3 H, A
7 r2 o' _$ K. m                                            摘自《嵌入式系统应用》

该用户从未签到

2#
发表于 2016-8-16 09:33 | 只看该作者
资源多,学习不止步,共同进步; r6 P- V3 N4 f2 B* d

该用户从未签到

3#
发表于 2019-1-25 14:08 | 只看该作者
不错,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-17 11:50 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表