标题: DS1302为什么读不出来? [打印本页]

作者: 电子爱好者life    时间: 2015-5-28 19:01
标题: DS1302为什么读不出来?
unsigned char Read_DS1302(unsigned char addr)
{
           unsigned char i,temp,date;
        temp = addr;
        RST = 0;
        delay(1);
        RST = 1;
        SCLK = 1;
        for(i=8;i>0;i--)
        {
                IO = temp&0x01;//先写低位       
                SCLK = 0;     //上升沿有效
                _nop_()        ;
                SCLK = 1; //为下一个数据的输入做准备
                temp = temp>>1;       
        }
        SCLK = 0;
        for(i=8;i>0;i--)
        {
                date |= (unsigned char)IO;
                SCLK = 1;
                _nop_();
                SCLK = 0;
                date = date<<1;                       
        }
        RST = 0;
        SCLK = 0;
        return date/16*10+date%16;  //返回调整好的16进制数
}

程序逻辑有问题吗?


作者: wthdyfg2004    时间: 2015-5-28 19:45
好像是上升沿才是写地址啊。
作者: 电子爱好者life    时间: 2015-5-28 20:21
wthdyfg2004 发表于 2015-5-28 19:45
好像是上升沿才是写地址啊。

我的第一个for就是写地址,用的是上升沿,这样写有什么问题吗?
作者: admin    时间: 2015-5-28 20:28
你现在这个程序读出来的内容是什么?
作者: 电子爱好者life    时间: 2015-5-28 20:35
admin 发表于 2015-5-28 20:28
你现在这个程序读出来的内容是什么?

读秒、分、时 都是02
作者: 电子爱好者life    时间: 2015-5-31 11:39
  1. unsigned char Read_DS1302(unsigned char addr)
  2. {
  3.            unsigned char i,temp,date;
  4.         temp = addr;
  5.         RST = 0;
  6.         SCLK = 0;
  7.         _nop_();
  8.         _nop_();
  9.         RST = 1;
  10.         for(i=8;i>0;i--)
  11.         {
  12.                 DIO= (bit)(temp&0x01);//先写低位       
  13.                 SCLK = 0;
  14.                 _nop_();
  15.                 _nop_();     
  16.                 temp>>=1;
  17.                 SCLK = 1;      //上升沿 把数据送入
  18.                 _nop_();
  19.                 _nop_();       
  20.         }
  21.         SCLK = 0;
  22.         _nop_();
  23.         _nop_();
  24.         for(i=8;i>0;i--)
  25.         {
  26.                 date |= (unsigned char)DIO;
  27.                 SCLK = 1;
  28.                 _nop_();
  29.                 _nop_();
  30.                 date<<=1;        //左移 先读低位       
  31.                 SCLK = 0;
  32.                 _nop_();
  33.                 _nop_();       
  34.         }
  35.         SCLK = 0;
  36.         _nop_();
  37.         _nop_();
  38.         RST = 0;
  39.         return ((date&0x70)>>4)+(date&0x0f);  
  40. }

  41. 这个能读出数据,有时并不是程序问题,而是硬件电路问题
复制代码





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1