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

2020-03-08 19:20发布

本帖最后由 一路向北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开始走嘛!(有点傻是不是!)
       后来越想越不对,掉电保护不是应该继续走吗?于是开始找问题了。网上一搜发现都是因为初始化的问题。
初始化程序:
  1. void Ds1302Init()
  2. {
  3.         uchar n;
  4.         Ds1302Write(0x8E,0X00);                 //禁止写保护,就是关闭写保护功能
  5.         for (n=0; n<8; n++)//写入7个字节的时钟信号:分秒时日月周年
  6.         {
  7.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);        
  8.         }
  9.         Ds1302Write(0x8E,0x80);                 //打开写保护功能        
  10. }
复制代码
主函数:

  1. void main()
  2. {        
  3.         Ds1302Init();
  4.         while(1)
  5.         {
  6.                 datapros();         //数据处理函数
  7.                 DigDisplay();//数码管显示函数               
  8.         }               
  9. }
复制代码

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

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

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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
一路向北lm
1楼-- · 2020-03-08 22:08
发现问题解决问题,赞一个。
Aun
2楼-- · 2020-03-09 01:23
能给具体一点的程序吗?不太清楚怎么写程序。
磨磨
3楼-- · 2020-03-09 02:18
楼主好,我现在修改了一点,其他的读写程序能不能发一下,1137498776@qq.com,谢谢!
羽羽羽羽
4楼-- · 2020-03-09 02:45
老哥能发下全部吗我没法在代码里加入你的代码

一周热门 更多>