51单片机C语言里面,定义bit的方法,都有哪些,请举例,谢谢!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机C语言里面,定义bit的方法,都有哪些,请举例,谢谢!相关的知识,希望对你有一定的参考价值。

51单片机C语言里面,定义bit的方法,有哪些,请举例,谢谢!
比如:1,bit flag1;
还有结构体,联合体来定义的,具体怎么样能不能举例,因为我刚从汇编转C,比较菜鸟;谢谢帮忙!
一楼的朋友的是对SFR的定义,我是想知道RAM里面数据寄存器的 先定义一个byte ,然后在这个定义的byte里面定义8个bit,能不能做到这样的定义,怎么定义呢?先谢谢一楼的朋友。 一楼的给出的ARM的方法好高深,谢谢; Gin_HK朋友是我要的答案,但后面的联合体定义的如果是定义8个位,再定义一个byte这样也行吧?我要等效第一种方法;
union bit_def

unchar b8;
struct bit8_def

char b0:1;
char b1:1;
char b2:1;
char b3:1;
char b4:1;
char b5:1;
char b6:1;
char b7:1;
bit;
;
union bit_def rk;
#define fkey_in rk.bit.b0 //
#define fkey1 rk.bit.b1 //key1
#define fkey2 rk.bit.b2 //key2
这个方法,不知道C51行不行;我在另外一个单片机上试过,但我不是很明白为什么结构体里面的定义是那样的语法,因为我没见过有说明可以那样;

一共可以定义16个字节的位寻址变量

static uchar bdata CanBusFlag=0; //can标志
sbit CanRcv_Good=CanBusFlag^0; //成功接收标志
sbit CanSend_Good=CanBusFlag^1; //成功发送标志
sbit CanErrFlag=CanBusFlag^2; //can总线错误标志
sbit CanDtOverFlag=CanBusFlag^3; //can总线超载标志
sbit CanWuiFlag=CanBusFlag^4; //can总线唤醒中断

//你改变CanBusFlag,下面的一堆变量也变了,反之既然

定义:
union UniTEMP // 温度采样值

uint TEMP;
uchar TEMP_AD[2];
idata uTEMP; //idata是定义变量存储空间,这里用的8952单片机,有idata空间
。。。。
程序里面使用:
uTEMP.TEMP=XXX;//其实TEMP_AD[2]数组里面的内容也变了,union 结构嘛

如果你只定义8个位,就用第一种方式。
union 结构是为了方便大数据的操作才使用的。如果你要用union 定义一个8位变量的每一位,想应该可以吧。不过不知道符不符合C语法,编一个试试吧~哈哈
参考技术A 你可以定义一个bdata类型的,然后分别定义这8位
如:
unsigned char bdata temp;
sbit temp0 = temp ^ 0;
sbit temp1 = temp ^ 1;
sbit temp2 = temp ^ 2;
sbit temp3 = temp ^ 3;
sbit temp4 = temp ^ 4;
sbit temp5 = temp ^ 5;
sbit temp6 = temp ^ 6;
sbit temp7 = temp ^ 7;
这样就能使用temp这个字节里面的8位了。
例如:
temp3 = 1;
temp5 = 1;
则temp字节的第3位和第5位被置为1了,其他位的值不变。
参考技术B 比如LED灯的控制
sbit D1=P1^0;
sbit D2=P1^1;
sbit D3=P1^2;
sbit D4=P1^3;
sbit D5=P1^4;
sbit D6=P1^5;
sbit D7=P1^6;
sbit D8=P1^7;
这样在操作的时候就不用对整个P1口操作,直接操作位即可

得到指定地址上的一个字节或字的方法如下:
#define MEM_B(x) (*((byte *)(x)))
#define MEM_W(x) (*((word *)(x)))
不过这个有点复杂,一般用于ARM
参考技术C 二楼正解,只要将变量定义在51单片机的可位寻址区域20H-2Fh即可 ,bdata类型
uchar bdata b8 ;
b8^0 = 0 ;
b8^1 = 1 ;等等
联合体+结构体+位段 对这种做法 编绎器也会自动将其优化在可位寻址区域,纯粹故弄悬虚,冗长,增加程序维护度,C51讲求的是在有限资源内着重精简、执行效率

c 语言中 bit与sbit的区别

不是C语言里的,而是C51里面的。

区别在于功能不同:

bit:是变量类型,相当于boot 只占一个位,最多可定128个bit变量。

sbit:是给可位寻址的变量(或特殊功能寄存器)的某一个位定个别名,不另占空间。

