<meta name="keywords" content="必胜时时彩开户,keywords" /> 8课:单片机寻址要领与指令系统 联系我们

8课:单片机寻址要领与指令系统

   经由历程前面的学习,我们曾经明确了单片机外部的结构,而且也曾经知道,要控制单片机,让它为我们干学,要用指令,我们已学了几条指令,但很琐屑,从现在泉源,我们将要系统地学习8051单片机的指令部门。

一、概述

1、指令的名堂

   我们已知,要让盘算机做事,就得给盘算机以指令,而且我们已知,盘算机很“笨”,只能明确数字,如前面我们写进机械的75H,90H,00H等等,以是指令的第一莳名堂就是机械码名堂,也说是数字的形式。但这类形式着实是尴尬我们人了,太难记了,于是有此外一莳名堂,助记符名堂,如MOV P1,#0FFH,这样就好记了。 这两莳名堂之间的关系呢,我们不难明得,本质上它们完全等价,只是形式纷歧样而已。

2、汇编

  我们写指令应用汇编名堂,而盘算机和单片机只懂机械码名堂,以是要将我们写的汇编名堂的指令转换为机械码名堂,这类转换有两种措施:手工汇编和机械汇编。手工汇编现实上就是查表,由于这两莳名堂纯粹是名堂纷歧样,以是是逐一对应的,查一张表格就好了。不外手工查表总是嫌费事,以是就有了盘算机软件,用盘算机软件来替换手工查表,这就是机械汇编。

二、单片机的寻址

  让我们先来温习一下我们学过的一些指令:MOV P1,#0FFH,MOV R7,#0FFH这些指令都是将一些数据送到对应的职位中去,为甚么要送数据呢?第一个由于送入的数能让灯全灭掉落落,第二个是为了要完成延时,从这里我们能看出来,在用单片机的编程语言编程时,经常要用到数据的转达,现实上数据转达是单片机编程时的一项主要使命,一共有28条指令(单片机共111条指令)。下面我们就从数据转达类指令泉源吧。

  剖析一下MOV P1,#0FFH这条指令,我们不名贵出结论,第一个词MOV是敕令动词,也就是决议做甚么使命的,MOV是MOVE少写了一个E,以是就是“转达”,这就是指令,划定做甚么使命,前面尚有一些参数,剖析一下,数据转达必须要有一个“源”也就是你要送甚么数,必须要有一个“目的”,也就是你这个数要送到甚么地方去,显着不才面那条单片机指令中,要送的数(源)就是0FFH,而要投递的地方(目的地)就是P1这个存放器。在数据转达类指令中,均将目的地写在指令的前面,而将源写在最后。

  这条指令中,送给P1是这个数自己,换言之,做完这条指令后,我们能明确地知道,P1中的值是0FFH,但是着实不是任甚么时间辰都能直接给出数自己的。例如,在我们前面给出的单片机延时轨尺度是这样写的:

MAIN: SETB P1.0     ;(1)

   LCALL DELAY ;(2)

    CLR P1.0      ;(3)

   LCALL DELAY   ;(4)

    AJMP MAIN    ;(5)

;以下子法式模范模范

DELAY: MOV R7,#250   ;(6)

D1: MOV R6,#250   ;(7)

D2: DJNZ R6,D2    ;(8)

   DJNZ R7,D1   ;(9)

   RET        ;(10)

   END        ;(11)

表1

-----------------------------------------------------

 MAIN: SETB P1.0     ;(1)

   MOV 30H,#255

    LCALL DELAY ;

    CLR P1.0      ;(3)

    MOV 30H,#200

    LCALL DELAY   ;(4)

    AJMP MAIN    ;(5)

;以下子法式模范模范

DELAY: MOV R7,30H   ;(6)

D1: MOV R6,#250   ;(7)

D2: DJNZ R6,D2    ;(8)

   DJNZ R7,D1   ;(9)

   RET        ;(10)

   END        ;(11)

