上位机知识篇---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;  // 定义一个位变量 flagvoid main() {while (1) {if (P3^2 == 0) {  // 检测按键是否按下flag = 1;     // 设置标志位} else {flag = 0;     // 清除标志位}if (flag) {       // 根据标志位控制 LEDP1^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;   // 波特率 9600TL1 = 0xFD;TR1 = 1;      // 启动定时器 1ES = 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 为 LEDvoid main() {while (1) {LED = 0;  // 点亮 LED(假设低电平点亮)Delay(50000);  // 延时LED = 1;  // 熄灭 LEDDelay(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的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20320.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20250217 随笔 redis非原子性操作简述

从你提供的文本来看&#xff0c;核心是 Redis 作为缓存的检查机制&#xff0c;以及非原子性操作导致的不一致性问题。 我们可以拆解为两个部分来理解&#xff1a; &#x1f4cc; 1. 逻辑&#xff1a;先查 Redis&#xff0c;再决定是否注册 逻辑流程 先查询 Redis 是否有某个 …

SVM对偶问题

1、对偶问题数学基础 对偶问题&#xff1a;在线性规划中&#xff0c;每一个线性规划问题(称为原问题)都有一个与之对应的对偶问题。从数学形式上看&#xff0c;如果原问题是求解一个线性目标函数的最大值&#xff08;或最小值&#xff09;&#xff0c;在满足一系列线性不等式&…

CSDN、markdown环境下如何插入各种图(流程图,时序图,甘特图)

流程图 横向流程图 mermaid graph LRA[方形] --> B{条件a}B -->|满足| C(圆角)B -->|不满足| D(圆角)C --> E[输出结果1]D --> E效果图&#xff1a; 竖向流程图 mermaid graph TDC{条件a} --> |a1| A[方形]C --> |a2| F[竖向流程图]A --> B(圆角)B …

MSI微星电脑冲锋坦克Pro Vector GP76 12UGS(MS-17K4)原厂Win11系统恢复镜像,含还原功能,预装OEM系统下载

适用机型&#xff1a;【MS-17K4】 链接&#xff1a;https://pan.baidu.com/s/1P8ZgXc6S_J9DI8RToRd0dQ?pwdqrf1 提取码&#xff1a;qrf1 微星笔记本原装出厂WINDOWS11系统自带所有驱动、出厂主题壁纸、系统属性专属联机支持标志、Office办公软件、MSI Center控制中心等预装…

MySQL 之INDEX 索引(Index Index of MySQL)

MySQL 之INDEX 索引 1.4 INDEX 索引 1.4.1 索引介绍 索引&#xff1a;是排序的快速查找的特殊数据结构&#xff0c;定义作为查找条件的字段上&#xff0c;又称为键 key&#xff0c;索引通过存储引擎实现。 优点 大大加快数据的检索速度; 创建唯一性索引&#xff0c;保证数…

Ubuntu18.04安装rvm、ruby2.6.5和rails5.2.6

系统环境&#xff1a;Ubuntu 18.04 一、安装前准备 1. sudo apt update 2. sudo apt upgrade 如果提示abort&#xff0c;忽略。 3. sudo apt install sqlite3 gnupg curl git libpq-dev 二、安装rvm ruby版本管理器 1.切换管理员模式 sudo su 2.安装软件签名公钥 gpg…

【WPS+VBA】表格中重复表头与页码的批量删除

向豆包对话可以死磕的&#xff0c;以前问问题我只是根据第一条给出的答案使用。AI还有个优点&#xff0c;不会烦你&#xff0c;只要有问题就接着问&#xff0c;一直问到解决好问题。小编对豆包的连环提问&#xff0c;最终解决了批量删表头页面的问题。 1、豆包对话过程 开始问…

[Windows] Win7也能控制安卓手机屏幕(手机镜像投屏):scrcpy

Win7也能控制安卓手机屏幕&#xff08;手机镜像投屏&#xff09;&#xff1a;scrcpy 链接&#xff1a;https://pan.xunlei.com/s/VOJGlhQkX9mNqCYsM2cMbYxsA1?pwdm9wq# 系统平台&#xff1a;Windows 7/10/11 &#xff08;Win7系统需打开“Win7”文件夹进行操作&#xff09; …

Windows 环境下 Prometheus 安装指南

目录 确认系统环境 下载 Prometheus 解压安装包 配置 Prometheus 启动 Prometheus 访问 Prometheus Web 界面 确认系统环境 确保你的 Windows 系统满足 Prometheus 的运行要求&#xff08;推荐 Windows 10 或更高版本&#xff09;。 下载 Prometheus 打开 Prometheus 官…

