当前位置: 首页 > news >正文

上位机知识篇---sbit、bit、sfr


文章目录

  • 前言
  • 1. sbit 的使用
    • 语法
    • 特点
      • 作用范围
      • 存储位置
      • 用途
    • 示例代码
  • 2.bit 的使用
    • 语法
    • 特点
      • 作用范围
      • 存储位置
      • 用途
    • 示例代码
  • 3. sbit 与 bit 的区别
  • 4. 综合示例
  • 5. 注意事项
    • sbit 的适用范围:
    • bit 的存储限制
    • 编译器支持
  • 6. 总结
    • sbit
    • bit
  • 7.sfr的使用
    • 1. sfr 的语法
    • 2. sfr 的作用
      • 访问硬件资源
      • 提高代码可读性
      • 简化代码:
    • 3. 8051 单片机中常见的 SFR
    • 4. sfr 的使用示例
      • 示例 1:控制 GPIO 端口
      • 示例 2:配置定时器
      • 示例 3:配置串口
    • 5. sfr 与 sbit 的结合使用
    • 6. 注意事项
      • 地址范围
      • 寄存器定义
      • 编译器支持
    • 7. 总结
  • 总结


前言

本文仅仅简单介绍了sbit、bit、sfr的使用。


1. sbit 的使用

sbit 用于定义 特殊功能寄存器(SFR) 中的某一位。SFR 是 8051 单片机中用于控制硬件资源的寄存器,例如 GPIO 端口、定时器、串口等。

语法

