[51单片机] DS1302时钟问题

[复制链接]
1945|10
 楼主| yexinsuso 发表于 2013-11-24 19:10 | 显示全部楼层 |阅读模式
最近在学51,关于DS1302的时序问题,一般读一字节数据是这种unsigned char output(void)
{
        unsigned char i,dat=0;
        for(i=8;i>0;i--)
                {
                        dat>>=1;
                        if(DS1302_IO)dat|=0x80;
                        CLK=1;
                        CLK=0;
                }
                return (dat);
}
但是我有一直疑问:这一个字节数据到底是怎么样的过程被读出??if(DS1302_IO)dat|=0x80;这句话不是把所有的位都置1了吗??求大神能仔细帮我剖析这段代码,谢谢了
ningling_21 发表于 2013-11-24 19:14 | 显示全部楼层
总共循环8次,一次只读出一个位。

这个只是把最高位写为1,其它位不变。
chenyu988 发表于 2013-11-25 14:52 | 显示全部楼层
最高位,假设为a置1,下一次循环来了后右移1位,变成了第七位,。。。当8次循环结束后,a变成了最低位,最后一次的数据是最高位
ayb_ice 发表于 2013-11-25 15:38 | 显示全部楼层
每次都在移位嘛(同时清零一位)
 楼主| yexinsuso 发表于 2013-11-27 12:01 | 显示全部楼层
ningling_21 发表于 2013-11-24 19:14
总共循环8次,一次只读出一个位。

这个只是把最高位写为1,其它位不变。 ...

谢谢关注,那数据读出来的时候应该是一位一位的吧?那我觉得改成if(DS1302_IO)dat|=(bit) 1   应该更好理解,但是这样结果显示就不正确了,为什么呢??
 楼主| yexinsuso 发表于 2013-11-27 12:03 | 显示全部楼层
chenyu988 发表于 2013-11-25 14:52
最高位,假设为a置1,下一次循环来了后右移1位,变成了第七位,。。。当8次循环结束后,a变成了最低位,最 ...

谢谢关注,那为什么要在  if(DS1302_IO)   的条件下执行移位操作呢??
 楼主| yexinsuso 发表于 2013-11-27 12:03 | 显示全部楼层
ayb_ice 发表于 2013-11-25 15:38
每次都在移位嘛(同时清零一位)

谢谢关注,我很笨,请问怎么体现出“ 清零 ”的呢??
 楼主| yexinsuso 发表于 2013-11-27 12:08 | 显示全部楼层
chenyu988 发表于 2013-11-25 14:52
最高位,假设为a置1,下一次循环来了后右移1位,变成了第七位,。。。当8次循环结束后,a变成了最低位,最 ...

谢谢关注,我觉得数据是一位一位传出来的,那每次dat的数据都在变。为什么要在if(DS1302_IO)的前提下移位,如果DS1302_IO 不等于1,岂不是少操作一次,即dat少移位一次,那最终传出来来的dat不是不完整的吗??
戈卫东 发表于 2013-11-27 12:22 | 显示全部楼层
典型的移位寄存器访问......
ningling_21 发表于 2013-11-27 12:47 | 显示全部楼层
yexinsuso 发表于 2013-11-27 12:01
谢谢关注,那数据读出来的时候应该是一位一位的吧?那我觉得改成if(DS1302_IO)dat|=(bit) 1   应该更好理 ...

dat是字符型变量,不能被赋值为 位变量 的值。
ayb_ice 发表于 2013-11-27 13:57 | 显示全部楼层
yexinsuso 发表于 2013-11-27 12:03
谢谢关注,我很笨,请问怎么体现出“ 清零 ”的呢??

dat>>=1;

这是C标准规定的,我也没有办法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部