234彩票代理

  • <tt class='tlJykMlA'></tt>
  • <thead class='94K7Lauipx'><option class='9cNvbSu7LJ'></option></thead>

    <em class='jepytdnyfeW3'><b class='oR1Ys12nk'><td class='6rzzLTN'></td></b></em>

  • <dl class='Td0EmkF'><b class='qoWhaibfJ9'></b></dl>

  • <span class='lS1G'></span>

    (玩电子) 电子技术学习与研究
    当前位置:单片机教程网 >> 基础教程 >> 浏览文章

    10课:单片机数据传送类指令

    作者:佚名   来源:本站原创   点击数:x  更新时间:2007年08月15日   【字体:

    单片机的一累加器A与片外RAM之间的一数据传递类指令

    MOVX A,@Ri

    MOVX @Ri,A

    MOVX A,@DPTR

    MOVX @DPTR,A

    说明:
    1)在51系列单片机中,与外部存储器RAM打交道的一只能是A累加器 。所有需要传送入外部RAM的一数据必需要通过A送去,而所有要读入的一外部RAM中的一数据也必需通过A读入 。在此我们能看出内外部RAM的一区别了,内部RAM间能直接进行数据的一传递,而外部则不 行,比如,要将外部RAM中某一单元(设为0100H单元的一数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的一内容读入A,然后再传送到0200H单元中去 。

    要读或写外部的一RAM,当然也必须要知道RAM的一地址,在后两条单片机指令中,地址是被直接放在DPTR中的一 。而前两条指令,由于Ri(即R0或R1)只是一个8位的一寄存器,所以只供给低8位地址 。因 为有时扩展的一外部RAM的一数量比较少,少于或等于256个,就只需要供给8位地址就够了 。

    使用时应当首先将要读或写的一地址送入DPTR或Ri中,然后再用读写命令 。

    例:将单片机外部RAM中100H单元中的一内容送入外部RAM中200H单元中 。

    MOV DPTR,#0100H

    MOVX A,@DPTR

    MOV DPTR,#0200H

    MOVX @DPTR,A

    程序存储器向累加器A传送指令

    MOVC A,@A+DPTR     本指令是将ROM中的一数送入A中 。本指令也被称为单片机查表指令,常用此指令来查一个已做好在ROM中的一表格      说明:

    此条指令引出一个新的一寻址办法:变址寻址 。本指令是要在ROM的一一个地址单元中找出数据,显然必须知道这个单元的一地址,这个单元的一地址是这样确定的一:在执行本指令立脚点DPTR中有一个数,A中有一个数,执行指令时,将A№和DPTR中的一数加起为,就成为要查找的一单元的一地址 。

    查找到的一结果被放在A中,因 此,本条指令执行前后,A中的一值不 一定相同 。

    例:有一个数在R0中,要求用查表的一办法确定它的一平方值(此数的一取▓值范围是0-5)

    MOV DPTR,#TABLE

    MOV A,R0

    MOVC A,@A+DPTR

    TABLE: DB 0,1,4,9,16,25

    设R0中的一值为2,送入A中,而DPTR中的一值则为TABLE,则最终确定的一ROM单元的一地址就是TABLE+2,也就是到这个单元中去取▓数,取▓到的一是4,显然它正是2的一平方 。其它数据也能类推 。
     

    标号的一真实含义:从这个地方也能看到另一个问题,我们使用了标号来替代具体的一单元地址 。事实上    ,标号的一真实含义就是地址数值 。在这里它代表了,0,1,4,9,16,25这几个数据在ROM中存放的一起点位置 。而在以前我们学过的一如LCALL DELAY单片机指令中,DELAY 则代表了以DELAY为标号的一那段程序在ROM中存放的一起始地址 。事实上    ,CPU正是通过这个地址才找到这段程序的一 。

    能通过以下的一例程再来看一看标号的一含义:

    MOV DPTR,#100H

    MOV A,R0

    MOVC A,@A+DPTR

    ORG 0100H.

    DB 0,1,4,9,16,25

    如果R0中的一值为2,则最终地址为100H+2为102H,到102H单元中找到的一是4 。这个能看懂了吧?

    那为什么不 这样写程序,要用标号呢?不 是增加疑惑吗?

    如果这样写程序的一话,在写程序时,我们就必须确定这张表格在ROM中的一具体的一位置,如果写完程序后,又●想在这段程序前插入一段程序,那么这张表格的一位置就又●要变了,要改ORG 100H这句话了,我们是经常需要修改程序的一,那多麻烦,所以就用标号来替代,只要一编译程序,位置就自动发生变化,我们把这个麻烦事交给计算︻机&#0;&#0;指我们用的一电脑去做了 。

    堆栈操作

    PUSH direct

    POP direct

    第一条指令称之为推入,就是将direct中的一内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的一内容送回到direct中 。推入指令的一执行过程是,首先将SP中的一值加1,然后把SP中的一值当作地址,将direct中的一值送进以SP中的一值为地址的一RAM单元中 。例:

    MOV SP,#5FH

    MOV A,#100

    MOV B,#20

    PUSH ACC

    PUSH B

    则执行第一条PUSH ACC指令是这样的一:将SP中的一值加1,即变为60H,然后将A中的一值送到60H单元中,因 此执行完本条指令后, 内存60H单元的一值就是100,同样,执行PUSH B时,是将SP+1,即变为61H,然后将B中的一值送入到61H单元中,即执行完本条指令后,61H单元中的一值变为20 。

    POP指令的一在单片机中执行是这样的一,首先将SP中的一值作为地址,并将此地址中的一数送到POP指令后面的一那个direct中,然后SP减1 。

    接上    例:

    POP B

    POP ACC

    则执行过程是:将SP中的一值(现在是61H)作为地址,取▓61H单元中的一数值(现在是20),送到B中,所以执行完本条指令后B中的一值是20,然后将SP减1,因 此本条指令执行完后,SP的一值变为60H,然后执行POP ACC,将SP中的一值(60H)作为地址,从该地址中取▓数(现在是100),并送到ACC中,所以执行完本条指令后,ACC中的一值是100 。

    这有什么意义呢?ACC中的一值本来就是100,B中的一值本来就是20,是的一,在本例中,的一确没有意义,但在实际工作中,则在PUSH B后一般要执行其他指令,而且这些指令会把A中的一值,B中的一值改掉,所以在程序的一结束,如果我们要把A№和B中的一值恢复原值,那么这些指令就有意义了 。

    还有一个问题,如果我不 用堆栈,比如说在PUSH ACC指令处用MOV 60H,A,在PUSH B处用指令MOV 61H,B,然后用MOV A,60H,MOV B,61H来替代两条POP指令,不 是也一样吗?是的一,从结果上    看是一样的一,但是从过程看是不 一样的一,PUSH№和POP指令都是单字节,单周期指令,而MOV指令则是双字节,双周期指令 。更何况,堆栈的一作用不 止于此,所以一般的一计算︻机上    都设有堆栈,单片机也是一样,而我们在编写子程序,需要保存数据时,常常也不 采用后面的一办法,而是用堆栈的一办法来实现 。

    例:写出以下单片机程序的一运行结果

    MOV 30H,#12

    MOV 31H,#23

    PUSH 30H

    PUSH 31H

    POP 30H

    POP 31H

    结果是30H中的一值变为23,而31H中的一值则变为12 。也就两者进行了数据交换 。从这个例程能看出:使用堆栈时,入栈的一书写次序№和出栈的一书写次序必须相反,才能保证数据被送回原位,不 然就要出错了 。

    作业:在MCS51下执行上    面的一例程,注意观察内存窗口№和堆栈窗口的一变化 。
     

    发表评论】【告诉好友】【收藏此文】【关闭窗口

    文章评论