sbit 变量名 = SFR地址^位号;
变量名:为某一位定义的别名。
SFR地址:特殊功能寄存器的地址。
位号:寄存器中的位编号(07

特点

作用范围

作用范围:仅限于 SFR 的位可寻址部分

存储位置

存储位置:映射到 SFR 的某一位。

用途

用途:用于控制 GPIO 引脚、访问 SFR 的某一位等。

示例代码

#include <reg52.h>

sbit LED = P1^0;  // 定义 P1.0 为 LED
sbit KEY = P3^2;  // 定义 P3.2 为按键

void main() {
    while (1) {
        if (KEY == 0) {  // 检测按键是否按下(假设低电平有效)
            LED = 0;     // 点亮 LED
        } else {
            LED = 1;     // 熄灭 LED
        }
    }
}

2.bit 的使用

bit 用于定义普通的位变量。这些变量存储在 8051 单片机的 位寻址区(Bit-Addressable Area) 中。

语法

bit 变量名;
变量名:位变量的名称。

特点

作用范围

作用范围:可以定义任意位变量

存储位置

存储位置:存储在 RAM 的位寻址区(地址范围为 0x20 到 0x2F,共 16 字节,128 位)。

用途

用途:用于标志位、状态位等。

示例代码

#include <reg52.h>

bit flag = 0;  // 定义一个位变量 flag

void main() {
    while (1) {
        if (P3^2 == 0) {  // 检测按键是否按下
            flag = 1;     // 设置标志位
        } else {
            flag = 0;     // 清除标志位
        }

        if (flag) {       // 根据标志位控制 LED
            P1^0 = 0;     // 点亮 LED
        } else {
            P1^0 = 1;     // 熄灭 LED
        }
    }
}

3. sbit 与 bit 的区别

特性 sbit bit
用途 定义 SFR 中的某一位 定义普通的位变量
作用范围 仅限于 SFR 的位可寻址部分 可以定义任意位变量
存储位置 映射到 SFR 的某一位 存储在 RAM 的位寻址区
示例 sbit LED = P1^0; bit flag = 0;

4. 综合示例

以下是一个综合示例,展示 sbit 和 bit 的使用。

示例:按键控制 LED 状态

#include <reg52.h>

sbit LED = P1^0;  // 定义 P1.0 为 LED
sbit KEY = P3^2;  // 定义 P3.2 为按键

bit keyPressed = 0;  // 定义一个位变量,用于记录按键状态

void main() {
    while (1) {
        if (KEY == 0) {       // 检测按键是否按下
            if (!keyPressed) {  // 如果按键之前未按下
                LED = ~LED;     // 切换 LED 状态
                keyPressed = 1; // 设置按键状态为按下
            }
        } else {
            keyPressed = 0;  // 清除按键状态
        }
    }
}

5. 注意事项

sbit 的适用范围:

仅适用于 SFR 的位可寻址部分(如 P0、P1、P2、P3、TCON 等)。

不是所有的 SFR 都支持位寻址。

bit 的存储限制

8051 单片机的位寻址区只有 128 位(16 字节),因此 bit 变量的数量有限。

编译器支持

sbit 和 bit 是 Keil C51 编译器的扩展关键字,其他编译器可能不支持。

6. 总结

sbit

用于定义 SFR 中的某一位,适合控制 GPIO 引脚或访问 SFR 的某一位。
示例:sbit LED = P1^0;

bit

用于定义普通的位变量,适合用作标志位或状态位。
示例:bit flag = 0;

通过合理使用 sbit 和 bit,可以更方便地操作 8051 单片机的硬件资源和实现逻辑控制。

7.sfr的使用

1. sfr 的语法

sfr 寄存器名 = 地址;
寄存器名:为 SFR 定义的别名。
地址:SFR 的固定地址(0x800xFF)。
示例:
sfr P0 = 0x80;  // 定义 P0 端口寄存器
sfr P1 = 0x90;  // 定义 P1 端口寄存器

2. sfr 的作用

访问硬件资源

通过 sfr 可以直接访问 8051 单片机的硬件资源,如 GPIO 端口、定时器、串口等。

提高代码可读性

使用 sfr 定义的寄存器名比直接使用地址更直观,代码更易于理解和维护。

简化代码:

通过 sfr 可以直接操作寄存器,而不需要手动计算地址。

3. 8051 单片机中常见的 SFR

以下是一些常见的 SFR (特殊功能寄存器)及其地址:

寄存器名 地址 功能
P0 0x80 P0 端口寄存器
P1 0x90 P1 端口寄存器
P2 0xA0 P2 端口寄存器
P3 0xB0 P3 端口寄存器
TCON 0x88 定时器控制寄存器
TMOD 0x89 定时器模式寄存器
TH0 0x8C 定时器 0 高字节寄存器
TL0 0x8A 定时器 0 低字节寄存器
SCON 0x98 串口控制寄存器
SBUF 0x99 串口数据缓冲寄存器

4. sfr 的使用示例

示例 1:控制 GPIO 端口

#include <reg52.h>

sfr P1 = 0x90;  // 定义 P1 端口寄存器

void main() {
    while (1) {
        P1 = 0x55;  // P1 端口输出 0x55(01010101)
        Delay(50000);  // 延时
        P1 = 0xAA;  // P1 端口输出 0xAA(10101010)
        Delay(50000);  // 延时
    }
}

void Delay(uint ms) {
    uint i, j;
    for (i = ms; i > 0; i--)
        for (j = 110; j > 0; j--);
}

示例 2:配置定时器

#include <reg52.h>

sfr TMOD = 0x89;  // 定义定时器模式寄存器
sfr TH0 = 0x8C;   // 定义定时器 0 高字节寄存器
sfr TL0 = 0x8A;   // 定义定时器 0 低字节寄存器
sfr TCON = 0x88;  // 定义定时器控制寄存器

void Timer0_Init() {
    TMOD = 0x01;  // 定时器 0 模式 1(16 位定时器)
    TH0 = 0xFC;   // 定时器初值高字节
    TL0 = 0x18;   // 定时器初值低字节
    TCON = 0x10;  // 启动定时器 0
}

void main() {
    Timer0_Init();
    while (1) {
        if (TCON & 0x20) {  // 检测定时器 0 溢出标志
            TCON &= ~0x20;  // 清除溢出标志
            // 执行定时任务
        }
    }
}

示例 3:配置串口

#include <reg52.h>

sfr SCON = 0x98;  // 定义串口控制寄存器
sfr SBUF = 0x99;  // 定义串口数据缓冲寄存器

void UART_Init() {
    SCON = 0x50;  // 串口模式 1,8 位数据,1 位停止位
    TMOD = 0x20;  // 定时器 1 模式 2(8 位自动重装)
    TH1 = 0xFD;   // 波特率 9600
    TL1 = 0xFD;
    TR1 = 1;      // 启动定时器 1
    ES = 1;       // 使能串口中断
    EA = 1;       // 使能全局中断
}

void UART_SendByte(uchar byte) {
    SBUF = byte;  // 发送数据
    while (!TI);  // 等待发送完成
    TI = 0;       // 清除发送标志
}

void main() {
    UART_Init();
    UART_SendByte('A');  // 发送字符 'A'
    while (1);
}

5. sfr 与 sbit 的结合使用

sfr 用于定义整个寄存器,而 sbit 用于定义寄存器中的某一位。两者可以结合使用。

示例:控制 GPIO 端口的某一位

#include <reg52.h>

sfr P1 = 0x90;  // 定义 P1 端口寄存器
sbit LED = P1^0;  // 定义 P1.0 为 LED

void main() {
    while (1) {
        LED = 0;  // 点亮 LED(假设低电平点亮)
        Delay(50000);  // 延时
        LED = 1;  // 熄灭 LED
        Delay(50000);  // 延时
    }
}

void Delay(uint ms) {
    uint i, j;
    for (i = ms; i > 0; i--)
        for (j = 110; j > 0; j--);
}

6. 注意事项

地址范围

sfr 的地址必须在 0x80 到 0xFF 之间。

寄存器定义

在 Keil C51 中,常用的 SFR 已经定义在头文件 reg52.h 中,无需手动定义。

编译器支持

sfr 是 Keil C51 编译器的扩展关键字,其他编译器可能不支持。

7. 总结

  1. sfr 用于定义 8051 单片机的特殊功能寄存器(SFR)。
  2. 通过 sfr 可以直接访问硬件资源,如 GPIO、定时器、串口等。
  3. 结合 sbit 可以更方便地操作寄存器的某一位
  4. 合理使用 sfr 可以提高代码的可读性和简洁性
  5. 通过掌握 sfr 的使用,可以更高效地开发 8051 单片机的应用程序。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了sbit、bit、sfr的使用。

相关文章:

  • Docker 镜像加速器配置指南
  • 游戏引擎学习第112天
  • Ollama DeepSeek + AnythingLLM 实现本地私有AI知识库
  • 【好玩的Docker项目】使用Docker轻松搭建游戏化编程学习平台
  • 深入探索HarmonyOS——构建万物智联的新时代
  • 解锁机器学习核心算法 | 随机森林算法:机器学习的超强武器
  • 背包dp与数位dp
  • 智慧医疗心脏超声图像间隔壁分割数据集labelme格式3092张1类别
  • iframe 高さ 自動調整
  • 【网络安全 | 漏洞挖掘】我如何通过Cookie Manipulation发现主域上的关键PII?
  • Linux系统上同时打印到物理打印机并生成PDF副本方法研究
  • 【分布式理论14】分布式数据库存储:分表分库、主从复制与数据扩容策略
  • 汽车零部件开发应该具备哪些编程思维?
  • 内核崩溃分析
  • UMLS数据下载及访问
  • 使用 Python 将爬取的内容保存到 Excel 表格
  • DeepSeek的100个应用场景
  • 长文档处理痛点:GPT-4 Turbo引文提取优化策略与替代方案讨论
  • express + vue 部署宝塔
  • 从月牙定理看古希腊数学的奇妙突破
  • 碧桂园境外债务重组:相当于现有公众票据本金额逾50%的持有人已加入协议
  • 央行:中国政府债务扩张仍有可持续性
  • 暴雨及强对流天气黄色预警已发布!南方进入本轮降雨最强时段
  • 上海如何为街镇营商环境赋能?送政策、配资源、解难题、强活力
  • 陕西澄城打造“中国樱桃第一县”:从黄土高原走向海外,年产值超30亿
  • 酒店取消订单加价卖何以屡禁不绝?专家建议建立黑名单并在商家页面醒目标注