历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2021年04月22日 | 8051单片机教程第十课:数据传递类指令

2021-04-22 来源:eefocus

单片机教程第十课数据传递类指令指令


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


MOVXA,@Ri


MOVX@Ri,A


MOVXA,@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单元中。


MOVDPTR,#0100H


MOVXA,@DPTR


MOVDPTR,#0200H


MOVX@DPTR,A


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


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


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


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


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


MOVDPTR,#TABLE


MOVA,R0


MOVCA,@A+DPTR


TABLE:DB0,1,4,9,16,25


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




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


可以通过以下的例子再来看一看标号的含义:


MOVDPTR,#100H


MOVA,R0


MOVCA,@A+DPTR


ORG0100H.


DB0,1,4,9,16,25


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


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


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


堆栈操作


PUSHdirect


POPdirect


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


MOVSP,#5FH


MOVA,#100


MOVB,#20


PUSHACC


PUSHB


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


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


接上例:


POPB


POPACC


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


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


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


例:写出以下程序的运行结果


MOV30H,#12


MOV31H,#23


PUSH30H


PUSH31H


POP30H


POP31H


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


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


推荐阅读

史海拾趣

EMC Technology RF Labs公司的发展小趣事

RF Labs非常重视产品质量和品质保证。他们建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,RF Labs还引进了先进的生产设备和技术,确保产品的质量和性能达到国际先进水平。这些举措使得RF Labs的产品在市场上享有很高的声誉和口碑。

Gemmy Electronics Co Ltd公司的发展小趣事
当老鼠触碰捕鼠器的感应部分(如金属板)时,会触发控制电路,使存储在电容器中的高压电迅速释放。
Austek Microsystems公司的发展小趣事

在追求经济效益的同时,Austek Microsystems也积极履行社会责任。公司严格遵守环保法规,采用环保材料和生产工艺,减少对环境的影响。此外,Austek Microsystems还积极参与公益事业,为社区的发展和进步贡献自己的力量。

这五个故事展示了Austek Microsystems在电子行业中的发展历程和取得的成就。通过创新研发、建立合作伙伴关系、技术升级与产品迭代、市场拓展与品牌建设以及履行社会责任等方式,Austek Microsystems逐渐在市场中崭露头角,成为了电子行业中一颗璀璨的明星。

Glow-Lite Corp公司的发展小趣事

随着产品线的不断丰富和技术实力的不断提升,Austek Microsystems开始积极拓展市场。公司不仅在国内市场取得了良好的销售业绩,还积极开拓海外市场,与多个国家和地区的客户建立了稳定的合作关系。同时,Austek Microsystems还注重品牌建设,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和影响力。

FLIR公司的发展小趣事

随着业务规模的不断扩大,FLIR逐渐将目光投向全球市场。公司在全球范围内建立了多个生产基地和销售服务网络,包括在美国本土的波特兰、波士顿、圣巴巴拉和波兹曼等城市设立的工厂,以及在瑞典斯德哥尔摩和爱沙尼亚塔林等海外地区设立的分支机构。这些生产基地和销售服务网络为FLIR在全球市场的拓展提供了有力支持,使得公司能够更好地服务于全球客户,满足他们多样化的需求。

Antenna Factor公司的发展小趣事

Antenna Factor公司最初由几位热衷于无线通信技术的工程师创立。创业初期,他们面临着资金短缺、技术难题和市场认可度低等多重挑战。然而,他们凭借着对技术的执着和不懈的努力,成功开发出了一款具有高性价比的天线产品,并获得了市场的初步认可。这一突破性的产品为公司的发展奠定了坚实的基础。

问答坊 | AI 解惑

主板的各种类型信号的基本走线要求

下面我就介绍一下本人一年来对主板理解程度.说得不好请大家多多指点:       首先在做图之前应对一些重要信号进行Space设置和一些线宽设置,如果客没有Layoutguaid,这就要求我们自已要有这方面的经验,,一般情况下我们要注意 ...…

查看全部问答>

AC/DC恒流源驱动I

直接在灯头上使用AC电源的照明灯具十分需要应用电路简洁、使用成本低的AC/DC恒流源驱动IC。目前使用的驱动IC大多是从开关电源转用过来的反激式恒流驱动方案,采用隔离降压原理。分成初级侧反馈控制和次级侧反馈控制二类应用,次级侧反馈控制系统精 ...…

查看全部问答>

最近在做平台搭建,想问些问题

作为一个开发环境的搭建者,应该承担的工作有哪些呢,我有点不知道从何入手,导师并没有清楚的讲明白这个问题。…

查看全部问答>

新手提问,minicom

这个也不知道发在哪个小论坛,姑且就在这儿吧,请问有遇到过这个问题的吗? 请问: 对S3C2410开发板进行引导程序烧录时, 出现 welcome to minicom 2.00.0 OPTIONS........ PRESS CTRL-A Z for help on special keys 不管烧录的是VIVI , ...…

查看全部问答>

ARM9开发板启动信息的疑问?

我有块智原的arm9开发板,启动信息如下: Uncompressing Linux............................................................ done, booting the kernel. Linux version 2.4.19-rmk4 (root@Sun) (gcc version 2.95.3 20010315 (release)) #13&nb ...…

查看全部问答>

急求:基于单片机的电感电容表的设计

听说有一个德国人写的方案 用比较器产生振荡   哪位高手知道  帮帮忙 感激不尽  呵呵…

查看全部问答>

急!请问各位高手,什么是键盘过滤器?

  请问一下,什么叫做键盘过滤器?它与键盘记录器和键盘钩子之间有没有关系?谢谢!…

查看全部问答>

有没有可以产生方波信号的IC

除了555,有没有可以产生方波信号的IC,我想用模拟的器件做一个方波信号发生器。希望占空比和频率能调。…

查看全部问答>

有那位ZLG的开发工程师想换工作

想找2名ZLG的兄弟来公司帮忙,有意向的,请发资料fatom.lee@wellida.com…

查看全部问答>

翻箱底儿翻出这个时钟模块

要毕业了,整理下书和工具的东西,准备看看带不走的都送给坛友!~没想到还翻出来一盒这个时钟模块,都忘记了啥时候买的了!~如果论坛DIY的过程中需要时钟显示模块的,我觉得这个是最合适不过的了!~如果论坛哪个DIY的小组需要的,请发帖,我会赠送 ...…

查看全部问答>