DS1302读取数据问题

2019-07-16 03:39发布

本帖最后由 cjunrong 于 2012-11-20 16:14 编辑

    各位,我用单片机驱动DS1302的时候遇到了一点问题,在读取数据的时候,使用下面的程序时读取的数值总是错误的,
        for(i=0;i<8;i++)
        {
                ds1302_SCLK=1;
                ds1302_SCLK=0;
                if(ds1302_IO==1)
                        date=date|0x80;
                date>>=1;
        }

而使用下面的程序的时候就是正确的

        for(i=0;i<8;i++)
       {
                if(ds1302_IO)
                        date|=0x80;                        //每次传输低字节
               ds1302_SCLK=0;
              date>>=1;                      //右移一位
                 ds1302_SCLK=1;
        }

看资料说是在下降沿读走数据,而这对于这两个函数断,为啥第一个不行,而第二个行,小弟实在是搞不明白,还望哪位大侠指点一下...!         

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
yatoo
2019-07-18 10:15
cjunrong 发表于 2012-11-23 10:04
656130367

对不起,是我大意了.................

先试试这个程序
  1. void delay(unsigned char i)
  2. {
  3.     unsigned char j;
  4.    for( ; i > 0; i--)
  5.    {
  6.        for(j = 50; j > 0; j--)
  7.             ;
  8.    }
  9. }

  10. uchar ds1302_read_byte(uchar address)
  11. {
  12.         unsigned char date,i,temp;
  13.         temp=address;
  14.         ds1302_CE=0;
  15.         ds1302_SCLK=0;
  16.         ds1302_IO=0;
  17.         ds1302_CE=1;
  18.         //写地址
  19.         for(i=0;i<8;i++)
  20.         {        
  21.                 ds1302_SCLK=0;
  22.                 ds1302_IO=temp&0x01;
  23.                 temp>>=1;
  24.                 ds1302_SCLK=1;
  25.         }
  26.         
  27.         ds1302_IO=1;//拉高数据信号,避免影响芯片输出
  28.         //读数据
  29.         for(i=0;i<8;i++)
  30.         {
  31.                 ds1302_SCLK=0;
  32.                 date>>=1;
  33.                 delay(2);//小延时,留给芯片足够的时间
  34.                 if(ds1302_IO==1)
  35.                         date=date|0x80;
  36.                 ds1302_SCLK=1;
  37.                 delay(2);//小延时,留给芯片足够的时间
  38.                 /*if(ds1302_IO)
  39.                         date|=0x80;                        //每次传输低字节
  40.                 ds1302_SCLK=0;
  41.                 date>>=1;                        //右移一位
  42.                 ds1302_SCLK=1; */
  43.         }
  44.         ds1302_CE=0;
  45.         return date;
  46. }
复制代码

一周热门 更多>