51单片机指令系统.docx

上传人:b****7 文档编号:10801626 上传时间:2023-02-23 格式:DOCX 页数:59 大小:158.19KB
下载 相关 举报
51单片机指令系统.docx_第1页
第1页 / 共59页
51单片机指令系统.docx_第2页
第2页 / 共59页
51单片机指令系统.docx_第3页
第3页 / 共59页
51单片机指令系统.docx_第4页
第4页 / 共59页
51单片机指令系统.docx_第5页
第5页 / 共59页
点击查看更多>>
下载资源
资源描述

51单片机指令系统.docx

《51单片机指令系统.docx》由会员分享,可在线阅读,更多相关《51单片机指令系统.docx(59页珍藏版)》请在冰豆网上搜索。

51单片机指令系统.docx

51单片机指令系统

51单片机指令系统

(1)

第十九课:

汇编语言基础

所谓指令,就是规定计算机进行某种操作的命令。

计算机按程序一条一条地依次执行指令,从而完成指定任务。

一条指令只能完成有限的功能,为使计算机完成一定的或者复杂的功能,就需要一系列指令。

一般来说,一台计算机的指令越丰富,寻址方式越多,且每条指令的执行速度越快,则它的总体功能就越强。

程序设计语言:

机器语言

汇编语言

高级语言

我们学习的80C51单片机共有111条指令,这111条指令共有七种寻址方式。

其中:

数据传送类指令  29条

算术运算类指令  24条

逻辑运算及移位类指令  24条

控制转移类指令  17条

位操作指令      17条

这111条指令的具体功能我们在后面的课程中将会逐条的与大家进行分析。

由于计算机只能识别二进制数,所以计算机的指令均由二进制代码组成。

为了阅读和书写的方便,常把它写成十六进制形式,通常称这样的指令为机器指令。

现在一般的计算机都有几十甚至几百种指令。

显然即便用十六进制去书写和记忆也是不容易的,为了便于记忆和使用的方便,制造厂家对指令系统的每一条指令都给出了助记符。

助记符是根据机器指令不同的功能和操作对象来描述指令的符号。

由于助记符是用英文缩写来描述指令的特征,因此它不但便于记忆,也便于理解和分类。

这种用助记符形式来表示的机器指令称为汇编语言指令。

汇编语言有如下特点:

①助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。

②使用汇编语言编程比使用高级语言困难。

因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。

③汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能直接管理和控制硬件设备。

④汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用。

汇编指令的格式

MCS-51汇编语言的语句格式表示如下:

  〔<标号>〕:

<操作码>〔<操作数>〕;〔<注释>〕

  即一条汇编语句是由标号、操作码、操作数和注释四个部分所组成,其中方括号括起来的是可选择部分,可有可无,视需要而定。

指令通常两部份组成:

操作码、操作数

操作码:

是由助记符表示的字符串,操作码其实就是告诉我们这条指令是起什么样的一个功能,是加?

减?

传送?

还是控制?

等等。

操作数:

是指参加操作的数据或者是数据地址。

注释:

为了便于我们阅读程序,通常我们在指令的后面都会加上注释。

标号:

用来表示子程序名称或程序执行条件跳转时的程序跳转地址,实际上是表示一个地址值。

在80C51指令系统中,操作数可以是1、2、3个,也可以没有。

不同功能的指令,操作数作用也不同。

例如,传送类指令多数有两个操作数,写在左面的称为目的操作数(表示操作结果存放的单元地址),写在右面的称为源操作数(指出操作数的来源)。

操作码与操作数之间必须用空格分开,操作数与操作数之间必须用逗号“,”分开。

带方括号的项可有可无,称为可选项。

由指令格式可见,操作码是指令的核心,不可缺少。

例如一条传送指令的书写格式如为:

MOV  A,3AH  ;(3AH)A

它表示将3AH存储单元的内容送到累加器A中。

指令的长度

