调试DS1302时遇到的问题

2020-02-02 09:28发布

这几天用DS1302,程序出来之后很不理想
先贴贴程序:
void WriteByte(uchar dat)
{
        uchar i;
        ACC=dat;
        for(i=8;i>0;i--)
        {
                Dat_1302=ACC0;
                CLK_1302=1;       
                _nop_();_nop_();_nop_();
                CLK_1302=0;        //产生上升沿输入数据
                ACC=ACC>>1;
        }       
}

void WriteSet1302(uchar Cmd,uchar dat)
{
        RST_1302=0;
        CLK_1302=0; //确保写数居前SCLK被拉低
        RST_1302=1; //启动数据传输
        WriteByte(Cmd);
        WriteByte(dat);
        RST_1302=0;
        CLK_1302=1;       
}

uchar ReadByte(void)
{
        uchar i;
        for(i=8;i>0;i--)
        {
                ACC7=Dat_1302;//ds1302读数据的时候,第一个数据读取在发一个Byte命令后,在第八位的下降沿
                ACC=ACC>>1;
                CLK_1302=1;
                CLK_1302=0;//产生下降沿输出一位数据
                _nop_();_nop_();_nop_();
        }
        return(ACC);
}

uchar ReadSet1302(uchar Cmd)
{
        uchar dat;
        RST_1302=0;
        CLK_1302=0; //确保写数居前SCLK被拉低
        RST_1302=1; //启动数据传输
        WriteByte(Cmd);
        dat=ReadByte();
        RST_1302=0;
        CLK_1302=1;
        return dat; //将读出的数据返回
}

void Init1302(void)
{
        WriteSet1302(0x8e,0x00);
        WriteSet1302(0x80,0x05);//初始化时分秒
        WriteSet1302(0x82,0x10);
        WriteSet1302(0x84,0x15);
        WriteSet1302(0x90,0xab);
        WriteSet1302(0x8e,0x80);
}
程序遇到的问题是读取时间时老是出错,有时候是秒的数据错了,有时候是分的数据,有时候是时间的数据
而且写进去时间后读出来的数据也有错
不知道是哪里的问题
在网上看了很多这方面的程序,感觉都没有错
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
ypradio
1楼-- · 2020-02-02 12:04
不一定是软件问题,叫你的硬件工程师测试下信号,说不定硬件的问题。
出了问题,软硬件一定要一起处理,千万不要踢皮球!!
tianzhiying
2楼-- · 2020-02-02 14:13
ypradio 发表于 2012-3-28 17:55
不一定是软件问题,叫你的硬件工程师测试下信号,说不定硬件的问题。
出了问题,软硬件一定要一起处理,千 ...

我想应该不是硬件的问题
因为这块板曾经有人写过程序
是可以的
而且运行很稳定
只不过那个人没有给我源代码就走了
所以我从头开始
今天弄了一整个下午
改了好多次都是数据读错
换了一块板也是一样
xue2003265029
3楼-- · 2020-02-02 19:34
void WriteByte(uchar SendByte)
{
      unsigned char i;
      for(i=0; i<8; i++)
     {
              SCLK=0;
              Dat_1302=SendByte&0x01; //LSB first
              SendByte>>=1;
              SCLK=1;
             _nop_();
    }
    Dat_1302=1;

}

uchar ReadByte(void)
{
        unsigned char i,RecvByte=0;
         Dat_1302=1;     //将IO口置为输入状态
     for(i=0; i<8; i++)
         {
        SCLK=0;
        RecvByte>>=1;
        if( Dat_1302)
        RecvByte|=0x80;
        SCLK=1;
        _nop_();
         }
          return RecvByte;
}

Orpheus
4楼-- · 2020-02-02 19:37
没记错的话,DS1302的数据读出来的是BCD码
anvy178
5楼-- · 2020-02-02 22:02
 精彩回答 2  元偷偷看……
YZDREAM8
6楼-- · 2020-02-02 22:45
这东东网上参考程序一大把,你参考一下再自己走一遍就OK了,或者codevison里有现成的函数。这东东那些高手不屑一顾,只能自己吃点辛苦了。我前不久第一次用这个IC,仔细看下datasheet基本就OK了。

一周热门 更多>