打印

读的ds1302的数据有个奇怪的现象 高手来解释一下!!

[复制链接]
2107|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jinyitong|  楼主 | 2011-7-9 19:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我读的ds1302的数据有个奇怪的现象

秒  对
分  错
时  对
日  错
月  对
周  错
年  对
下一次读时
秒 错
分 对
时 错
日 对
月 错
周 对
年 错
下一次读取
又反过来

源程序如下:
void Read_1302_Time()
{
    uchar i;
    uchar idata ucCurtime[7];
   uchar idata uc[7];
    uchar ucAddr = 0x81;
   
    for (i=0; i<7; i++)
    {
        ucCurtime = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
   
       uc   = R1302(ucAddr);//这里加了一句测试用的语句
      
       ucAddr += 2;
    }
    Time_1302.u8_Second  = BcdToHex(ucCurtime[0]);
    Time_1302.u8_Minute  = BcdToHex(ucCurtime[1]);
    Time_1302.u8_Hour    = BcdToHex(ucCurtime[2]);
    Date_1302.u8_day    = BcdToHex(ucCurtime[3]);
    Date_1302.u8_month   = BcdToHex(ucCurtime[4]);
    Date_1302.u8_week    = BcdToHex(ucCurtime[5]);
    Date_1302.u8_year    = BcdToHex(ucCurtime[6]);
}

在第10行的地方,加了一句uc   = R1302(ucAddr);(uc是没用的数组)
后,可以实现,读出准确数据。

但是,系统初始化时,有时会出错,正好反过来了,
也就是uc   = R1302(ucAddr);(uc里全是有用的数据,ucCurtime里成乱码了)


为什么?
纠结了两天了,急需解决啊。

相关帖子

沙发
chunyang| | 2011-7-9 19:04 | 只看该作者
时序不对,建议先仔细看看器件手册。

使用特权

评论回复
板凳
jinyitong|  楼主 | 2011-7-9 19:15 | 只看该作者
设定时间的数据是正确的。
只有读取是错的。

使用特权

评论回复
地板
jinyitong|  楼主 | 2011-7-9 21:30 | 只看该作者
时序对照了好久了,应该没问题的
春阳之外的其他高人呢?
有遇到同样情况的吗?

使用特权

评论回复
5
jinyitong|  楼主 | 2011-7-9 22:26 | 只看该作者
uchar RTOutputByte(void) //读出1字节
{
    uchar i;
    //T_IO = 1;
    for(i = 0; i < 8; i++)
    {       
                T_CLK = 0;
        AACC7 = T_IO;
                AACC = AACC >>1;         /*相当于汇编中的 RRC */
         T_CLK = 1;         
    }
    return(AACC);
}


void RTInputByte(uchar d) //发送一字节
{
    uchar i;
    AACC = d;
    for(i = 0; i < 8; i++)
    {
        T_CLK = 0;
        T_IO = AACC0;           /*相当于汇编中的 RRC */
        
        AACC = AACC >> 1;
                 T_CLK = 1;
    }

    T_IO = 1;
}

uchar R1302(uchar ucAddr)//读一字节,先发地址,再收数据
{
    uchar ucData;
    T_RST = 0;
    T_CLK = 0;
   
    T_RST = 1;
   
    RTInputByte(ucAddr);             /* 地址,命令 */
   
    ucData = RTOutputByte();         /* 读1Byte数据 */
    T_RST = 0;
    T_CLK = 1;
    return(ucData);
}

void Read_1302_Time() //读一组数据,秒------年。
{
    uchar i;
    uchar idata ucCurtime[7];
        //uchar idata uc[7];
    uchar ucAddr = 0x81;
   
    for (i=0; i<7; i++)
    {
        ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
        //uc[i]                 = R1302(ucAddr);
                ucAddr += 2;
    }

    Time_1302.u8_Second  = BcdToHex(ucCurtime[0]);
    Time_1302.u8_Minute  = BcdToHex(ucCurtime[1]);
    Time_1302.u8_Hour    = BcdToHex(ucCurtime[2]);
    Date_1302.u8_day    = BcdToHex(ucCurtime[3]);
    Date_1302.u8_month   = BcdToHex(ucCurtime[4]);
    Date_1302.u8_week    = BcdToHex(ucCurtime[5]);
    Date_1302.u8_year    = BcdToHex(ucCurtime[6]);

}


Uchar BcdToHex(Uchar u8_Par)//译码
{
    Uchar u8_Temp;
    u8_Temp = 0;
    u8_Temp += (u8_Par & 0xf);
    u8_Temp += ((u8_Par & 0xf0) >> 4)*10;
    return u8_Temp;
}

使用特权

评论回复
6
jinyitong|  楼主 | 2011-7-9 22:27 | 只看该作者
这是读取数据的全部程序,谁帮忙看看,错在哪里了
刚换过DS1302,没解决

使用特权

评论回复
7
jinming123| | 2011-7-10 15:29 | 只看该作者

使用特权

评论回复
8
xuyaqi| | 2011-7-10 15:47 | 只看该作者
你是否在用仿真器?

使用特权

评论回复
9
linqing171| | 2011-7-10 17:24 | 只看该作者
隔一个对一个,莫非复位时间不够?
你的时钟周期是多少?

使用特权

评论回复
10
linqing171| | 2011-7-10 17:40 | 只看该作者
时钟不用的时候,设置为低电平。
也就是r1302的最后三句的地方修改为:
T_CLK = 0;
T_RST = 0;

读的代码里面的循环里面
T_CLK = 0;
写两遍看看。
是不是数据的建立时间不足?

使用特权

评论回复
11
jinyitong|  楼主 | 2011-7-18 21:14 | 只看该作者
最新进展,只用电池供电时,问题没了!
1脚加上电源5V,问题依旧。
还有人说要VCC1上加个1K左右的电阻,也试了,不行。
电源引脚上加了100UF电容和104电容退偶滤波,也不行。
只用电池供电就没问题了!?
为什么

使用特权

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

本版积分规则

16

主题

87

帖子

0

粉丝