文章目录
- 前言
- 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地址:特殊功能寄存器的地址。
位号:寄存器中的位编号(0 到 7)
特点
作用范围
作用范围:仅限于 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 的固定地址(0x80 到 0xFF)。
示例:
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. 总结
- sfr 用于定义 8051 单片机的特殊功能寄存器(SFR)。
- 通过 sfr 可以直接访问硬件资源,如 GPIO、定时器、串口等。
- 结合 sbit 可以更方便地操作寄存器的某一位。
- 合理使用 sfr 可以提高代码的可读性和简洁性。
- 通过掌握 sfr 的使用,可以更高效地开发 8051 单片机的应用程序。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了sbit、bit、sfr的使用。