打印
[程序源码]

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

[复制链接]
4043|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 一路向北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[n],TIME[n]);        
        }
        Ds1302Write(0x8E,0x80);                 //打开写保护功能        
}

主函数:

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


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

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

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


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

813225b7a5964d1c59.png (233.4 KB )

813225b7a5964d1c59.png
评论
ningling_21 2018-8-23 13:27 回复TA
赞一个 
不厉害 2018-8-21 11:43 回复TA
@一路向北lm :嗯嗯,代码确实不规范,这点我意识到了,非常感谢 
一路向北lm 2018-8-20 19:42 回复TA
我把代码给你整理了一下,好看多了 

相关帖子

沙发
一路向北lm| | 2018-8-20 19:41 | 只看该作者
发现问题解决问题,赞一个。

使用特权

评论回复
板凳
Aun| | 2019-1-8 14:10 | 只看该作者
能给具体一点的程序吗?不太清楚怎么写程序。

使用特权

评论回复
地板
磨磨| | 2019-12-9 16:33 | 只看该作者
楼主好,我现在修改了一点,其他的读写程序能不能发一下,1137498776@qq.com,谢谢!

使用特权

评论回复
5
羽羽羽羽| | 2020-1-7 10:46 | 只看该作者
老哥能发下全部吗我没法在代码里加入你的代码

使用特权

评论回复
6
不厉害|  楼主 | 2020-3-19 16:58 | 只看该作者
羽羽羽羽 发表于 2020-1-7 10:46
老哥能发下全部吗我没法在代码里加入你的代码

非常抱歉,年代久远,工程已经不在了,但是上面的已经可以基本使用了

使用特权

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

本版积分规则

12

主题

39

帖子

1

粉丝