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:http://www.nixieclock.org
E-mail:yanzeyuan@163.com

5 comments to DIY一块DS3231的高精度时钟模块,让时钟DS3231/DS1302自动识别【严泽远作品】

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>