扩展资料:

单片机中C语言sbit使用方法——

1、bit位标量。

bit位标量是c51编译器的一种扩充数据类型,利用它可以定义一个位标量,但是不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0或1,类似boolean中的true和false。

2、sfr特殊功能寄存器。

sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255.利用它可以访问51单片机内部的所有特殊功能寄存器。如果sfr P1 = 0x90,这一句定P1为P1端口在片内的寄存器,在后面的语句中我们可以用P1=255(对P1端口的所有的引脚置高电平)之类的语句来操作特殊功能寄存器。

sfr是定义8位的特殊功能寄存器而sfr16 则是定义16位特殊功能寄存器。


参考技术A

一、意思不同

bit是变量类型,相当于boot 只占一个位,最多可定128个bit变量,sbit是给可位寻址的变量(或特殊功能寄存器)的某一个位定个别名,不另占空间。

如:

bit YesOrNo; //定义bit型变量 占用bdata区的一个位。

sbit P0_1 = P0^1; //申明一个引用名 P0_1 指向端口P0的1号接脚,不会额外分配空间。

二、用法不同

bit,sbit是KEIL c51里面扩展的数据类型,BIT表示一位二进制类型的数据,只有0,1两种取值

SBIT表示一位字符,sbit是位定义,这个定义只有51内核的单片机才有,一般用于51端口的位操作,一个P口有8位,sbit就可以定义一个通俗的名字来描述一端口8位中的其中一位如sbit LED=P0^1; sbit key=P0^2;等等,这样当你使用LED或者KEY时就相当于对P0.1和P0.2操作了。

三、用处不同

sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0×90这一句定P1为P1端口在片内的寄存器,用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。




参考技术B

bit和sbit这两者不是C语言里面的,而是C51里面的;

bit和sbit的区别在于两者功能不同,具体如下:

bit是变量类型,相当于boot 只占一个位,最多可定128个bit变量,而sbit是给可位寻址的变量的某一个位定个别名,不另占空间;

扩展资料:

bit定义:

比特是英文 binary digit的缩写,比特是表示信息的最小单位,是二进制数的一位包含的信息或2个选项中特别指定1个的需要信息量,一般来说,n比特的信息量可以表现出2的n次方种选择;

sbit定义:

sbit是定义特殊功能寄存器的位变量,bit和sbit都是C51扩展的变量类型,应用如sbit P0_0=P0^0;//即定义P0_0为P0口的第1位,以便进行位操作,bit和int char之类的差不多,只不过char=8位, bit=1位而已,都是变量,编译器在编译过程中分配地址;

参考资料来源:百度百科-sbit

参考资料来源:百度百科-bit

参考技术C bit和sbit都是C51扩展的变量类型。

bit和int char差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。除非指定,否则这个地址是随机分配的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,和Windows下VC中的BOOL类似。

sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6的定义,这个sbit量就确定地址了。

bit和sbit的最大区别在于,bit是定义一个变量;sbit经常用在寄存器中的,方便对寄存器的某位进行操作。

参考资料:http://zhidao.baidu.com/question/72536362.html

本回答被提问者采纳
参考技术D   bit : 编译时分配空间 sbit 只能在外部定义全局变量。 sfr(特殊功能寄存器)的bit。SFR是系统指定的内存地址。   bit 动态分配的,有编译器来指定内存地址。   bit和sbit都是C51扩展的变量类型。   sbit 要在最外面定义,就是说必须定义成外部变量.sbit定义的是SFR(特殊功能寄存器)的bit   sbit更像是类型定义,不像是变量定义。   sbit: 指示说明性说明   bit 可以在外部或内部定义。   bit和int char之类的差不多,只不过char=8位, bit="1位而已"。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。   bit是编译器在的可寻址区分配的一个位变量,是不定的,不是绝对地址目标。   所有可位寻址的位都可由sbit指定,这包括可位寻址区和SFR中的位。   sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。   sbit位寄存器是可位寻址的绝对地址目标,定义后编译器是不会改变位置的。

以上是关于51单片机C语言里面,定义bit的方法,都有哪些,请举例,谢谢!的主要内容,如果未能解决你的问题,请参考以下文章

c语言中bit和sbit的区别哪些

C语言中,用于设置中断、中断信号的函数都有哪些?怎么设置一个发送中断信号(自己定义的)的函数?

单片机c语言程序设计中,用关键字bit定义单片机的端口.对吗

C51位变量bit定义

C语言中sbit是啥意思,与bit有啥区别?

位变量bit和sbit有啥用?