您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《单片机原理与应用》 > 第3章 MCS-51单片机指令系统

第5节 单片机做加、减、乘、除运算

  3.2.1 硬件电路

  硬件电路采用实验开发板上的电路,如图3.4所示。

  

 

  图3.4 单片机做加、减、乘、除运算的电路图

  工作原理

  利用P0口、P2口外接的拨动开关设制运算的数据,利用单片机的算术运算指令进行加、减、乘、除运算,并将结果送P1口发光二极管显示。

  3.2.2 程序设计

  1. 加法运算程序

  ORG 0000H

  MOV A,P0

  MOV R0,P2

  ADD A,R0

  MOV P1,A

  SJMP $

  END

  2. 减法运算程序

  ORG 0000H

  MOV A,P0

  MOV R0,P2

  SUBB A,R0

  MOV P1,A

  SJMP $

  END

  3. 乘法运算程序

  ORG 0000H

  MOV A,P0

  MOV B,P2

  MUL AB

  MOV P1,A

  SJMP $

  END

  4. 除法运算程序

  ORG 0000H

  MOV A,P0

  MOV B,P2

  DIV AB

  MOV P1,A

  SJMP $

  END

  3.2.3 源程序的编辑、编译、下载

  打开“伟福”模拟仿真软件进行程序的编辑、编译。

  打开“ISP下载软件”将目标文件下载到ISP-4实验开发板上的AT89S51单片机芯片,观察程序运行结果。

  3.2.4 相关知识

  前面的任务里,在加、减、乘、除的过程中,只要改变P0、P2口数据发光二极管的亮灭就发生变化,下面我们来分析任务实现的过程。

  1. 单片机是怎样做加、减、乘、除运算的?

  在单片机CPU内部集成的算术运算部件(主要有加法器和乘法器、除法器),可以完成加、减、乘、除运算,单片机的算术运算指令经过指令译码器译码后产生的控制信号控制算术运算部件工作产生运算结果。

  2. MCS-51单片机有哪些算术运算指令?

  MCS-51单片机算术运算指令共有24条,算术运算主要是执行加、减、乘、除法四则运算。另外MCS-51指令系统中有相当一部分是进行加、减1操作,BCD码的运算和调整,我们都归类为运算指令。虽然MCS-51单片机的算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位标志C,则可进行多字节无符号整数的运算。同时利用溢出标志,还可以对带符号数进行补码运算。需要指出的是,除加、减1指令外,这类指令大多数都会对PSW(程序状态字)有影响。这在使用中应特别注意。

  (1) 不带进位的加法指令(4条)

  这4条指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器A的内容相加,运算结果存在A中。

  ADD A,#data ;(A)+#data→(A) 累加器A中的内容与立即数#data相加,结果存在A中

  ADD A,data ;(A)+(data)→(A) 累加器A中的内容与直接地址单元中的内容相加,结果存在A中

  ADD A,Rn ;(A)+(Rn)→(A) 累加器A中的内容与工作寄存器Rn中的内容相加,结果存在A中

  ADD A,@Ri ;(A)+((Ri))→(A) 累加器A中的内容与工作寄存器Ri所指向地址单元中的内容相加,结果存在A中

  如任务中“加法程序”里 MOV A,P0

  MOV R0,P2

  ADD A,R0

  就是将P0口与P2口的内容相加。

  (2) 带进位的加法指令(4条)

  这4条指令除与[1]功能相同外,在进行加法运算时还需考虑进位问题。

  ADDC A,data ;(A)+(data)+(C)→(A) 累加器A中的内容与直接地址单元的内容连同进位位相加,结果存在A中

  ADDC A,#data ;(A)+#data +(C)→(A) 累加器A中的内容与立即数连同进位位相加,结果存在A中

  ADDC A,Rn ;(A)+Rn+(C)→(A) 累加器A中的内容与工作寄存器Rn中的内容、连同进位位相加,结果存在A中

  ADDC A,@Ri ;(A)+((Ri))+(C)→(A) 累加器A中的内容与工作寄存器Ri指向地址单元中的内容、连同进位位相加,结果存在A中

  (3) 带借位减法指令(4条)

  这组指令包含立即数、直接地址、间接地址及工作寄存器与累加器A连同借位位C内容相减,结果送回累加器A中。

  这里我们对借位位C的状态作出说明,在进行减法运算中,CY=1表示有借位,CY=0则无借位。OV=1声明带符号数相减时,从一个正数减去一个负数结果为负数,或者从一个负数中减去一个正数结果为正数的错误情况。在进行减法运算前,如果不知道借位标志位C的状态,则应先对CY进行清零操作。

  SUBB A,data ;(A)-(data)- (C)→(A) 累加器A中的内容与直接地址单元中的内容、连同借位位相减,结果存在A中。

  SUBB A,#data ;(A)-#data -(C)→(A) 累加器A中的内容与立即数、连同借位位相减,结果存在A中。

  SUBB A,Rn ;(A)-(Rn)-(C)→(A) 累加器A中的内容与工作寄存器中的内容、连同借位位相减,结果存在A中

  SUBB A,@Ri ;(A)-((Ri))-(C)→(A) 累加器A中的内容与工作寄存器Ri指向的地址单元中的内容、连同借位位相减,结果存在A中。

  如任务中“减法程序”里 MOV A,P0

  MOV R0,P2

  SUBB A,R0

  就是将P0口与P2口的内容相减。

  (4) 乘法指令(1条)

  这个指令的作用是把累加器A和寄存器B中的8位无符号数相乘,所得到的是16位乘积,这个结果低8位存在累加器A,而高8位存在寄存器B中。如果OV=1,说明乘积大于FFH,否则OV=0,但进位标志位CY总是等于0。

  MUL AB ;(A)×(B)→(A)和(B) 累加器A中的内容与寄存器B中的内容相乘,结果存在A、B中。

  如任务中“加法程序”里 MOV A,P0

  MOV B,P2

  MUL AB

  就是将P0口与P2口的内容相乘,低字节存于A,高字节存于B。

  (5) 除法指令(1条)

  这个指令的作用是把累加器A的8位无符号整数除以寄存器B中的8位无符号整数,所得到的商存在累加器A,而余数存在寄存器B中。除法运算总是使OV和进位标志位CY等于0。如果OV=1,表明寄存器B中的内容为00H,那么执行结果为不确定值,表示除法有溢出。

  DIV AB ;(A)÷(B)→(A)和(B) 累加器A中的内容除以寄存器B中的内容,所得到的商存在累加器A,而余数存在寄存器B中。

  如任务中“加法程序”里 MOV A,P0

  MOV B,P2

  DIV AB

  就是将P0口与P2口的内容相除,商存于A,余数存于B。

  (6) 加1指令(5条)

  这5条指令的的功能均为原寄存器的内容加1,结果送回原寄存器。上述提到,加1指令不会对任何标志有影响,如果原寄存器的内容为FFH,执行加1后,结果就会是00H。这组指令共有直接、寄存器、寄存器减间址等寻址方式:

  INC A ;(A)+1→(A) 累加器A中的内容加1,结果存在A中。

  INC data ;(data)+1→(data) 直接地址单元中的内容加1,结果送回原地址单元中。

  INC @Ri ;((Ri))+1→((Ri)) 寄存器的内容指向的地址单元中的内容加1,结果送回原地址单元中

  INC Rn ;(Rn)+1→(Rn)寄存器Rn的内容加1,结果送回原地址单元中

  INC DPTR ;(DPTR)+1→(DPTR)数据指针的内容加1,结果送回数据指针中

  在INC data这条指令中,如果直接地址是I/O,其功能是先读入I/O锁存器的内容,然后在CPU进行加1操作,再输出到I/O上,这就是“读—修改—写”操作。

  (7) 减1指令(4条)

  这组指令的作用是把所指的寄存器内容减1,结果送回原寄存器,若原寄存器的内容为00H,减1后即为FFH,运算结果不影响任何标志位,这组指令共有直接、寄存器、寄存器间址等寻址方式,当直接地址是I/O口锁存器时,“读—修改—写”操作与加1指令类似。

  DEC A ;(A)-1→(A)累加器A中的内容减1,结果送回累加器A中

  DEC data ;(data)-1→(data)直接地址单元中的内容减1,结果送回直接地址单元中

  DEC @Ri ;((Ri))-1→((Ri))寄存器Ri指向的地址单元中的内容减1,结果送回原地址单元中

  DEC Rn ;(Rn)-1→(Rn)寄存器Rn中的内容减1,结果送回寄存器Rn中。

  (8) 十进制调整指令(1条)

  在进行BCD码运算时,这条指令总是跟在ADD或ADDC指令之后,其功能是将执行加法运算后存于累加器A中的结果进行调整和修正。

  DA A

  3. 算术运算指令应用举例

  【例3.4】 双字节无符号数加法(R0R1)+(R2R3)→(R4R5)

  R0、R2、R4中存放16位数的高字节,R1、R3、R5中存放低字节。由于不存在16位数加法指令,所以只能先加低8位,而在加高8位时要连低8沉位相加时产生的进位一起相加。假设其和不超过16位,其编程如下:

  MOV A,R1 ;取被加数低字节

  ADD A,R3 ;低字节相加

  MOV R5,A ;保存和低字节

  MOV A,R0 ;取高字节被加数

  ADDC A,R2 ;两高字节之和加低位进位

  MOV R4,A ;保存和高字节

  【例3.5】 双字节无符号数相减(R0R1)-(R2R3)→(R4R5)

  R0、R2、R4存放16位数的高字节,R1、R3、R5存放低字节。先减低8位,后减高8位和低位减借位,所以要先清零。其编程如下:

  MOV A,R1 ;取被减数低字节

  CLR C ;清借位位

  SUBB A,R3 ;低字节相减

  MOV R5,A ;保存差低字节

  MOV A,R0 ;取被减法高字节

  SUBB A,R2 ;两高字节之差减低位借位

  MOV R4,A ;保存差高字节

  【例3.6】 利用除法指令把累加器A中的8位二进制转换为3位BCD数,并以压缩形式存放在地址M1、M2单元中。

  解:累加器A中的8位二进制数,先对其除以100(64H),商数即为十进制的百位数;余数部分再除以10(0AH),所得商数和余数分别为十进制和个位数,即得到3位BCD数的存放 是通过SWAP和ADD指令实现的。参考程序如下:

  MOV B,#64H ;除数100送B

  DIV AB ;得8位数

  MOV M1, A ;百位数存于M1中

  MOV A #0AH ;取除数10

  XCH A,B ;上述余数与除数交换

  XCH AB ;得十位数和个位数

  SWAP A ;十位数存于A的高4位

  ADD A,B ;组成压缩BCD数

  MOV M2,A ;十、个位压缩BCD数存M2

  若上述程序执行前:(A)=A8H(168),则执行后:(M1)=(01)BCD,(M2)(68)BCD 。

  【例3.7】 对BCD码加法65+58 =123(BDH)进行十进制调整。

  解:高R5(高)、R4(低)为被加数;高R3(高)、R2(低)为加数;相加和的结果存和:高R6(万)、R5(千、百)、R4(十、个)。

  参考程序如下:

  MOV A,R4 ;被加数十位、个位送入A

  ADD A,R2 ;十位、个位相加

  DA A ;和的十位、个位调整

  MOV R4,A ;和的十位、个位存入R4

  MOV A,R5 ;被加数千位、百位送入A

  ADDC A,R3 ;千位、百位的和加低位进位

  DA A ;和的千位、百位调整

  MOV R5,A ;和的千位、百位存入R5

  MOV A,#00H ; A清零

  ADDC A,#00H ;求和的万位值

  MOV R6,A ;和的万位存入R6

  若程序执行前:(R5)=(98H)BCD,(R4)=(76H)BCD,(R3)=(54H)BCD,(R2)=(32H)BCD,则执行后:(R6)=(01H)BCD,(R5)=(53H)BCD,(R4)=(08H)BCD。

  【例3.8】 双字节数求补码。

  解:对于一个16位数,R3存高8位,R2存低8位,求补结果仍存R3、R2。求补的参考程序如下:

  MOV A,R2 ;低8位数送A

  CPL A, ;低8位数取反

  ADD A,#01H ;加1得低8位数补码

  MOV R2 ,A ;存补码低8位

  MOV A,R3 ;高8位数送A

  CPL A, ;高8位数取反

  ADDC A,#00H ;加低8位进位

  MOV R3 ,A ;存补码高8位

  3.3 任务四 单片机作逻辑运算

  〖学习目标〗: 通过学习任务四的完成方法,掌握MCS-51单片机的逻辑运算指令的功能。

  〖任务描述〗: 利用单片机的逻辑运算指令进行逻辑与、或、异或等逻辑运算,并将结果送P1口发光二极管显示。

  3.3.1 硬件电路

  硬件电路仍采用实验开发板上的电路,如图3.4所示。

  工作原理

  通过P0口、P2口外接的拨动开关设制运算的数据,利用单片机的逻辑运算指令运算,并将结果送P1口发光二极管显示。

  3.3.2 程序设计

  1. 逻辑“与”运算程序

  ORG 0000H

  MOV A,P0

  ANL A,P2

  MOV P1,A

  SJMP $

  END

  2. 逻辑“或”运算程序

  ORG 0000H

  MOV A,P0

  ORL A,P2

  MOV P1,A

  SJMP $

  END

  3. 逻辑“异或”运算程序

  ORG 0000H

  MOV A,P0

  XRL A,P2

  MOV P1,A

  SJMP $

  END

  3.3.3 源程序的编辑、编译、下载

  打开“伟福”模拟仿真软件进行程序的编辑、编译。

  打开“ISP下载软件”将目标文件下载到ISP-4实验开发板上的AT89S51单片机芯片,观察程序运行结果。

  3.3.4 相关知识

  在上面的任务中,我们可以看到随着P0、P2口的变化,发光二极管的输出和相关逻辑运算的结果一致,那么,到底单片机是怎样实现这种变化的呢?

  1. 单片机是怎样做逻辑运算的?

  单片机CPU内部集成的逻辑运算部件(主要有与运算器、或运算器、异或运算器等),可以完成与、或、异或运算等,单片机的逻辑运算指令经过指令译码器译码后产生的控制信号控制逻辑运算部件工作产生运算结果。

  2. MCS-51单片机有哪些逻辑运算指令?

  逻辑运算和移位指令共有25条,有与、或、异或、求反、左右移位、清0等逻辑操作,有直接、寄存器和寄存器间址等寻址方式。这类指令一般不影响程序状态字(PSW)标志。

  (1) 循环移位指令(4条)

  这4条指令的作用是将累加器中的内容循环左或右移一位,后两条指令是连同进位位CY一起移位。

  RL A ;累加器A中的内容左移一位。

  RR A ;累加器A中的内容右移一位。

  RLC A ;累加器A中的内容连同进位位CY左移一位。

  RRC A ;累加器A中的内容连同进位位CY右移一位。

  (2) 累加器半字节交换指令(1条)

  这条指令是将累加器中的内容高低半字节互换,这在上一节中内容已有介绍。

  SWAP A ; 累加器中的内容高低半字节互换

  (3) 求反指令(1条)

  这条指令将累加器中的内容按位取反。

  CPL A ; 累加器中的内容按位取反

  (4) 清零指令(1条)

  这条指令将累加器中的内容清0。

  CLR A ; 0→(A),累加器中的内容清0

  (5) 逻辑与操作指令(6条)

  这组指令的作用是将两个单元中的内容执行逻辑与操作。如果直接地址是I/O地址,则为“读—修改—写”操作。

  ANL A,data ;累加器A中的内容和直接地址单元中的内容执行与逻辑操作。结果存在寄存器A中。

  ANL data,#data ;直接地址单元中的内容和立即数执行与逻辑操作。结果存在直接地址单元中。

  ANL A,#data ;累加器A的内容和立即数执行与逻辑操作。结果存在累加器A中。

  ANL A,Rn ;累加器A的内容和寄存器Rn中的内容执行与逻辑操作。结果存在累加器A中。

  ANL data,A ;直接地址单元中的内容和累加器A的内容执行与逻辑操作。结果存在直接地址单元中。

  ANL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行与逻辑操作。结果存在累加器A中。

  如任务中的ANL A,P2 指令。

  (6) 逻辑或操作指令(6条)

  这组指令的作用是将两个单元中的内容执行逻辑或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。

  ORL A,data ;累加器A中的内容和直接地址单元中的内容执行逻辑或操作。结果存在寄存器A中。

  ORL data,#data ;直接地址单元中的内容和立即数执行逻辑或操作。结果存在直接地址单元中。

  ORL A,#data ;累加器A的内容和立即数执行逻辑或操作。结果存在累加器A中。

  ORL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑或操作。结果存在累加器A中。

  ORL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑或操作。结果存在直接地址单元中。

  ORL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑或操作。结果存在累加器A中。

  如任务中的 ORL A,P2 指令。

  (7) 逻辑异或操作指令(6条)

  这组指令的作用是将两个单元中的内容执行逻辑异或操作。如果直接地址是I/O地址,则为“读—修改—写”操作。

  XRL A,data ;累加器A中的内容和直接地址单元中的内容执行逻辑异或操作。结果存在寄存器A中。

  XRL data,#data ;直接地址单元中的内容和立即数执行逻辑异或操作。结果存在直接地址单元中。

  XRL A,#data ;累加器A的内容和立即数执行逻辑异或操作。结果存在累加器A中。

  XRL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑异或操作。结果存在累加器A中。

  XRL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑异或操作。结果存在直接地址单元中。

  XRL A,@Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑异或操作。结果存在累加器A中。

  如任务中的 XRL A,P2 指令。

  3. 逻辑运算指令应用举例

  【例3.9】 16位数的算术左移。16位数在内存中低8位存放在M1单元,高8位存放在M1+1单元。

  解:所谓算术左移就是将操作数左移一位,并使最低位补充0,相当于完成16位数的乘务员操作,故称算术左移。参考程序如下:

  CLR C ;进位CY清零

  MOV R1,#M1 ;操作数地址M1送R1

  MOV A,@ R1 ;低8位数送A

  RLC A, ;低8位左移,最低位补0

  MOV @ R1 ,A ;低8位左移后,回送M1存放

  INC R1 ;指向16位高8位地址M1+1

  MOV A,@ R1 ;低8位送A

  RLC A, ;高8位带低8位进位左移

  MOV @ R1 ,A ;高8位左移后回送M1+1存放

  若要对16位数进行循环移位,则应首先设法把最高位(D15)的值置入CY,然后再参照以上程序编写即可。利用以后介绍的位操作指令可以很容易地实现将某一位的值置入CY。