51单片机的五类指令(五)——位操作类指令

目录

一、位传送指令

[1、MOV C, bit](#1、MOV C, bit)

[2、MOV bit, C](#2、MOV bit, C)

3、位传送指令的应用场景

二、位变量修改指令

[1、CLR(清 0 指令)](#1、CLR(清 0 指令))

[2、SETB(置 1 指令)](#2、SETB(置 1 指令))

3、位变量修改指令的应用场景

三、位变量逻辑操作指令

[1、位变量逻辑与指令 ANL](#1、位变量逻辑与指令 ANL)

[2、位变量逻辑或指令 ORL](#2、位变量逻辑或指令 ORL)

[3、位变量取反指令 CPL](#3、位变量取反指令 CPL)

4、综合应用示例

四、位条件转移类指令

(一)以进位标志位C(Cy)为条件的转移

[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

相关推荐
雾削木1 小时前
mAh 与 Wh:电量单位的深度解析
开发语言·c++·单片机·嵌入式硬件·算法·电脑
AiFlutter2 小时前
低代码平台开发手机USB-HID调试助手
单片机·游戏·计算机外设
Mirelladis3 小时前
实验:串口通信
单片机·51单片机
RaLi和夕3 小时前
单片机学习笔记9.数码管
汇编·笔记·单片机·嵌入式硬件·学习
普普通通的一名码农4 小时前
ESP32-S3 入门学习笔记(四):LED实验
笔记·单片机·学习
教练、我想打篮球4 小时前
03 基于 STM32 的温度控制系统
stm32·单片机·嵌入式硬件
电鱼智能的电小鱼5 小时前
EFISH-SBC-RK3588 —— 厘米级定位 × 旗舰算力 × 工业级可靠‌
linux·人工智能·嵌入式硬件·边缘计算
ltqshs5 小时前
STM32标准库和HAL库SPI发送数据的区别-即SPI_I2S_SendData()和HAL_SPI_Transmit()互换
stm32·单片机·嵌入式硬件
程序员JerrySUN5 小时前
驱动开发硬核特训 · Day 22(上篇): 电源管理体系完整梳理:I2C、Regulator、PMIC与Power-Domain框架
linux·驱动开发·嵌入式硬件
xyd陈宇阳6 小时前
STM32(M4)入门:定时器延时与系统滴答(价值 3w + 的嵌入式开发指南)
stm32·单片机·嵌入式硬件