本帖最后由 一路向北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); //打开写保护功能
- }
- }
复制代码
好了,想要掉电保护的关键代码就是这些了,其他的读写程序就不一一展示了,如果想要就留言哦!
一周热门 更多>