单片机C语言怎么声明一个可以位寻址的变量

我是初学者,我想定义一个变量,要把这变量存放于可位寻址区,后期可以对每一位进行单独操作的,最好是能把这变量固定在那个地址不变的,要怎么编写呢
忘了说明是C51单片机的

是这个样子的,你只要声明了位变量,比如bit a;而且这个变量是全局变量,或者是函数内部的静态变量,那么,这个位变量的地上就恒不变了,只是地址是多少这个是编译器随机分配的,不敢十分确定,但是在以后的运行中,地址肯定是不变的。

如果你声明的是函数内部的动态变量,比如在函数内部声明:bit a,那么,这个位变量是随着函数的调用变化的,其地址也是变化的。

所以,你只要声明一个全局的位变量,那么,这个变量就肯定是地址不变的,当然,不知道其地址具体是多少罢了。

如果你非要知道每个地址是多少,那么,有两个办法:

1 你集中把128个位全部都定义出来。
比如,你在某个C文件里,这样写:
bit Bit00 = 0;
bit Bit01 = 0;
bit Bit02 = 0;
bit Bit03 = 0;

一直定义128个,把所有位空间占满,那么,这样,就可以肯定Bit00的地址是0x20的最低位,bit01的地址是0x20的次低位了。

2 用sbit,而不用bit.

比如:unsigned char data B_Var[16] = 0;

sbit Led_Status1 = B_Var[0]^7;那么,就表示Led_Status 是第20H地址中的最高位。

sbit Led_Status2 = B_Var[6]^3;那么,就表示Led_Status 是第26H地址中的第3位。
这个其实并不是定义了位变量,只是起了个别名而已。但效果一样,只是注意,你更改B_Var[6],可能会更改26H的地址第3位,所以,如果你只用位,那么,就不要操作B_Var[6]这个数组元素。

其实呢,你只要定义个全局变量就行了,没有必要知道这个bit变量的地址,因为没有什么实际意义。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-05-30
单片机中,可以位寻址的有两个地方,第一是特殊功能寄存器中可以被8整除的寄存器,第二就是20H~2FH这个位址空间。两个地方的位变量申明不一样。
第一个地方的申明是: sbit 位变量
比如:sbit pwm=P1^0;
第二个地方的申明是:bit 位变量
比如: bit flag;
第2个回答  2013-07-19
首先是你的头文件是#include<reg51.h>
在这个头文件中包含着一些声明比如:sfr scan ;
这个声明是你在程序中不必写出来的,只需要#include<reg51.h>
然后你再在你的程序中写语句:sbit 变量名 P0^1;
注意这个P0^1是指P0输出/输入的第一个位。希望对你有帮助
第3个回答  2013-07-19
int *cc;
cc=(int*)0X6300 ;
*cc=3;追问

我是初学者,还不是很清楚命令,能帮我把每句都写上中文说明吗?那个*号是什么意思?我在书中没看到,那个0x6300怎么这么大?最大不是0xFF吗?你是设了个16位的?

追答

如果你不知道你的计算机是多少位寻址可以这样做
char *p="a";
printf("%p",p);
这样就把p的地址输出来了。
int *cc是定义一个指针,
cc=(int*)0X6300 是吧地址强制类型转换成指向该地址的指针

追问

哦,我忘了说清楚我是要编写c51单片机的,

追答

写驱动??

追问

不是,是写c51单片机的程序,输入到单片机里运行的,你是学电脑C语言的吗?单片机不知道吗

追答

51开发板地址是16位的也就是0XFFFF正好16位啊,我用的arm的开发板,

相似回答