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

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

第6节 单片机作逻辑运算

  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。