[经验分享] C51单片机IO口设置sbit与bit

[复制链接]
 楼主| 1988020566 发表于 2024-6-19 15:00 | 显示全部楼层 |阅读模式

最近由于项目要求需要用到C51的芯片,才发现跟STM32小细节有很多不一样。
一、sbit和bit的区别
1.sbit
sbit是"single bit"的缩写,用来定义一个单个引脚。它通过特殊功能寄存器(SFR)访问和操作相应的引脚位。例如
sbit LED = P5^7;
这是将单片机引脚5.7定义为LED,后面需要对这个引脚置高置低,就可以直接使用LED=0;
2.bit
bit是位数据类型,在51单片机中用来定义和读写单个位。它通常用于对寄存器中的特定位进行操作。例如

bit  DisplayStatus;//定义一个位变量,只有0和1置值,或者寄存器的某一位

sbit和bit只能用于访问和操作单个引脚或位,无法对多个引脚或位进行批量操作。在编写51单片机的程序时,可以根据需要选择使用sbit或bit来方便地对单个引脚或位进行操作。
二、定义时需要的坑
我需要控制5.7口为LED灯(如上面1所示),在我使用sbit进行定义,位寻址的时候,报错信息“‘P5’: invalid base address”
此错误消息表明,为SBIT字节指定的基地址是无效的。SBIT 的字节地址必须是低位是0或8的SFR。
sfr P1 = 0x90;
sbit P1_0 = P1^0; // This is valid
sfr P4 = 0xD1;
sbit P4_0 = P4^0; // This is NOT valid since P4 is not an a 0 or 8 boundary
查看了一下我的芯片手册的地址

果然在P5的地址为CFH,不是以0或者8结尾,所以无法使用位寻址,而这个又是芯片手册规定的地址无法修改。所以P5的引脚都不能使用位寻址啦,这里可以用逻辑运算符取出来那位引脚,比如你需要读5.7这个引脚的电平是不是0,就定义

if(P5&0x80==0)

uptown 发表于 2024-7-4 19:31 | 显示全部楼层
sbit 关键字用于定义一个可位寻址的特殊功能寄存器中的单个位。
pmp 发表于 2024-7-12 14:31 | 显示全部楼层
sbit关键字可以用于定义I/O端口,但不能用于定义内部RAM变量。
mikewalpole 发表于 2024-7-12 14:38 | 显示全部楼层
bit关键字可以用于定义I/O端口,也可以用于定义内部RAM变量,但不能用于定义外部RAM变量。
belindagraham 发表于 2024-7-12 19:13 | 显示全部楼层
sbit只能用于位寻址的特殊功能寄存器,其地址必须是8的倍数。
bit变量可以用于一般的逻辑运算和位操作,但不能直接控制硬件引脚。
eefas 发表于 2024-7-12 20:44 | 显示全部楼层
sbit 和 bit 都是C51编译器扩展的关键字,用于处理位级别的操作。sbit 用于访问和控制硬件引脚和外设,而 bit 用于程序内部的逻辑判断和状态存储。

elsaflower 发表于 2024-7-12 21:33 | 显示全部楼层
sbit 引脚名称 = SFR名称^位位置;
其中SFR名称是特殊功能寄存器的名字,位位置是寄存器中位的位置。
hudi008 发表于 2024-7-12 21:55 | 显示全部楼层
它可以用来直接访问和控制单片机内部寄存器的某个位,例如控制 I/O 口的电平状态。
houjiakai 发表于 2024-7-12 22:56 | 显示全部楼层
在编写51单片机的程序时,根据需要选择使用sbit或bit来方便地对单个引脚或位进行操作。
earlmax 发表于 2024-7-13 10:04 | 显示全部楼层
sbit 和 bit 是用来定义和操作特殊功能寄存器(SFR)中的位地址的关键字。
pixhw 发表于 2024-7-13 19:02 | 显示全部楼层
sbit关键字:用于在C语言中指定一个特定的I/O端口地址。它允许你像访问变量一样访问I/O端口。
maqianqu 发表于 2024-7-14 14:40 | 显示全部楼层
在C51单片机编程中,sbit 和 bit 都是用来定义位变量的关键字,但它们的使用场景和功能有所不同。
yorkbarney 发表于 2024-7-14 14:55 | 显示全部楼层
bit 变量可以在程序的任何地方声明和使用,不限于特殊功能寄存器。
beacherblack 发表于 2024-7-14 15:09 | 显示全部楼层
sbit和bit关键字用于对特定的I/O端口或者特定的位进行操作。
olivem55arlowe 发表于 2024-7-14 15:24 | 显示全部楼层
sbit 是C51单片机特有的关键字,用于定义单个IO口。它可以用来对单个IO口进行操作,如设置、清除、读取等。
pentruman 发表于 2024-7-14 15:38 | 显示全部楼层
sbit 用于访问SFR中的特定位,通常用于控制单片机的硬件外设。
bit 用于定义普通的位变量,用于存储程序中的逻辑状态或标志。
chenci2013 发表于 2024-7-14 15:53 | 显示全部楼层
sbit(single bit)类型主要用于定义单片机特殊功能寄存器(SFR,Special Function Register)中的某个具体位。sbit变量可以直接映射到SFR的特定位,从而能够直接控制或读取I/O端口的各个引脚状态。
linfelix 发表于 2024-7-14 16:05 | 显示全部楼层
bit 关键字用于定义普通的位变量,它可以用来存储布尔值或者标志位。与 sbit 不同,bit 定义的位变量不是与特定的SFR位关联的,而是存储在RAM中的位寻址区域。
deliahouse887 发表于 2024-7-14 16:17 | 显示全部楼层
使用sbit定义的端口可以在任何允许访问指针的上下文中使用,而bit变量通常只能作为位操作的辅助变量。
gygp 发表于 2024-7-14 16:30 | 显示全部楼层
sbit 必须在所有函数的外部定义,因为它涉及到硬件地址。
bit 可以在函数内部或外部定义,取决于你是否希望它在整个程序中都可见。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

420

主题

10981

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部