表2

 这样一来,我每次挪用延时法式模范模范延时的时间都是类似的(年夜致都是0.13S),假定我提出这样的请求:灯亮后延不时间为0.13S灯灭,灯灭后延时0.1秒灯亮,云云循环,这样的法式模范模范还能知足请求吗?不克不及,怎样办?我们能把延时法式模范模范改成这样(见表2):挪用则见表2中的主程,也就是先把一个数送入30H,在子法式模范模范中R7中的值着实不结实,而是凭证30H单元中传已往的数一定。这样便可以知足请求。

 

   从这里我们能得出结论,在数据转达中要找到被转达的数,许多时间,这个数着实不克不及直接给出,须要变换,这就引出了一个看法:若何寻觅操作数,我们把寻觅操作数所在单元的地址称之为寻址。在这里我们直接应用数所在单元的地址找到了操作数,以是称这类措施为直接寻址。除这类措施以外,尚有一种,假定我们把数放在使命存放器中,从使命存放器中寻觅数据,则称之为存放器寻址。例:MOV A,R0就是将R0使命存放器中的数据送到累加器A中去。提一个效果:我们知道,使命存放器就是内存单元的一部门,假定我们选择使命存放器组0,则R0就是RAM的00H单元,那么这样一来,MOV A,00H,和MOV A,R0不就没甚么差异了吗?为甚么要加以差异呢?着实着实,这两条指令推行的效果是完全类似的,都是将00H单元中的内容送到A中去,但是推行的历程纷歧样,推行第一条指令须要2个周期,而第二条则只须要1个周期,第一条指令酿成事实的目的码要两个字节(E5H 00H),而第二条则只需一个字节(E8h)便可以了。

 

  这么锱铢必较!不就差了一个周期吗,假定是12M的晶体震惊器的话,也就1个微秒时间了,一个字节又能有若干?

   纰谬,假定这条指令只推行一次,或许无所谓,但一条指令假定推行上1000次,就是1毫秒,假定要推行1000000万次,就是1S的误差,这就很可不雅不雅了,单片机做的是实时控制的事,以是必须云云“锱铢必较”。字节数异常云云。

再来提一个效果,现在我们已知,寻觅操作数能经由历程直接给的要领(急速寻址)和直接给出数所在单元地址的要领(直接寻址),这就够了吗?

看这个效果,请求从30H单元泉源,取20个数,划分送入A累加器。

   就我们现在控制的措施而言,要从30H单元取数,就用MOV A,30H,那么下一个数呢?是31H单元的,怎样取呢?还是只能用MOV A,31H,那么20个数,不是得20条指令才干写完吗?这里只需20个数,假定要送200个或2000个数,那岂不要写上200条或2000条敕令?这难免难免太笨了吧。为甚么会泛起这样的状态?是由于我们只会把地址写在指令中,以是就没措施了,假定我们不是把地址直接写在指令中,而是把地址放在另外一个存放器单元中,凭证这个存放器单元中的数值决议该到哪个单元中取数据,好比,以后这个存放器中的值是30H,那么就到30H单元中去取,假定是31H就到31H单元中去取,便可以处置赏罚赏罚这个效果了。怎样个处置赏罚赏罚法呢?既然是看的存放器中的值,那么我们便可以经由历程一定的措施让这外面的值发生变换,好比取完一个数后,将这个存放器单元中的值加1,还是推行统一条指令,可是取数的工具却纷歧样了,不是吗。经由历程例程来诠释吧。

MOV R7,#20

   MOV R0,#30H

LOOP:MOV A,@R0

   INC R0

   DJNZ R7,LOOP

    这个例程中年夜部门指令我们是能看懂的,第一句,是将急速数20送到R7中,推行完后R7中的值应当是20。第二句是将急速数30H送入R0使命存放器中,以是推行完后,R0单元中的值是30H,第三句,这是看一下R0单元中是甚么值,把这个值作为地址,取这个地址单元的内容送入A中,此时,推行这条指令的效果就相当于MOV A,30H。第四句,没学过,就是把R0中的值加1,是以推行完后,R0中的值就是31H,第五句,学过,将R7中的值减1,看能否即是0,不即是0,则转到标号LOOP处一连推行,是以,推行完这句后,将转去推行MOV A,@R0这句话,此时相当于推行了MOV A,31H(由于此时的R0中的值已是31H了),云云,直到R7中的值逐次相减即是0,也就是循环20次为止,就完成了我们的请求:从30H单元泉源将20个数据送入A中。

这也是一种寻觅数据的措施,由于数据是直接地被找到的,以是就称之为间址寻址。重视,在间址寻址中,只能用R0或R1存放等寻觅的数据。