问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

51单片机的基本运算指令详解

创作时间:
作者:
@小白创作中心

51单片机的基本运算指令详解

引用
CSDN
1.
https://m.blog.csdn.net/z317920/article/details/139044396

51单片机(8051系列)是一种广泛应用于嵌入式系统和控制领域的微控制器。其基本运算指令是进行程序开发的基础,涵盖了从基本的算术运算到复杂的逻辑控制等多个方面。本文将详细介绍51单片机的各种基本运算指令,包括加法、减法、乘法、除法、位移、逻辑运算、控制转移类指令以及子程序调用和返回指令。

一、加法指令

加法指令用于将两个数相加并将结果保存到指定的寄存器或存储器中。包括ADD和ADDC指令。

1.1 ADD(不带进位标志位的加法,类似与半加器)

ADD的语法格式如下:

ADD    A,#data8       例: ADD    A,#10
ADD    A,direct            ADD    A,30H
ADD    A,Rn                ADD    A,R3
ADD    A,@Ri               ADD    A,@R0  

观察ADD的使用格式,第一个操作数被限定为累加器A,而源操作数可以为8位的数据,也可以是单元地址,或寄存器,亦或是寄存器间接寻址。下面实现将R0,R1之和保持到R2中,代码如下:

MOV R0,#30H
MOV R1,#40H
MOV A,R0
ADD A,R1
MOV R2,A
END  

不难发现,R2的结果应该为O30H+O40H=O*70H,运行代码,观察结果如图所示:

1.2 ADDC(带进位标志位的加法,类似与全加器)

ADDC是一种字节加法,而ADDC的语法格式如下:

ADDC    A,#data8       例: ADDC    A,#10
ADDC    A,direct            ADDC    A,30H
ADDC    A,Rn                ADDC    A,R1
ADDC    A,@Ri               ADDC    A,@R0  

执行ADDC指令后的结果为:A=A+#data+cy——cy为进位标志位。注意低8位的加法使用ADD指令,下面计算O1255H+O3122H的加法计算,代码如下:

MOV R0,#55H     ;1255H+3122H 
MOV A,#22H
ADD A,R0
MOV 30H,A       
MOV R0,#12H
MOV A,#31H
ADDC A,R0       
MOV 31H,A      
MOV A,#0
ADDC A,#0       
MOV 32H,A
END  

这是一种字的加法,需要分高低次位分开进行运算 ,期间需要考虑有无进位的情况。低8位加法使用ADD指令,计算后可能项高位产生进位;所以在计算高八位的加法时需要使用ADDC指令,计算完成后还需要考虑高位的加法是否会产生进位,这时需要对A置换零,取出cy的值,采用MOV A,#0 ADDC A,#0 实现,结果如图所示:

1.3 INC加一指令

INC指令可以与C语言中的++类比,功能上是相同的。INC的语法格式如下:

INC    A
INC    Rn
INC    @Ri
INC    direct
INC    DPTR  

二、减法指令

减法指令用于将一个数减去另一个数并将结果保存到指定的寄存器或存储器中。

2.1 SUBB(带借位标志位的减法)

SUBB的语法格式如下:

SUBB   A,#data8       例:  SUBB   A,#10
SUBB   A,direct             SUBB    A,30H
SUBB    A,Rn                SUBB   A,R3
SUBB    A,@Ri               SUBB    A,@R0  

注意首次使用SUBB指令需要对cy清零,即CLR C。 下面计算O19H-o55H,代码如下:

MOV R0,#55H
MOV A,#19H
SUBB A,R0     ;A=A-R0-cy
MOV 30H,A
MOV A,#0
ADDC A,#0     
MOV 31H,A
END  

小数-大数,会产生借位,计算结果如图所示:

2.2 DEC减一指令

DEC指令可以与C语言中的--类比,功能上是相同的。DEC的语法格式如下:

DEC    A
DEC    Rn
DEC    @Ri
DEC    direct
DEC    DPTR  

注意:不能对DPTR单独减一。

三、乘法指令

乘法指令用于将两个数相乘并将结果保存到指定的寄存器或存储器中。

3.1 MUL

乘法和除法指令都只有唯一一条,而MUL的语法格式如下:

MUL AB  