所谓指令的长度,就是描述一条指令所需要的字节数,用一个字节能描述的指令我们叫1字节指令,同理,用两个字节描述的叫2字节指令,用三个字节描述的指令就叫3字节指令。

在这里我们对80C51的111条指令进行了分类:

1字节指令共有49条

2字节指令共有45条

3字节指令共有17条

到底哪条指令是1字节、2字节或者3字节指令,在我们后面的指令表中都可以查阅到的。

这里有一个问题请大家引起注意,在前面的课程中,我们学习过指令计数器PC,PC是一个16位的计数器,那么这个指令计数器是怎样来计数的呢?

我们的指令有1字节、2字节、3字节指令。

是不是每执行一个字节,这个指令计数器PC就自动加1?

答案是错误的!

实际上,PC始终是跟踪着指令的,并不是以字节数来相加。

在我们存放程序的ROM中,是一个字节一个字节的向后执行,但程序计数器PC并不是每加一个字节就加1,它是对特定的某一条指令执行完了之后,相应的程序计数器PC才加1,那么这条指令可能是1个字节,也可能是2个或者3个字节。

这个大家要引起重视。

在学习指令系统时,先要了解某些符号的意义,现说明如下:

Rn        :

当前选中的工作寄存器组R0-R7(n=0-7)。

它在片内数据存储器中的地址由PSW中的RS1和RS0确定,可以是00H-07H(第0组)、08H-0FH(第1组)、10H-17H(第2组)、18H-1FH(第3组)。

Ri        :

当前选中的工作寄存器组中可作为地址指针的两个工作寄存器R0和R1(i=0或i=1)。

它在片内数据存储器中的地址由RS0及RS1确字,分别为00H、01H;08H、09H;10H、11H;18H、19H。

Direct    :

8位片内RAM单元(包含SFR)的直接地址

#data    :

代表指令中8位的常量数据

#data16  :

代表指令中16位的常量数据

addr16    :

LCALL与LJMP所使用的16位目的地址

addr11    :

ACALL与AJMP所使用的11位目的地址

rel      :

指程序遇条件跳跃时的相对地址,往前最多可以跳128个字节,往后最多可以跳127个字节。

bit      :

特殊目的寄存器或内部数据RAM中可直接寻址的位。

@        :

间接寻址方式中,表示间址寄存器的符号

/        :

位操作指令中,表示对该位先取反再参与操作,但不影响该位原值。

X        :

片内RAM的直接地址或寄存器

(X)    :

在址接寻址方式中,表示直接地址X中的内容;在间接寻址方式中,表示由间址寄存器X指出的地址单元中的内容。

→      :

指令操作流程,将箭头左边的内容送入箭头右边的单元内。

←      :

指令操作流程,将箭头右边的内容送入箭头左边的单元内。

第二十课:

汇编语言及汇编过程

一、汇编程序功能

 

 

汇编指令与机器码指令有一一对应的关系。

汇编程序是一种翻译程序,将源程序翻译成目标程序。

二、汇编程序的汇编过程

汇编有两种方法:

手工汇编、机器汇编。

1、手工汇编:

第一次汇编:

确定地址,翻译成各条机器码,字符标号原样写出;

第二次汇编:

标号代真,将字符标号用所计算出的具体地址值或偏移量代换。

          源程序                地址          目标程序

                                      第一次汇编  第二次汇编

          ORG1000H    

  START:

  MOVR0,BUFFER-1      1000      A82F      A82F

          MOVR2,#00H          1002      7A00      7A00

          MOVA,@R0            1004        E6        E6

          MOVR3,A            1005        FB        FB

          INCR3                1006        0B        0B

          SJMPNEXT            1007      80NEXT    8005

  LOOP;  INCR0                1009        08        08  

          CJNE@R0,#44H,NEXT  100A      B644NEXT  B64401

          INCR2                100D        0A  0A  

  NEXT:

  DJNZR3,LOOP        100E      DBLOOP      DBF9

          MOVRESULT,R2        1010      8A2A      8A2A

          SJMP$                1012      80FE      80FE

  BUFFER  DATA30H      

  RESULT  DATA2AH      

          END

