打印

怎样一位一位地接收 数据,存储在一个8位的变量中?

[复制链接]
5079|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flyleaf91|  楼主 | 2011-4-5 11:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在I2C和ds1302,ad0832之类的芯片操作中,经常要一位一位地读取数据。以前我是用ACC的,如下面的程序:
uchar ds1302_output(void)

{
  uchar i;
  for(i=0;i<8;i++)
  {
   DS1302_SCLK = 0;  //下降沿读取数据
ACC >>= 1 ;   //最后一位不移动
ACC7 = DS1302_IO;
DS1302_SCLK = 1;
  }
  return ACC;
}


但后来发现用ACC很容易会出错,至于为什么会出错,大家有兴趣可以看看我的博文
http://blog.csdn.net/flyleaf91/archive/2011/04/04/6302209.aspx

所以现在想用一个方法,把从 按位 输出的数据用8位的变量接收,不知道如何实现,求教。

相关帖子

沙发
john_lee| | 2011-4-5 11:36 | 只看该作者
通用的方法:使用16位的右移操作。
假设输入的数据(1位)在字节的bit0,把这个字节放在16位数据的高8位,把以前保存的数据放在低8位,然后整个16位数据右移1位,现在低8位就是组合后的新数据了。

使用特权

评论回复
板凳
flyleaf91|  楼主 | 2011-4-5 11:41 | 只看该作者
2# john_lee
问题是怎样把bit类型的数据赋值给char型的数据呢?直接赋值编译不通过。。

使用特权

评论回复
地板
flyleaf91|  楼主 | 2011-4-5 12:07 | 只看该作者
2# john_lee
想出来了,程序可以改为这样
uchar ds1302_output(void)
{
  uchar i,temp;
  for(i=0;i<8;i++)
  {
   DS1302_SCLK = 0;  //下降沿读取数据
temp |= DS1302_IO;
temp = (temp>>1)|(temp<<7);    //最后一位不移动
DS1302_SCLK = 1;
  }
  return temp;
}
谢谢你的回复

使用特权

评论回复
5
sdpz| | 2011-4-5 20:17 | 只看该作者
uchar i, temp;

temp = 0;    // 楼主,你的程序连初始化都没有,怎么会正常呢????
i = 8;

//对于MSB先出来的情况
while (i--)
{
    DS1302_SCLK = 0;
    temp <<= 1;                      //第一次是空移,自然不会丢位了
    temp |= DS1302_IO;
    DS1302_SCLK = 1;
}

//对于LSB先出来的情况
   temp >>= 1;          //第一次是空移,自然不会丢位了
    if (DS1302_IO)
      temp |= 0x80;

使用特权

评论回复
6
coody| | 2011-4-5 21:28 | 只看该作者
往高移,偶一般如下:
tmp <<= 1;
if(IO)  tmp++;

右移一般如下:
tmp >>= 1;
if(IO)  tmp |= 0x80;

使用特权

评论回复
7
sdpz| | 2011-4-6 09:22 | 只看该作者
嗯。楼上的高移只产生两条指令,在12T的51单片机上效率比较高。
不过,既然你引出了这个话题,我就顺便说说了。
虽然它只产生两条指令,但在1T的51上速度偏慢。原因是跳转指令耗时太长。总体速度比或语句产生的4条指令要慢2个周期以上。而对非51类的处理器(包括RSIC及其他CISC架构单片机),或语句产生指令更少,速度更快。循环里加条件都会影响算法速度。

使用特权

评论回复
8
coody| | 2011-4-6 12:07 | 只看该作者
7楼,如果你真的要快,就用接近汇编的方式编写,还是用ACC,不会被优化掉的。
比如我用STC的51模拟SPI,发送或接收一个位是13T,用26M时钟的话,位率是2Mbps。

使用特权

评论回复
9
huangqi412| | 2011-4-6 12:28 | 只看该作者
移位

使用特权

评论回复
10
原野之狼| | 2011-4-6 14:13 | 只看该作者
高级语言编程时不要去使用ACC

使用特权

评论回复
11
ayb_ice| | 2011-4-6 16:58 | 只看该作者
谁都知道在C中最好不要操纵ACC,
但可控的操纵ACC也是没有问题的,像你这样用肯定死悄悄的

使用特权

评论回复
12
aihe| | 2011-4-8 18:35 | 只看该作者
用共同体不是挺好的嘛

使用特权

评论回复
13
flyleaf91|  楼主 | 2011-4-10 11:26 | 只看该作者
11# ayb_ice 同意,在c中用acc会死得很难看 http://blog.csdn.net/flyleaf91/archive/2011/04/04/6302209.aspx

使用特权

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

本版积分规则

110

主题

157

帖子

2

粉丝