历史上的今天
今天是:2026年01月06日(星期二)
2023年01月06日 | 说一说学51时候躺过的坑——bit和sbit的区别
2023-01-06 来源:zhihu
什么是bit和sbit?他们有什么区别?
在刚学51单片机的时候刚看到这个两个东西的时候就是一脸懵逼,脑子里面第一反应就是,这是什么鬼啊,C语言里面没说过啊,于是去B站看了51单片机视频教程,终于知道了这是一种数据类型,类似于int、float一样,但是某天自己写代码使用到的时候就一脸懵逼了,如下面函数返回值的类型应该怎么决定?为什么必须要这样?
函数返回值是应该这样写呢?

还是应该这样写?

于是,好奇的我两种情况都试了试,但是事实却是试试就逝世
试第二种的时候编译器报错了

这又是什么情况?难度两个不一样吗?
于是查了一下资料
bit和sbit都是C51扩展的变量类型。
bit
bit编译时分配空间
sfr(特殊功能寄存器)的bit。SFR是系统指定的内存地址。
bit 动态分配的,有编译器来指定内存地址。
bit 可以在外部或内部定义。
bit和int char之类的差不多,只不过char=8位, bit="1位而已"。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。
bit是编译器在的可寻址区分配的一个位变量,是不定的,不是绝对地址目标。
sbit
sbit 只能在外部定义全局变量。
sbit 要在最外面定义,就是说必须定义成外部变量.sbit定义的是SFR(特殊功能寄存器)的
bit
sbit更像是类型定义,不像是变量定义。
sbit: 指示说明性说明
所有可位寻址的位都可由sbit指定,这包括可位寻址区和SFR中的位。
sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。
sbit位寄存器是可位寻址的绝对地址目标,定义后编译器是不会改变位置的。
上一篇:51单片机学习笔记(一):LED
下一篇:51单片机的基本功能
史海拾趣
|
按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4... 我写了第3行的检测,就是说:按键按下的话 ,会显示:16 25 36 49: 但是我在实验板上运行的时候,高位的数字只会闪一下 ...… 查看全部问答> |
|
Hp2490如何打开无线网卡,连接指定SSID,最好用C#完成,谢谢 Hp2490如何打开无线网卡,连接指定SSID,最好用C#完成,例如,我们办公室有N个无线网络,我想通过程序控制连接其中指定一个网络。… 查看全部问答> |
|
前一阵重新装机,从网上下了个IAR 3.41 然后有个小工具生成序列号,安装过程没问题,可是在程序编译时出现下面的提示: Fatal Error[Cp001]: Copy protection check, No valid license found for this product [20] 这是什么问题呀?… 查看全部问答> |
|
我尝试把ucos2移植到 cortex m0上,参考了 ucos over cortex m3 的代码。 有这样一个不明白的地方:从main函数开始,系统默认是使用 MSP 做堆栈使用的,也就是说 process模式和 中断模式都是用 MSP。 现在需要改成 proce ...… 查看全部问答> |
|
今天看了下点阵的教程,自己跑去搞了下 ,结果弄是弄出来,可就是每次图像移动前都会红一团 这是电路图还有代码,大大帮忙看看#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbi ...… 查看全部问答> |
|
我在用CCS5中调用IQMATH函数时发现以下小问题: 下面是我的代码: _iq30 in2, out2 ; in2 =_IQ10(0.333*PI/(2*PI)); out2 =_IQ10sinPU(in2); temp = _IQ10toF(out2); in2 =_IQ30(0.333*PI/(2*PI)); out2 =_IQ30cosPU(in2); temp = _IQ30toF ...… 查看全部问答> |