2、机器汇编

两次扫描过程。

第一次扫描:

检查语法错误,确定符号名字;

建立使用的全部符号名字表;

每一符号名字后跟一对应值(地址或数)。

第二次扫描:

是在第一次扫描基础上,将符号地址转换成真地址(代真);

利用操作码表将助记符转换成相应的目标码。

第二十一课:

汇编程序的基本结构

程序编写做到:

占用存储空间少;

运行时间短;

程序的编制、调试及排错所需时间短;

结构清晰,易读、易于移植。

按结构化程序设计思想,任何复杂程序都可由顺序结构、分支结构、循环结构等构成。

如图1所示。

 

 

 

 

一、顺序程序举例

例1、设在外RAM的60H单元存有1个字节代码,要求将其分解成两个4位字段,高4位存入原单元的低4位,其低4位存入61H单元的低4位,且要求这两个单元的高4位均为0,试编制完整程序。

解:

字节分解:

 

 

核心指令  ANL

          ORL1000H

  MODE:

  MODE:

MOVR0,#60H

          MOVXA,@R0

          MOVB,A

          ANLA,#0F0H

          SWAPA

          MOVX@R0,A

          ANLB,#0FH

          MOVA,B

          INCR0

          MOVX@R0,A

          END

二、分支结构与分支程序设计

结构:

根据不同的条件,进行相应的处理。

通常用条件转移指令形成简单分支结构。

如:

判(A)=Z或NZ,转移

判(CY)=1或0,转移

判(bit)=1或0,转移

CJNE比较不相等转移

例3、设a存放在累加器A中,b存放在寄存器B中,要求按下式计算Y值,并将结果Y存于累加器A中,试编写程序。

 

 

解:

本题关键是判a是正数,还是负数;由ACC7便知。

          ORG1000H

      BR:

JBACC7,MINUS

          CLRC

          SUBBA,B

          SJMPDONE

  MINUS:

ADDA,B

    DONE:

SJMP$

          END

例4、设有两个16位无符号数NA,NB分别存放在8031单片机内部RAM的40H、41H及50H、51H单元中,当NA>NB时,将内部RAM的42H单元清0;否则,将该单元置成全1,试编程。

解法I:

因为无16位数的比较指令,所以,只能用8位数的比较指令。

(画出流程框图)

          ORG2000H

    CMP:

MOVA,50H

          CJNEA,40H,CMP1

          MOVA,51H

          CJNEA,41H,CMP1

          SJMPNHIGHE

    CMP1:

JCHIGHE

  NHIGHE:

MOV42H,#0FFH

          SJMPDONE

  HIGHE:

MOV42H,#00H

    DONE:

SJMP$

          END

上述程序中多次用到SJMP语句,该语句为无条件转移语句。

无条件语句应尽量少用,这样可使程序结构紧凑而易读,易理解。

解法II:

先假设NA>NB,再来判断是否NA≤NB

          ORG3000H

    CMP2:

MOVR0,#00H

          MOVA,50H

          CJNEA,40H,CMP3

          MOVA,51H

          CJNEA,41H,CMP3

          SJMPNHIGHE

    CMP3:

JCHIGHE

          NHIGHE:

MOVR0,#0FFH;不大于标志

  HIGHE:

MOV42H,R0

          SJMP$

          END

循环结构不但使程序简练,而且大大节省存储空间。

循环程序包含四部分:

初始化部分

循环处理部分(主体)

循环控制部分(修改地址指针、修改变量、检测循环结束条件)

循环结束部分(对结果分析、处理,存放结果)

循环有:

单循环、多重循环。

循环次数已知,可用计数器控制循环次数;

循环次数未知,按问题条件控制循环是否结束。

一、单循环程序

1、循环次数是已知的程序

