DIY一块DS3231的高精度时钟模块,让时钟DS3231/DS1302自动识别【严泽远作品】
水晶城堡在设计之初,采用全直插设计理念,保证玩家在自行DIY的过程中,不会因为焊接贴片元器件而烦恼。所以水晶城堡电路板上使用的所有原器件都是直插封装,所有IC都是DIP封装。
其中RTC模块采用的是达拉斯DS1302,配合5PPM的石英晶体。
虽然水晶城堡的走时精度已经能满足一般需要,但对于追求高精度的用户来讲,DS3231SN才是最佳选择。
DS3231SN最大的特点是:
1. 内部集成温度补偿晶体(TCXO);
2. 采用高速(400KHz)IIC通讯总线;
3. 工业级标准,工作温度-40℃至85摄氏度;
并且在0℃至+40℃的温度范围内,能够提供最大1分钟每年的计时精度。
所以DIY了一块使用了DS3231SN作为主要器件的高精度RTC模块。
其实在我的其他时钟上,用得都是DS3231SN这颗RTC芯片(比如我的QS18-12辉光钟,YS13-3荧光钟,LED点阵动画时钟等等),经过大量实践证明,温补晶振的准却度确实高。
虽然官方数据是±1分钟每年,但是实际我感觉在室内温度变化不大的情况下,能够做到20秒/年。
模块上集成了3.3V LDO模块,为DS3231提供工作电压。并且集成了稳压和上拉电阻。
该模块专门为IV-11荧光管电子钟【水晶城堡】设计,直接将DS1302摘下,将该模块装入即可。
装入后,MCU会自动识别当前的RTC模块是DS1302还是DS3231,并采用不同方式进行通讯并正确运行。
当然,这需要程序上做好相应的检测功能及相应的功能函数。
SHOW一下该模块的实物图片以及安装到水晶城堡电路板上以后的效果:
其实在自动识别方面,做起来也不难,需要在开机的时候检测一下是DS1302还是DS3231芯片。
大致思路是这样:
1、需要一个全局变量,用于开机时存储检测结果,以便以后的操作识别是DS3231还是DS1302;
2、硬件上DS1302需要3跟I/O口,DS3231只需要两根;
3、开机瞬间,首先默认为DS1302,因为DS1302内部有RAM,所以可以选择2-3个字节进行写操作。写完以后立即读取内容,如果内容与写入的内容一致,则表示当前安装的是DS1302,否则即认为是DS3231。
经过反复测试,这个检测方法很好用。
其次是程序读写这两种芯片:
对于主函数来讲,对于获取时间和日期以及设定时间和日期,统统交给同一个函数来处理,在这个函数里面,再分别针对不同的芯片进行相应操作。
下面我贴出来我的获取时间日期和设定时间日期的函数。
鸡鸣狗盗而已,欢迎拍砖!
/********************************************************************************************************
** 函数名称: void SaveTime()
** 功能描述: 保存当前时间
** 创 建 者: 严泽远
** 创建时间: 2011-07-24 11:48
DS1302 秒 分 时 日 月 星期 年
DS1302 init[] = {0x00, 0x00, 0x20, 0x01, 0x01, 0x05, 0x10};
********************************************************************************************************/
void SaveTime()
{
uchar temp[7];
if(CHIP==DS1302)
{
temp[6] = S_YEAR; //年
temp[5] = 1; //星期
temp[4] = S_MONTH; //月
temp[3] = S_DAY; //日
temp[2] = S_HOUR; //时
temp[1] = S_MINUTE; //分
temp[0] = S_SECOND; //秒
DS1302_SetTime(temp);
}
else if(CHIP==DS3231)
{
ModifyTime(S_HOUR,S_MINUTE,S_SECOND);
}
}
/********************************************************************************************************
** 函数名称: void GetDateTime()
** 功能描述: 获取当前日期和时间
** 创 建 者: 严泽远
** 创建时间: 2011-02-05 15:45
** 版 本: v1.0.0
DS1302 秒 分 时 日 月 星期 年
DS1302 init[] = {0x00, 0x00, 0x20, 0x01, 0x01, 0x05, 0x10};
********************************************************************************************************/
void GetDateTime()
{
uchar temp[7];
uchar Tmp;
if(CHIP==DS1302)
{
DS1302_GetTime(temp);
YEAR = temp[6]; //年
MONTH = temp[4]; //月
DAY = temp[3]; //日
HOUR = temp[2]; //时
MINUTE = temp[1]; //分
SECOND = temp[0]; //秒
WEEK = GetWeek(YEAR,MONTH,DAY);
}
else if(CHIP==DS3231)
{
Tmp=read_random(DS3231_YEAR); YEAR = BCD2HEX(Tmp); //年
Tmp=read_random(DS3231_MONTH); MONTH = BCD2HEX(Tmp); //月
Tmp=read_random(DS3231_DAY); DAY = BCD2HEX(Tmp); //日
Tmp=read_random(DS3231_HOUR); Tmp&=0x3f; HOUR = BCD2HEX(Tmp); //时
Tmp=read_random(DS3231_MINUTE); MINUTE = BCD2HEX(Tmp); //分
Tmp=read_random(DS3231_SECOND); SECOND = BCD2HEX(Tmp); //秒
WEEK = GetWeek(YEAR,MONTH,DAY);
}
}
DIY是一种享受,享受的是过程,更是结果……
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
软硬件设计:严泽远
QQ:6626209
Mobile:18602007878
WebSite:https://www.omnixie.cn/wordpress
E-mail:yanzeyuan@163.com
5 条评论
有事烧纸 · 2012 年 5 月 1 日 下午 7:32
😛 智能判断的思路真妙
steve cole · 2012 年 12 月 28 日 下午 12:33
Hello Yan…
Is the DIY DS3231 module available for purchase? I am presently building the Crystal Castle clock and would like to include the high-precision module in this unit. Many thanks…
Steve
♂唯有→奋斗 · 2012 年 12 月 28 日 下午 3:14
Hi Steve,
Yes I sell the High accuracy RTC module, only 11USD, shipping will cost 8USD.
If you need, please send the payment to my paypal account 6626209@qq.com.
Don’t solder the DS1302 chip if you will assemble my high-accuracy RTC module.
Thanks.
Yan.
Jack · 2014 年 4 月 14 日 上午 10:02
博主有没有考虑过电波对时?
♂唯有→奋斗 · 2014 年 4 月 14 日 下午 9:26
电波对时考虑过,不过做过几次试验,在广州这个地方,除非用电池供电,而且在夜里,原理电脑电视机等设备的时候,才能接收到信号,如果用USB供电,而且本身LED点阵的动态扫描就是个强干扰源,很难收到信号,所以就放弃了一直没用起来!