打印
[51单片机]

51单片机不能定义位变量的数组吗?

[复制链接]
5303|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
renwocai|  楼主 | 2015-12-19 10:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
是这样的,我想写一个关于红外解码的程序,我们都知道,红外解码就是解出4个编码,每次读取相邻两次下降沿之间的宽度,用来判断该位是零还是一,然后八个位合成一个字节。

如果能做成这样:先定将32个位的数组:bit wei[32],再定义一个4个变量的数组:uchar idata shu[4];再将这二个数组指向同一对象:wei=shu;那么,在判断的时候就会极其简单,在得到脉冲宽度进行判断后,我只需要对位进行写操作,再直接读取idata数组中的值就可以了,而且进中断的次数也可以和位数组的下标联系起来,然而可惜的是,51单片机在定将位数组时提示"array of bit"。位是不能作为数组元素定义的。

难道我只能先定义四个变量,再用sbit 语句定义每个变量中的位,如
Unsigned char bdata bitdata;
sbit bit7=bitdata^7;
sbit bit6=bitdata^6;
sbit bit5=bitdata^5;
sbit bit4=bitdata^4;
sbit bit3=bitdata^3;
sbit bit2=bitdata^2;
sbit bit1=bitdata^1;
sbit bit0=bitdata^0;

感觉这样好麻烦啊,四个变量一共要写32次,在每次判断后对位的赋值也很麻烦,求大虾给点思路呗

相关帖子

沙发
JY-DX-JY| | 2015-12-19 10:28 | 只看该作者
联合体。

使用特权

评论回复
板凳
huangxz| | 2015-12-19 10:33 | 只看该作者
楼主这样用的也实在是很少,而且51应该没有bitband,不能直接下标(偏移地址)访问位地址的吧.

使用特权

评论回复
地板
renwocai|  楼主 | 2015-12-19 10:38 | 只看该作者

可以具体点吗?谢谢

使用特权

评论回复
5
JY-DX-JY| | 2015-12-19 11:07 | 只看该作者
union ccb
{
        unsigned char a;
        struct cb
        {
                unsigned char a1:1;
                unsigned char a2:1;
                unsigned char  a3:1;
                unsigned char  a4:1;
                unsigned char  a5:1;
                unsigned char  a6:1;
                unsigned char  a7:1;
                unsigned char  a8:1;
        }Bit;
}c;

使用特权

评论回复
6
renwocai|  楼主 | 2015-12-19 11:39 | 只看该作者
JY-DX-JY 发表于 2015-12-19 11:07
union ccb
{
        unsigned char a;

谢谢。我先翻下谭浩强的书。:$

使用特权

评论回复
7
dirtwillfly| | 2015-12-19 13:05 | 只看该作者
5楼正解,51的位访问不能通过数组的

使用特权

评论回复
8
renwocai|  楼主 | 2015-12-19 16:44 | 只看该作者
翻了一下谭的书,按我的理解是不是中间的构造体成员改为bit型?另外,机锋市场体中的冒号是什么意思?

使用特权

评论回复
9
yoghen| | 2015-12-19 17:55 | 只看该作者
本帖最后由 yoghen 于 2015-12-19 17:56 编辑
renwocai 发表于 2015-12-19 16:44
翻了一下谭的书,按我的理解是不是中间的构造体成员改为bit型?另外,机锋市场体中的冒号是什么意思? ...

看一下C语言的“位域”就知道具体什么意思了。我也姓谭,但还是觉得谭老师那书,学单片机的时候,没有太大的参考必要,找和51单片机相关的C资料更好

使用特权

评论回复
10
cov0xt| | 2015-12-20 08:31 | 只看该作者
我原来写LED流水灯的时候,也遇到了这样的问题:

sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
sbit LED5=P0^4;
sbit LED6=P0^5;
sbit LED7=P0^6;
sbit LED8=P0^7;

想控制所有LED的亮灭,需要写好多重复代码:

LED1=0;
LED2=1;
LED3=0;
LED4=1;
LED5=0;
LED6=1;
LED7=0;
LED8=1;



于是,我想把LED装入数组:

sbit LED[8]={P0^0,P0^1,P0^2,P0^3,P0^4,P0^5,P0^6,P0^7,};


结果,语法错误:L……原来sbit不支持数组!

后来,我采用了整体控制P0口,进行位运算的方法:

#define GPIO_LED P0
GPIO_LED=0x01;
GPIO_LED=0x02;
……


使用特权

评论回复
11
逍遥派掌门| | 2015-12-20 23:10 | 只看该作者
使用 ACC

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

173

帖子

1

粉丝