乘法结果的低8位存放到累加器A,高8位存放到寄存器B中,下面计算O52H * O65H,代码如下:

MOV B,#65H     
MOV A,#52H
MUL AB
MOV 30H,A       
MOV 31H,B
END  

结果如图所示:

四、除法指令

除法指令用于将一个数除以另一个数并将结果保存到指定的寄存器或存储器中。

4.1 DIV

DIV的语法格式如下:

DIV    AB  

除法的结果:商存放在累加器A中,余数存放到寄存器B中,下面使用DIV指令计算O66H/O11H,代码如下:

MOV B,#11H     
MOV A,#67H     
DIV AB
MOV 30H,A       
MOV 31H,B
END  

结果如图所示:

五、位移指令

位移指令用于对一个数进行左移或右移操作,并将结果保存到指定的寄存器或存储器中。注意,位移类指令只能对累加器A进行移位。数值较小的时候,左移相当于乘2,右移相当于除2。

5.1 RL左移指令

RL的语法格式如下:

RL    A  

左移的实现如图所示:

5.2 RLC,带进位标志位的左移指令

RLC的语法格式如下:

RLC    A  

带进位标志位的左移的实现如图所示:

5.3 RR右移指令

RR的语法格式如下:

RR    A  

右移的实现如图所示:

5.4 RRC,带进位标志位的右移指令

RRC的语法格式如下:

RRC    A  

带进位标志位的右移的实现如图所示:

5.5 字的左移

将O7496H进行左移,将O7496H转为二进制是:01110100 10010110 ,进行左移后(带cy)的结果为:0(cy) 11101001 00101100。换算16进制为:O*E92CH。过程图如下:

代码如下:

MAIN:
MOV R0,#96H   ;R0为低8位
MOV R1,#74H   ;R1为高8位
MOV A,R0
CLR C          
RLC  A        ;低位左移,低位的最高位进cy  
MOV R0,A      
MOV A,R1
RLC A          ;高位左移,低位的最高位进高位的最低位,高位的最高位进cy
MOV R1,A
END  

结果如图所示:

六、逻辑运算指令

逻辑运算指令包括与、或、非、异或等逻辑运算指令,用于对两个数进行逻辑运算,并将结果保存到指定的寄存器或存储器中。

6.1 ANL

与指令ANL,即:有0则0,无0为1,可用于清零。ANL的语法格式如下:

ANL   A,#data8       
ANL   A,direct             
ANL   A,Rn                
ANL   A,@Ri     

6.2 ORL

位或指令ORL,即:有1则1,无1为0,可用于置一。ORL的语法格式如下:

ORL   A,#data8       
ORL   A,direct             
ORL   A,Rn                
ORL   A,@Ri    

6.3 XRL

按位异或指令XRL,即:不同为1,可用于取反。XRL的语法格式如下:

XRL   A,#data8       
XRL   A,direct             
XRL   A,Rn                
XRL   A,@Ri    

七、控制转移类指令

7.1 无条件跳转指令

无条件跳转指令的操作数是单目操作数,无条件跳转指令包含以下:

  • SJMP ——短跳转,范围:-128——127
  • AJMP——相对跳转,范围:2KB
  • LJMP——长跳转,范围:64KB

7.2 有条件跳转指令

有条件跳转指令包含以下:

  • JC——无进位/借位则跳转,cy=0
  • JNC——有进位/借位则跳转,cy=1
  • JZ——为零则跳转
  • JNZ——不为零则跳转
  • JB——判断该位为1则转移
  • JNB——判断该位为0则转移
  • JBC——判断该位为1则转移,同时将该位置0
  • CJNE——比较不等则跳转指令,三目操作符,
  • CJNE Rn,#data8,rel(跳转名称)
  • CJNE A,#data8,rel
  • CJNE A,direct,rel
  • DJNZ——减一不为0则跳转指令

八、子程序调用和返回指令

8.1 子程序调用指令

  • ACALL——短调用,范围:2KB
  • LCALL——长调用,范围:64KB

8.2 子程序返回指令

  • RET——子程序返回指令,也是子程序的结束
  • RETI——中断子程序返回指令,也是中断服务子程序的结束

总结

本文介绍了51单片机的基本运算指令,具体运用依照实际情况来看。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号