不厉害 发表于 2018-8-20 14:11

关于DS1302重启去掉初始化掉电保护的问题

本帖最后由 一路向北lm 于 2018-8-20 19:41 编辑

      最近老是遇到问题就百度,一次偶然的机会竟然直接百度就推荐给了我自己发的帖子,顿时成就感满满。因此更加想把自己解决到的问题分享给大家,百度的时候看到那些回答我自己都蒙,废话少说,直入正题。      DS1302时钟芯片是带掉电保护功能的。
      而且两个电源使用关系是:双供电配置中的主电源供应管脚,VCC1 连接到备用电源,在主电源失效时保持时间和日数据.DS1302 工作于 VCC1 和 V CC2 中较大者.当 VCC2 比 V CC1 高 0.2V 时VCC2 给 DS1302 供电.当 VCC1 比 V CC2 高时, V CC1 给 DS1302 供电.
      嗯,确实掉电保护了,没毛病!反正怎么它都有电源供电。
      但是,我自己在弄DS102芯片时,重新上电后的值总是最开始初始值,我设定初始12:00开始走,结果每次重新上电后都是12:00开始走,最开始以为这就是掉电保护,你看!他每次都保护到12:00开始走嘛!(有点傻是不是!)
       后来越想越不对,掉电保护不是应该继续走吗?于是开始找问题了。网上一搜发现都是因为初始化的问题。
初始化程序:
void Ds1302Init()
{
      uchar n;
      Ds1302Write(0x8E,0X00);               //禁止写保护,就是关闭写保护功能
      for (n=0; n<8; n++)//写入7个字节的时钟信号:分秒时日月周年
      {
                Ds1302Write(WRITE_RTC_ADDR,TIME);      
      }
      Ds1302Write(0x8E,0x80);               //打开写保护功能      
}
主函数:

void main()
{      
      Ds1302Init();
      while(1)
      {
                datapros();         //数据处理函数
                DigDisplay();//数码管显示函数               
      }               
}

如果是这样。那么每次上电程序都会初始化一遍,所以相当于是你上电的时候把DS1302的时间初始化了。我们想要的是只有第一次开启的时候才初始化,在以后的上电过程中就不用初始化了,直接读取时间就可以了。但是这要怎么做呢?
      我想到了DS1302内部的自带寄存器,给寄存器一个值,初始化后就改变这个值如果值改变了,说明历史上已经初始化了,就不在初始化了。具体做法如下:
1.DS1302手册上找到内部地址分布,如图:

2.根据地址定义读写地址:
uchar code READ_RAM_ADDR = {0xc1};
uchar code READ_WRITE_ADDR ={0xc0};

像这样。
3.在初始化函数里面设置条件:
void Ds1302Init()
{
      uchar n;
      TIME=Ds1302Read(READ_RAM_ADDR);//先读TIME地址的值
      if(TIME==0xFF)       //检验该地址的值是否被更改
      {      
                ;//如果已经被更该就不用初始化了,说明曾经初始化了
      }
      else   //如果没有更该就初始化
      {
                Ds1302Write(0x8E,0X00);               //禁止写保护,就是关闭写保护功能
                Ds1302Write(READ_WRITE_ADDR,TIME);//第一次初始化才会到达这里
                for (n=0; n<8; n++)//写入7个字节的时钟信号:分秒时日月周年
                {
                        Ds1302Write(WRITE_RTC_ADDR,TIME);      
                }
                Ds1302Write(0x8E,0x80);               //打开写保护功能
      }
}

好了,想要掉电保护的关键代码就是这些了,其他的读写程序就不一一展示了,如果想要就留言哦!

一路向北lm 发表于 2018-8-20 19:41

发现问题解决问题,赞一个。

Aun 发表于 2019-1-8 14:10

能给具体一点的程序吗?不太清楚怎么写程序。

磨磨 发表于 2019-12-9 16:33

楼主好,我现在修改了一点,其他的读写程序能不能发一下,1137498776@qq.com,谢谢!

羽羽羽羽 发表于 2020-1-7 10:46

老哥能发下全部吗我没法在代码里加入你的代码

不厉害 发表于 2020-3-19 16:58

羽羽羽羽 发表于 2020-1-7 10:46
老哥能发下全部吗我没法在代码里加入你的代码

非常抱歉,年代久远,工程已经不在了,但是上面的已经可以基本使用了
页: [1]
查看完整版本: 关于DS1302重启去掉初始化掉电保护的问题