目录
[1、MOV C, bit](#1、MOV C, bit)
[2、MOV bit, C](#2、MOV bit, C)
[1、CLR(清 0 指令)](#1、CLR(清 0 指令))
[2、SETB(置 1 指令)](#2、SETB(置 1 指令))
[1、位变量逻辑与指令 ANL](#1、位变量逻辑与指令 ANL)
[2、位变量逻辑或指令 ORL](#2、位变量逻辑或指令 ORL)
[3、位变量取反指令 CPL](#3、位变量取反指令 CPL)
[1、JC rel](#1、JC rel)
[2、JNC rel](#2、JNC rel)
[(二)以直接寻址位 bit 为条件的转移指令](#(二)以直接寻址位 bit 为条件的转移指令)
[1、JB bit, rel](#1、JB bit, rel)
[2、JNB bit, rel](#2、JNB bit, rel)
[3、JBC bit, rel](#3、JBC bit, rel)
单片机中寻址是为了找到操作数,而各类指令则是为了对操作数进行操作。本篇文章将介绍51单片机中的第五类指令------位操作类指令。
51 单片机的位操作类指令是汇编语言编程里极为重要的一类指令,**它能够对单个二进制位进行操作,**以下是对这些指令的详细介绍。
一、位传送指令
1、MOV C, bit
**(1)指令作用:**把位地址 bit 中的内容传送到进位标志位 CY。
(2)示例代码
XML
MOV C, P1.0 ; 把P1口的第0位传送到进位标志位CY
**(3)解释:**若 P1.0 的值为 1,那么 CY 也会变成 1;若 P1.0 的值为 0,CY 则变为 0。
2、MOV bit, C
**(1)指令作用:**把进位标志位 CY 的内容传送到位地址 bit。
(2)示例代码
XML
MOV P1.0, C ; 把进位标志位CY的值传送到P1口的第0位
**(3)解释:**要是 CY 的值为 1,P1.0 就会被置为 1;若 CY 的值为 0,P1.0 就会被清为 0。
注意:其中的一个操作数必须为进位标志(CY),另一个可以是任何直接寻址位 bit(直接寻址位就是通过直接给出位地址,进而对该地址对应的位数据进行操作)。
3、位传送指令的应用场景
位传送指令常用于对单片机的某些引脚状态进行读取和设置,或者对一些标志位进行操作。
二、位变量修改指令
1、CLR(清 0 指令)
**(1)功能:**将指定的位清 0
(2)格式:① CLR C: 把进位标志位 C 清 0。**② CLR bit:**把直接寻址位清 0。
(3)示例
XML
CLR C ; 清0进位标志位C
CLR P1.0 ; 清0P1.0引脚对应的位
2、SETB(置 1 指令)
**(1)功能:**将指定的位置 1。
(2)格式:① **SETB C:**把进位标志位 C 置 1。**② SETB bit:**把直接寻址位置 1。
(3)示例
XML
SETB C ; 把进位标志位C置1
SETB P1.1 ; 把P1.1引脚对应的位置1
3、位变量修改指令的应用场景
这些位变量修改指令能直接操作单个位,在控制外部设备的引脚状态、进行标志位的设置与清除等方面有广泛应用。例如,你可以利用这些指令来控制 LED 灯的亮灭。
XML
ORG 0000H
START:
SETB P1.0 ; 点亮P1.0引脚上连接的LED
ACALL DELAY ; 调用延时子程序
CLR P1.0 ; 熄灭P1.0引脚上连接的LED
ACALL DELAY ; 调用延时子程序
SJMP START ; 跳转到START处,循环执行
DELAY:
MOV R7, #250 ; 外层循环次数
DELAY1:
MOV R6, #250 ; 内层循环次数
DELAY2:
DJNZ R6, DELAY2 ; 内层循环
DJNZ R7, DELAY1 ; 外层循环
RET
END
在这个例子中,SETB P1.0 和 CLR P1.0 指令用于控制 LED 灯的亮灭,CPL 指令可用于实现 LED 灯状态的翻转。
三、位变量逻辑操作指令
1、位变量逻辑与指令 ANL
(1)指令格式与功能
**① ANL C, bit:**将进位标志位 C 和直接寻址位 bit 进行逻辑与运算,结果存于进位标志位C中。
**② ANL C, /bit:**将进位标志位 C 和直接寻址位 bit 的取反值进行逻辑与运算,结果存于进位标志位 C 中。
(2)示例
XML
MOV C, 1 ; 将进位标志位C置1
MOV P1.0, 0 ; 假设P1.0引脚置0
ANL C, P1.0 ; 执行C = C AND P1.0,结果C为0
2、位变量逻辑或指令 ORL
(1)指令格式与功能
**① ORL C, bit:**将进位标志位 C 和直接寻址位 bit 进行逻辑或运算,结果存于进位标志位C中。
**② ORL C, /bit:**将进位标志位 C 和直接寻址位 bit 的取反值进行逻辑或运算,结果存于进位标志位 C 中。
(2)示例
XML
MOV C, 0 ; 将进位标志位C置0
MOV P1.1, 1 ; 假设P1.1引脚置1
ORL C, P1.1 ; 执行C = C OR P1.1,结果C为1
3、位变量取反指令 CPL
**(1)功能:**对指定的位取反。
(2)格式:① CPL C: 对进位标志位 C 取反。**② CPL bit:**对直接寻址位取反。
(3)示例
XML
CPL C ; 对进位标志位C取反
CPL P1.2 ; 对P1.2引脚对应的位取反
4、综合应用示例
下面是一个简单的程序示例,展示了这些指令的综合运用。该程序依据 P1.0 和 P1.1 引脚的状态,对 P1.2 引脚进行相应的操作。
XML
ORG 0000H
START:
MOV C, P1.0 ; 将P1.0引脚状态传送到C
ANL C, P1.1 ; C和P1.1进行逻辑与运算
ORL C, /P1.3 ; C和P1.3取反后进行逻辑或运算
CPL C ; 对C取反
MOV P1.2, C ; 将C的值传送到P1.2引脚
SJMP START ; 循环执行
END
在这个程序中:首先把 P1.0 引脚的状态传送到进位标志位 C;接着 C 和 P1.1 引脚状态进行逻辑与运算;然后 C 和 P1.3 引脚的取反值进行逻辑或运算;再对 C 取反;最后把 C 的值传送到 P1.2 引脚。程序会不断循环执行这些操作。
四、位条件转移类指令
(一)以进位标志位C(Cy)为条件的转移
1、JC rel
**(1)功能:**若进位标志位 C 为 1,则程序跳转到指定的目标地址执行;若 C 为 0,则顺序执行下一条指令。
**(2)格式:JC rel;**其中rel是相对偏移量,范围是 -128 到 +127。
(3)示例
XML
JC NEXT ; 如果C = 1,跳转到NEXT处执行;若C = 0,继续执行下一条指令
NEXT:
; 跳转后执行的代码
2、JNC rel
**(1)功能:**若进位标志位 C 为 0,则程序跳转到指定的目标地址执行;若 C 为 1,则顺序执行下一条指令。
**(2)格式:JNC rel;**rel同样是相对偏移量。
(3)示例
XML
JB P1.0, NEXT ; 如果P1.0引脚对应的位为1,跳转到NEXT处执行;若为0,继续执行下一条指令
NEXT:
; 跳转后执行的代码
(二)以直接寻址位 bit 为条件的转移指令
1、JB bit, rel
**(1)功能:**若直接寻址位为 1,则程序跳转到指定的目标地址执行;若该位为 0,则顺序执行下一条指令。
**(2)格式:JB bit, rel;**bit为直接寻址位,rel为相对偏移量。
(3)示例
XML
JB P1.0, NEXT ; 如果P1.0引脚对应的位为1,跳转到NEXT处执行;若为0,继续执行下一条指令
NEXT:
; 跳转后执行的代码
2、JNB bit, rel
**(1)功能:**若直接寻址位为 0,则程序跳转到指定的目标地址执行;若该位为 1,则顺序执行下一条指令。
(2)格式:JNB bit, rel;bit是直接寻址位 ,rel是相对偏移量。
(3)示例
XML
JNB P1.1, NEXT ; 如果P1.1引脚对应的位为0,跳转到NEXT处执行;若为1,继续执行下一条指令
NEXT:
; 跳转后执行的代码
3、JBC bit, rel
**(1)功能:**若直接寻址位为 1,则程序跳转到指定的目标地址执行,并且将该直接寻址位清 0;若该位为 0,则顺序执行下一条指令。
**(2)格式:JBC bit, rel;**bit为直接寻址位,rel为相对偏移量。
(3)示例
XML
JBC P1.2, NEXT ; 如果P1.2引脚对应的位为1,跳转到NEXT处执行并将P1.2清0;若为0,继续执行下一条指令
NEXT:
; 跳转后执行的代码
(三)位条件转移指令的应用
这些位条件转移类指令可以让程序依据位的状态做出不同的处理,例如检测外部引脚的状态、判断标志位等,从而实现复杂的控制逻辑。下面是一个简单的示例程序,它通过检测 P1.0 引脚的状态来控制 LED 灯的亮灭:
XML
ORG 0000H
START:
JB P1.0, TURN_ON ; 如果P1.0为1,跳转到TURN_ON处
CLR P1.1 ; 若P1.0为0,熄灭连接在P1.1上的LED
SJMP START ; 跳回START继续检测
TURN_ON:
SETB P1.1 ; 点亮连接在P1.1上的LED
SJMP START ; 跳回START继续检测
END
这个程序中,持续检测P1.0引脚的状态,若为高电平就点亮LED,若为低电平就熄灭LED。