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语法,编一个试试吧~哈哈
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-04-02
你可以定义一个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了,其他位的值不变。
第2个回答  2010-04-02
比如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
第3个回答  2010-04-03
二楼正解,只要将变量定义在51单片机的可位寻址区域20H-2Fh即可 ,bdata类型
uchar bdata b8 ;
b8^0 = 0 ;
b8^1 = 1 ;等等
联合体+结构体+位段 对这种做法 编绎器也会自动将其优化在可位寻址区域,纯粹故弄悬虚,冗长,增加程序维护度,C51讲求的是在有限资源内着重精简、执行效率
相似回答