使用Linux创作第一个小程序--进度条

Linux第一个小程序 - 进度条 储备知识 1.回车换行 回车概念 \r 换行概念 \n 2.缓冲区 sleep 先执行1 后执行2&#xff08;c语言中是按顺序执行的&#xff09; 那么在我sleep期间&#xff0c;“Hello World”一定是被保存起来了&#xff08;缓冲区&#xff09;。 缓冲区&a…

工业制造能耗管理新突破,漫途MTIC-ECM平台助力企业绿色转型!

在工业制造领域&#xff0c;能源消耗一直是企业运营成本的重要组成部分。随着“双碳”目标的推进&#xff0c;如何实现高效能耗管理&#xff0c;成为制造企业亟待解决的问题。漫途MTIC-ECM能源能耗在线监测平台&#xff0c;结合其自研的硬件产品&#xff0c;为工业制造企业提供…

DFS算法篇:理解递归,熟悉递归,成为递归

1.DFS原理 那么dfs就是大家熟知的一个深度优先搜索&#xff0c;那么听起来很高大尚的一个名字&#xff0c;但是实际上dfs的本质就是一个递归&#xff0c;而且是一个带路径的递归&#xff0c;那么递归大家一定很熟悉了&#xff0c;大学c语言课程里面就介绍过递归&#xff0c;我…

【Java学习】继承

一、继承 子类继承父类&#xff0c;子类这个类变量的引用在原有的指向子类自己类变量空间的原有访问权限上&#xff0c;增加上了父类类变量空间的访问权限&#xff0c;此时子类类变量指向的空间变为了原来子类类变量空间加上父类类变量空间&#xff0c;此时子类类变量空间就变成…

ChatGLM

ChatGLM 实现思想模型结构配置迭代版本 ChatGLM-6B : 清华大学的一个开源、支持中英双语的对话语言模型&#xff0c;基于 General Language Model&#xff08;GLM&#xff09;架构&#xff0c;具有 62 亿参数 特点 : 优点 : INT4下&#xff0c;只要 6GB 显存 ; ChatGLM2-6B 序…

网页制作02-html,css,javascript初认识のhtml的文字与段落标记

用一首李白的将进酒,对文字与段落标记进行一个简单的介绍演示&#xff1a; 目录 一、标题字 1、标题字标记h 2、标题字对其属性align 二、文本基本标记 1、字体属性face 2、字号属性size 3、颜色属性 Color 三、文本格式化标记 1、粗体标记 b &#xff0c;strong 2、…

Vue响应式原理实现总结(数据劫持Object.defineProperty/Proxy+发布订阅者设计模式)

Vue的响应式主要分为数据劫持和发布订阅模式。Vue2用的是Object.defineProperty,而Vue3改用Proxy。数据劫持就是在访问或修改对象属性时进行拦截,然后触发相应的更新。发布订阅模式则是用来收集依赖(比如视图更新函数),当数据变化时通知这些依赖执行。 总结一下,关键点包…

Opencv项目实战:26 信用卡号码识别与类型判定

项目介绍 在日常生活中&#xff0c;信用卡的使用越来越普遍。本项目的主要目标是通过图像处理技术自动识别信用卡号码&#xff0c;并根据信用卡号码的第一个数字判定信用卡的类型&#xff08;如Visa、MasterCard等&#xff09;。项目结合了图像预处理、轮廓检测、模板匹配等技…

伯克利 CS61A 课堂笔记 10 —— Trees

本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理&#xff0c;全英文内容&#xff0c;文末附词汇解释。 目录 01 Trees 树 Ⅰ Tree Abstraction Ⅱ Implementing the Tree Abstraction 02 Tree Processing 建树过程 Ⅰ Fibonacci tree Ⅱ Tree Process…

STL —— 洛谷字符串(string库)入门题(蓝桥杯题目训练)(一)

目录 一、B2109 统计数字字符个数 - 洛谷 算法代码&#xff1a; 1. 引入库和命名空间 2. 主函数 3. 读取输入 4. 变量初始化 5. 遍历字符串 6. 输出结果 7. 返回值 总结 评测记录&#xff1a; 二、B2110 找第一个只出现一次的字符 - 洛谷 方法一&#xff1a;算法代…

【数据分析】1 认识数据分析

一、课程核心内容结构 1. 课程定位 商业数据分析导论课&#xff1a;旨在为初学者奠定扎实的基础&#xff0c;介绍数据分析的基本概念、方法和应用场景。后续模块&#xff1a;包括职业发展路径、技能要求等深入内容&#xff0c;帮助学习者规划未来的职业道路。目标群体&#x…