【完美解决】ds1302外置时钟模块重复初始化时间问题(单片机掉电,模块电池供电)
芯片介绍:
DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
模块实物图:
淘宝购买的模块,物美价廉。
一、问题描述
DS1302时钟模块,通过单片机设置好时间后,由纽扣电池供电应当一直正常工作。但是单片机掉电再重新上电后,会导致模块重复初始化,使时间回到起点,与实际需求不符。单片机单纯上电直接初始化时间,有些不妥。
二、解决方法
方案一:
1.先烧录正常初始化时间的代码。
2.注释初始化时间的代码再次烧录。
点评:此方案可以解决问题,需要重复烧录两次,不够方便,故不作重点讨论。
方案二:
每次设置时间后,使用一个eeprom或者flash等掉电不丢失数据的记忆芯片,写入一个标记,表明已经初始化时间。系统重启只需读取是否这个标记,若有,则不需初始化。反之,则初始化时间。
点评:
此方案可以解决问题,需要额外芯片,有一定的局限性,故也不推荐。
仔细翻阅ds1302手册,发现它本身是支持31字节的ram。在方案二的思路上,使用这些ram做标记就很方便了。
地址C0到FC,读地址是写地址+1,储存数值00~ff之间的任意值、
写地址:c0 c2 c4 … fc
读地址:c1 c3 c5 … fd
如:在c0地址写入3a数值,读c1地址若为3a,则说明上次已经标记。
方案三:
在方案二思路上,使用内部ram空间做标记。单片机重启时,读取有无标记,若有,则不需初始化。反之,则初始化时间。
点评:推荐方案,方便快捷。缺点是代码稍复杂。
笔者使用stm32f1系列单片机亲测,切实可行。
关键代码:
ds1302头文件:
#define WRITE_FLAG_ADDR 0xc0
#define READ_FLAG_ADDR 0xc1
#define FLAG_VAL 0x3a
解释:
定义三个宏,分别是写地址,读地址,和标记数值。
注意:读地址为写地址+1。(数据手册有图)
ds1302头文件:
设置时间函数
void ds1032_set_time(u16 year,u8 mon,u8 day,u8 hour,u8 min,u8 sec)
{year -= 2000; //年默认2000开始if(year > 100) year = 0; // 10转为bdc码year = ((year /10) << 4) + year %10;mon = ((mon /10) << 4) + mon %10;day = ((day /10) << 4) + day %10;hour = ((hour /10) << 4) + hour %10;min = ((min /10) << 4) + min %10;sec = ((sec /10) << 4) + sec %10;// 写入寄存器,同时标记一个地址ds1302_wirte_rig(0x8e,0x00);//关闭写保护ds1302_wirte_rig(WRITE_FLAG_ADDR,FLAG_VAL);//写入已经设置时间标记ds1302_wirte_rig(0x80,sec);//seconds秒ds1302_wirte_rig(0x82,min);//minutes分ds1302_wirte_rig(0x84,hour);//hours时ds1302_wirte_rig(0x86,day);//date日ds1302_wirte_rig(0x88,mon);//months月ds1302_wirte_rig(0x8c,(u8) year);//year年// ds1302_wirte_rig(0x8a,7);// 星期日ds1302_wirte_rig(0x8e,0x80);//开启写保护
}
初始化时间函数:
void ds1032_init_time(void)
{if(ds1302_read_rig(READ_FLAG_ADDR)!= FLAG_VAL) // 如果未标记,执行初始化时间{ds1032_set_time(2020,12,31,23,59,30);// 2020年12月31日,23:59:30printf("Y时间初始化完成,标记:%x\r\n",ds1302_read_rig(READ_FLAG_ADDR));}else{printf("N时间不用重复初始化,标记:%x\r\n",ds1302_read_rig(READ_FLAG_ADDR));}}
解释:
先判断有无标记,有则执行ds1032_set_time,否则不执行。
main源文件:
使用示例
实物效果图:
【完美解决】ds1302外置时钟模块重复初始化时间问题(单片机掉电,模块电池供电)相关推荐
- arduino笔记32:nRF24l01模块使用 电磁波频率 距离限制 掉电模式 热待机模式
最近再arduino中文社区看到了一篇介绍nrf24l01基本原理的帖子,内容感觉蛮不错的,学习一下,记录一下学习笔记. 大部分内容都是Arduino中文社区的帖子,附上自己的一点点体会. 目录 一. ...
- 关于STM32驱动DS1302实时时钟的一点思考
关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...
- 完美解决Xmind打开乱码的问题
完美解决Xmind打开乱码的问题 前段时间重装系统,重新安装XMind软件,今天打开以前的文件,傻眼了,乱码了,如图所示~ 重新编辑,发现是有内容的,如图 以下是提供一种解决方法给大家供参考 判断应该 ...
- 传感器自学笔记第十二章——火焰传感器+HC-SR501人体感应模块+按键模块+红绿双色LED(共阴)模块+按键开关模块+三色LED
作者:GWD 时间:2019.06.28 火焰传感器(开关量类传感器) 一. 学习要点:无 二. 手册分析: 用途:各种火焰,火源探测 模块特色: 1. 可以检测火焰或者波长在760纳米-1100纳米 ...
- c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc
-- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...
- stm32f407网页服务器,STM32F407单片机通过USR-LTE-7S4模块和服务器进行4G通信
STM32F407单片机通过USR-LTE-7S4模块和服务器进行4G通信 STM32F407单片机通过USR-LTE-7S4模块和服务器进行4G通信 最近工程项目需要单片机通过USR-LTE-7S4 ...
- 基于8266WIFI模块实现智能手机与51单片机的通信入门
1 芯片及电路的介绍 1.1 8266WIFI模块 在文章的最开始我们首先要介绍今天的主角,8266WIFI模块.这是一个非常好用的模块,其他的废话不在多说,我们直接上干货. 这是一张我从百度上盗 ...
- 单片机c语言编程 时钟加日历转换,基于52单片机电子时钟日历系统的设计
该系统是以52单片机为基础,以时钟日历芯片DSl2887为核心构建的时钟系统.完成的功能如下:显示年.月.日.星期.小时.分钟.秒钟,具有1OO年的日历,具有掉电不丢失性,能够通过按键调整时间.DS1 ...
- 天问51单片机结合WIFI模块上传温度数据到TCP服务器
目 录 一.前言 二.项目准备 三.设计思路 四.项目主要代码 五.项目成果 一.前言: 天问51系统单片机作为增强型51单片机,它比传统的51单片机性能提升很多,而公司开发的天问BLOCK软件编程也 ...
- 树莓派基础实验32:DS1302实时时钟模块实验
一.介绍 现在有很多流行的串行时钟芯片,如DS1302,DS1307,PCF8485等,由于简单的接口,低成本和易用性,他们被广泛应用于电话.传真.便携式仪器等产品领域.在本实验中,我们将使用DS ...
最新文章
- 【UGV】32版UGV原理图
- spark | scala | 线性代数库Breeze学习
- RxJS之BehaviorSubject
- ExtJS4.2学习(10)分组表格控件--GroupingGrid(转)
- 使用代理时服务变量的变化
- bool python 运算_python中的布尔操作
- 微课|中学生可以这样学Python(2.2.1节):算术运算符
- 初学WEB前端的建议,你不看给别人可惜了!
- Smart3D系列教程
- Java 弱密码校验判断处理
- 基于STM32制作万能遥控器---1
- 2017/7/11 新开博客
- 化学老师为什么铤而走险当色情站长?
- 如何确定scrum的story之一:识别利益相关者和目标
- itss认证是什么意思
- python脚本厉害吗?使用selenium实现前程无忧简历自动刷排名!
- 网络安全等级保护备案申请指南(杭州)
- pytorch和tensorflow中实现SMU激活函数
- 全球与中国贵金属电子废料回收市场动态调研与未来需求趋势预测报告2021年版
- 算法从入门到入土(一)