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

我是初学者,我想定义一个变量,要把这变量存放于可位寻址区,后期可以对每一位进行单独操作的,最好是能把这变量固定在那个地址不变的,要怎么编写呢忘了说明是C51单片机的... 我是初学者,我想定义一个变量,要把这变量存放于可位寻址区,后期可以对每一位进行单独操作的,最好是能把这变量固定在那个地址不变的,要怎么编写呢
忘了说明是C51单片机的
展开
 我来答
wolf_lhy
2013-07-19 · TA获得超过6609个赞
知道大有可为答主
回答量:1090
采纳率:66%
帮助的人:547万
展开全部
是这个样子的,你只要声明了位变量,比如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变量的地址,因为没有什么实际意义。
修者世界
2015-05-30 · TA获得超过5850个赞
知道大有可为答主
回答量:5984
采纳率:61%
帮助的人:802万
展开全部
单片机中,可以位寻址的有两个地方,第一是特殊功能寄存器中可以被8整除的寄存器,第二就是20H~2FH这个位址空间。两个地方的位变量申明不一样。
第一个地方的申明是: sbit 位变量
比如:sbit pwm=P1^0;
第二个地方的申明是:bit 位变量
比如: bit flag;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
西城飞羽CXD
2013-07-19 · TA获得超过323个赞
知道答主
回答量:55
采纳率:100%
帮助的人:43万
展开全部
首先是你的头文件是#include<reg51.h>
在这个头文件中包含着一些声明比如:sfr scan ;
这个声明是你在程序中不必写出来的,只需要#include<reg51.h>
然后你再在你的程序中写语句:sbit 变量名 P0^1;
注意这个P0^1是指P0输出/输入的第一个位。希望对你有帮助
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一路清晨503
2013-07-19 · TA获得超过228个赞
知道小有建树答主
回答量:413
采纳率:100%
帮助的人:253万
展开全部
int *cc;
cc=(int*)0X6300 ;
*cc=3;
更多追问追答
追问
我是初学者,还不是很清楚命令,能帮我把每句都写上中文说明吗?那个*号是什么意思?我在书中没看到,那个0x6300怎么这么大?最大不是0xFF吗?你是设了个16位的?
追答
如果你不知道你的计算机是多少位寻址可以这样做
char *p="a";
printf("%p",p);
这样就把p的地址输出来了。
int *cc是定义一个指针,
cc=(int*)0X6300 是吧地址强制类型转换成指向该地址的指针
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式