打印

看下ds1302的程序是否有问题?

[复制链接]
1612|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luotianzhi|  楼主 | 2009-9-28 10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
se, TE, RS, TI, ST
读到的数据一直为0XFF,就是没读到数据(应该是命令写不进去造成的),上拉电阻也加了,晶振也换了好几个,为何如此?
/********************************************************************
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
***********************************************************************/
void sendByte(uchar command, uchar sendDAT)
{
     uchar i;
     T_RST = 0;
     nop();
     T_CLK = 0;
     nop();
     T_RST = 1;
     nop();
     for(i=0;i<8;i++)
     {
         T_IO=command&0x01;   
         nop();
         T_CLK = 0;
         nop();
         //nop();
         T_CLK = 1;
         nop();
         command=command>>1;
      }
     for(i=0;i<8;i++)
     {
         T_IO = sendDAT&0x01;
         nop();
         T_CLK =0;
         nop();
         //nop();
         T_CLK =1;
         nop();
         sendDAT=sendDAT>>1;
      }
      
     T_RST =0;
}
/********************************************************************
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 返回值: ucDa :读取的数据
***********************************************************************/
uchar readbyte(uchar ucAddr)
{
     uchar i,ucDa=0;
     T_RST = 0;
     nop();
     T_CLK = 0;
     nop();
     T_RST = 1;
     for(i=0;i<8;i++)
     {    //nop();
          T_IO=ucAddr&0x01;
          nop();
          T_CLK =0;
          nop();
          //nop();
          T_CLK =1;
          //nop();
          ucAddr>>=1;
     }
     //T_IO=1;
     for(i=0;i<8;i++)
     {
          ucDa=ucDa>>1;
          nop();
          T_CLK=1;
          nop();
          //nop();
          T_CLK=0;
          if(T_IO) ucDa|=0x80;
          else ucDa|=0x00;
          //ucDa=ucDa>>1;
     }
     T_RST =0;
     return(ucDa);
}
/********************************************************************
* 功能: 设置初始时间
********************************************************************/
void init_time()
{
     sendByte(0x80,0x09);
     sendByte(0x82,0x07);
     sendByte(0x84,0x08);
}
void data_control(void)
{
     //(init[0]&0x0f)); //读秒
     ucCurtime1[0]=sec/16;
     ucCurtime1[1]=sec%16;
     ucCurtime1[2]=min/16;
     ucCurtime1[3]=min%16;
     ucCurtime1[4]=hou/16;
     ucCurtime1[5]=hou%16;
}
/********************************************************************
* 功能: 读取DS1302当前时间
*********************************************************************/
void read_time(void)
{
    sec = readbyte(0x81);
    min = readbyte(0x83);
    hou = readbyte(0x85);
}
void init_ds1302(uchar dat)
{
   //T_RST=1;
   //sendByte(0x8e,0x00);
   //sendByte(0x90,0xa5);  //使能充电功能,一个二极管,2K电阻
   if(dat==1) sendByte(0x80,0x00);
   else sendByte(0x80,0x80);
   //sendByte(0x8e,0x80);
   //T_RST=0;
}

相关帖子

沙发
wangyy608| | 2009-9-28 12:10 | 只看该作者
初始化的时候好象没启动晶振
        data= read_clock(0x81);                           //读取秒数据       
        dtat=data&0X7f;
        write_clock(0x8e,0x00);                   //允许写操作
        write_clock(0x80,data);                          //启动时钟振荡器        write_clock(0x90,0xa5);                   //使能涓流充电 1个极管,2K电阻
        write_clock(0x8e,0x80);                   //禁止写操作

使用特权

评论回复
板凳
luotianzhi|  楼主 | 2009-9-28 16:25 | 只看该作者
这样也是不行的,

使用特权

评论回复
地板
new1988| | 2009-9-28 18:01 | 只看该作者
你是用数码管显示的吗??显示的是什么情况啊??

使用特权

评论回复
5
ningling_21| | 2009-9-28 19:02 | 只看该作者
时序不对,参考这个程序试试(已经调试OK的)

void DS1302InputByte(uchar Wdata)
{
        uchar i;
        ACC= Wdata;
        for(i=8;i>0;i--)
        {
                DS1302_IO = ACC0;        //相当于汇编中的 RRC
                DS1302_CLK =1;
                _nop_();
                DS1302_CLK = 0;
                ACC =ACC >> 1;                //写字节数据时在CLK由低到高跳变时写入数据
        }
}

uchar DS1302OutputByte(void)
{
        uchar i;
        for(i=8;i>0;i--)
        {
                ACC =ACC >> 1;                //相当于汇编中的 RRC       
                ACC7 = DS1302_IO;        //在CLK由高跳变为低时读取数据
                DS1302_CLK =1;
                _nop_();
                DS1302_CLK = 0;         
        }
        return(ACC);
}

void Write1302(uchar ucAddr, uchar ucDa)
{
       
        DS1302_RST = 0;
        DS1302_CLK = 0;
        DS1302_RST = 1;
        DS1302InputByte(ucAddr);        //地址,命令
        DS1302InputByte(ucDa);        //写1Byte数据
        DS1302_CLK = 1;
        DS1302_RST = 0;
}

使用特权

评论回复
6
wangyy608| | 2009-9-29 04:04 | 只看该作者
最好不用ACC,容易出状况

使用特权

评论回复
7
luotianzhi|  楼主 | 2009-9-29 09:28 | 只看该作者
我用的串口调试工具,我试过了晶振工作。

使用特权

评论回复
8
luotianzhi|  楼主 | 2009-9-29 14:55 | 只看该作者
晶振没工作

使用特权

评论回复
9
WANGJJ888| | 2009-9-29 16:36 | 只看该作者
OK

使用特权

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

本版积分规则

个人签名:舍我其谁

14

主题

51

帖子

0

粉丝