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

相关推荐
A9better20 分钟前
嵌入式开发学习日志37——stm32之USART
stm32·嵌入式硬件·学习
国科安芯4 小时前
ASP4644芯片低功耗设计思路解析
网络·单片机·嵌入式硬件·安全
充哥单片机设计4 小时前
【STM32项目开源】基于STM32的智能厨房火灾燃气监控
stm32·单片机·嵌入式硬件
CiLerLinux11 小时前
第四十九章 ESP32S3 WiFi 路由实验
网络·人工智能·单片机·嵌入式硬件
时光の尘11 小时前
【PCB电路设计】常见元器件简介(电阻、电容、电感、二极管、三极管以及场效应管)
单片机·嵌入式硬件·pcb·二极管·电感·三极管·场效应管
Lu Zelin11 小时前
单片机为什么不能跑Linux
linux·单片机·嵌入式硬件
宁静致远202112 小时前
stm32 freertos下基于hal库的模拟I2C驱动实现
stm32·嵌入式硬件·freertos
Wave84517 小时前
STM32--智能小车
stm32·单片机·嵌入式硬件
wdfk_prog19 小时前
[Linux]学习笔记系列 -- lib/timerqueue.c Timer Queue Management 高精度定时器的有序数据结构
linux·c语言·数据结构·笔记·单片机·学习·安全
充哥单片机设计1 天前
【STM32项目开源】基于STM32的智能家居环境(空气质量)检测系统
stm32·单片机·嵌入式硬件