例1、已知片外RAM的10H单元存放8位二进制数,要求将其转移成相应的ASCII码,并以高位在前,低位在后的顺序,依次存放到片外RAM以11H为首地址的连续单元中,试编程。

 

 

解:

先将中间单元置成30H,然后判欲转换位是否为1,

若是,则将中间单元内容加1;否则,中间单元内容保持不变。

通过左移指令实现由高到低的顺序进行转换。

        ORG1000H    

  START:

MOVR2,#08H    ;循环计数初值(循环次数已知)

        MOVR0,#10H    ;地址指针初值

        MOVXA,@R0    ;取数

        MOVB,A        ;暂存B中

  LOOP:

MOVA,#30H    ;将中间单元(A)置成30H

        JNBB.7,NA    ;判断转换的二进制位为0否?

                        ;若是转NA

        INCA          ;1的ASCII码“31H”

    NA:

INCR0          ;修改地址指针

        MOVX@R0,A    ;存放转换的结果

        MOVA,B  

        RLA,B        ;作好准备,判断下一位

        MOVB,A        ;暂存

        DJNZR2,LOOP  ;判断转换结束否?

未完继续

        SJMP$  

        END  

2)循环次数未知的程序

例2、设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以20H为首地址的连续单元,该字符串用回车符CR(‘CR’=0DH)作为结束标志,要求统计此字符串的长度并存入内部RAM的1FH单元中。

解:

从首单元开始取数,每取一数判断其是否为‘CR’,是则结束。

        ORG1000H

  STADADATA20H

  SLANGDATA1FH

        MOVR0,#STADA-1

  CMCR2:

MOVB,#0FFH

        INCR0

  CRLOP:

INCB

        MOVXA,@R0

        CJNEA,#0DH,CRLOP

        MOVSLANG,B

        SJMP$

        END

2、多重循环设计

循环体中还包含着一个或多个循环结构,即双重或多重循环。

例3、设8031使用12MHz晶振,试设计延迟100ms的延时程序。

解:

延时程序的延迟时间就是该程序的执行时间,通常采用MOV和DJNZ二指令。

T=12/fosc=12/(12×106)=1us

 

 

内循环延时:

(1+2×CTR)T=500us(假设)

则CTR=250

实际延时:

[1+2×250]×1us=501us

外循环延时:

T+(501+2T)×CTS=100ms=100000us

所以,CTS=198.8取199

实际延时:

[1+(501+2)×199]=1000.98ms

例4、设在8031内部RAM中存一无符号数的数组,其长度为100,起始地址是30H,要求将它们从大到小排序,排序后仍存放在原区域中,试编者按程。

 

 

这就是所畏的“冒泡法”。

实际上大多情况,用不到99次循环,排序就结束。

为了提高排序速度,程序中可设一交换标志位,如10H位,

每次循环中:

若有交换则SETB10H

若无交换则CLR10H

每次循环结束时,测10H位,判断排序是否结束。

          ORG1000H

          MOVR0,#30H

  BUBBLE:

MOVB,#64H

          CLR10H

          DECB

          MOVA,@R0          ;长度计数

    LOOP:

MOV20H,A          ;暂存,为交换作准备

          INCR0

          MOV21H,@R0

          CJNEA,21H,BUEU    ;若(20H)≠(21H)转移

          JNCBUNEXT          ;(20H)≥(21H)转移

    BUEU:

MOVA,@R0          ;若(20H)<(21H)则交换

          MOV@R0,20H

          DECR0              ;使R0退格指向小地址

          MOV@R0,A

          INCR0              ;恢复R0指向大地址

          SETB10H            ;置交换标志

          DJNZB,LOOP

  BUNEXT:

JB10H,BUBBLE      ;判断标志位为1否?

若为1,则继续

          END

第二十二课:

51单片机的寻址方式

学习汇编程序设计,要先了解CPU的各种寻址法,才能有效的掌握各个命令的用途,寻址法是命令运算码找操作数的方法。

