(玩电子) 电子技术学习与研讨
当时方位:单片机教程网 >> 根底教程 >> 阅览文章

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这句话了,咱们是常常需求修正程序的,那多费事,所以就用标号来代替,只需一编译程序,方位就主动发生改变,咱们把这个费事事交给核算机��指咱们用的电脑去做了。

仓库操作

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下履行上面的例程,留意调查内存窗口和仓库窗口的改变。
 

宣布谈论】【告知老友】【保藏此文】【封闭窗口

文章谈论

188bet uedbet 威廉希尔 明升 bwin 明升88 bodog bwin 明升m88.com 18luck 188bet unibet unibet Ladbrokes Ladbrokes casino m88明升 明升 明升 m88.com 188bet m88 明陞 uedbet赫塔菲官网 365bet官网 m88 help
188bet www.188bet.com bwin 平博 unibet 明升 188bet uk Ladbrokes 德赢vwin 188bet m88.com w88 平博88 uedbet体育 188bet 188bet 威廉希尔 明升体育app 平博88 M88 Games vwin德赢 uedbet官网 bodog fun88 188bet