指令的寻址方式MOVP1,#0FFH这条指令,第一个词MOV是命令动词,也就是决定做什么事情的,MOV是MOVE少写了一个E,所以就是“传递”,这就是指令,规定做什么事情,数据传递必须要有一个“源”也就是你要送什么数,必须要有一个“目的”,也就是你这个数要送到什么地方去,显然在上面那条指令中,要送的数(源)就是0FFH,而要送达的地方(目的地)就是P1这个寄存器。

寻址方式:

指定操作数所在单元的方法。

注意:

源操作数、目的操作数都有各自的寻址方式。

掌握指令的7种寻址方式的作用以及不同寻址方式所查询的存储空间及范围,对于常用的指令,能够给出指令的寻址方式。

在我们学习的8051单片机中,有7种寻址方法,下面我们将逐一进行分析。

立即寻址

所要找的操作数是一二进制数或十进制数,出现在指令中,用“#”作前缀

MOVA,#20H

在这种寻址方式中,指令多是双字节的,一般第一个字节是操作码,第二个字节是操作数。

该操作数直接参与操作,所以又称立即数,有“#”号表示。

立即数就是存放在程序存储器中的常数,换句话说就是操作数(立即数)是包含在指令字节中的。

例如:

MOV  A,#3AH

这条指令的指令代码为74H、3AH,是双字节指令,这条指令的功能是把立即数3AH送入累加器A中。

MOV  DPTR,#8200H

在前面学单片机的专用寄存器时,我们已学过,DPTR是一个16位的寄存器,它由DPH及DPL两个8位的寄存器组成。

这条指令的意思就是把立即数的高8位(即82H)送入DPH寄存器,把立即数的低8位(即00H)送入DPL寄存器。

这里也特别说明一下:

在80C51单片机的指令系统中,仅有一条指令的操作数是16位的立即数,其功能是向地址指针DPTR传送16位的地址,即把立即数的高8位送入DPH,低8位送入DPL。

直接寻址

指令中直接给出操作数的地址。

MOV    A,30H

MOV  30H,DPH

直接寻址方式是指在指令中操作数直接以单元地址的形式给出,也就是在这种寻址方式中,操作数项给出的是参加运算的操作数的地址,而不是操作数。

例如:

MOV  A,30H  

这条指令中操作数就在30H单元中,也就是30H是操作数的地址,并非操作数。

在80C51单片机中,直接地址只能用来表示特殊功能寄存器、内部数据存储器以及位地址空间,具体的说就是:

1、内部数据存储器RAM低128单元。

在指令中是以直接单元地址形式给出。

我们知道低128单元的地址是00H-7FH。

在指令中直接以单元地址形式给出这句话的意思就是这0-127共128位的任何一位,例如0位是以00H这个单元地址形式给出、1位就是以01H单元地址给出、127位就是以7FH形式给出。

2、位寻址区。

20H-2FH地址单元。

3、特殊功能寄存器。

专用寄存器除以单元地址形式给出外,还可以以寄存器符号形式给出。

例如下面我们分析的一条指令MOV  IE,#85H前面的学习我们已知道,中断允许寄存器IE的地址是80H,那么也就是这条指令可以以MOV  IE,#85H的形式表述,也可以MOV  80H,#85H的形式表述。

关于数据存储器RAM的内部情况,请查看我们课程的第十二课。

直接寻址是唯一能访问特殊功能寄存器的寻址方式!

大家来分析下面几条指令:

MOV  65H,A      ;将A的内容送入内部RAM的65H单元地址中

MOV  A,direct    ;将直接地址单元的内容送入A中

MOV  direct,direct;将直接地址单元的内容送直接地址单元

MOV  IE,#85H      ;将立即数85H送入中断允许寄存器IE

前面我们已学过,数据前面加了“#”的,表示后面的数是立即数(如#85H,就表示85H就是一个立即数),数据前面没有加“#”号的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1