DS3231高精度时钟模块程序

合集下载

ds3231程序

ds3231程序

接线说明,以Arduinouno r3为例:SCL→A5SDA→A4VCC→5VGND→GND代码部分:#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit SDA=P3^6; //模拟I2C数据传送位SDA**************sbit SCL=P3^7; //模拟I2C时钟控制位SCL**************sbit INT=P3^2;sbit RESET=P3^3;//**************sbit led0=P1^0;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit led4=P1^4;sbit led5=P1^5;sbit led6=P1^6;sbit led7=P1^7;//**************bit ack; //应答标志位#define DS3231_WriteAddress 0xD0 //器件写地址************** #define DS3231_ReadAddress 0xD1 //器件读地址************** #define DS3231_SECOND 0x00 //秒#define DS3231_MINUTE 0x01 //分#define DS3231_HOUR 0x02 //时#define DS3231_WEEK 0x03 //星期#define DS3231_DAY 0x04 //日#define DS3231_MONTH 0x05 //月#define DS3231_YEAR 0x06 //年//闹铃1#define DS3231_SALARM1ECOND 0x07 //秒#define DS3231_ALARM1MINUTE 0x08 //分#define DS3231_ALARM1HOUR 0x09 //时#define DS3231_ALARM1WEEK 0x0A //星期/日//闹铃2#define DS3231_ALARM2MINUTE 0x0b //分#define DS3231_ALARM2HOUR 0x0c //时#define DS3231_ALARM2WEEK 0x0d //星期/日#define DS3231_CONTROL 0x0e //控制寄存器#define DS3231_STATUS 0x0f //状态寄存器#define BSY 2 //忙#define OSF 7 //振荡器停止标志#define DS3231_XTAL 0x10 //晶体老化寄存器#define DS3231_TEMPERATUREH 0x11 //温度寄存器高字节(8位)#define DS3231_TEMPERATUREL 0x12 //温度寄存器低字节(高2位)//**************uchar code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0,1,2,30x99,0x92,0x82,0xf8,0x80,0x90, 0xff}; //4,5,6,7,8,9,offuchar data dis_buf[8];uchar data dis_index;uchar data dis_digit;//**************uchar BCD2HEX(ucharval) //BCD转换为Byte{uchar temp;temp=val&0x0f;val>>=4;val&=0x0f;val*=10;temp+=val;return temp;}uchar HEX2BCD(ucharval) //B码转换为BCD码{uchari,j,k;i=val/10;j=val-i*10;**************k=j+(i<<4);return k;}void delayus(uint us) 注:单片机型号不同{while (us--);}void Start_I2C(){SDA=1; //发送起始条件的数据信号delayus(1);SCL=1;delayus(5); //起始条件建立时间大于4.7us,延时SDA=0; //发送起始信号delayus(5); // 起始条件锁定时间大于4μsSCL=0; //钳住I2C总线,准备发送或接收数据delayus(2);}void Stop_I2C(){SDA=0; //发送结束条件的数据信号delayus(1); //发送结束条件的时钟信号SCL=1; //结束条件建立时间大于4usdelayus(5);SDA=1; //发送I2C总线结束信号delayus(4);}void SendByte(uchar c){ucharBitCnt;for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位 {if((c<<BitCnt)&0x80)SDA=1;//判断发送位elseSDA=0;delayus(1);SCL=1;//置时钟线为高,通知被控器开始接收数据位delayus(5); //保证时钟高电平周期大于4μsSCL=0;}SDA=1;//8位发送完后释放数据线,准备接收应答位delayus(2);SCL=1;delayus(3);if(SDA==1)ack=0;elseack=1;//判断是否接收到应答信号SCL=0;delayus(2);}ucharRcvByte(){ucharretc;ucharBitCnt;retc=0;SDA=1; //置数据线为输入方式for(BitCnt=0;BitCnt<8;BitCnt++){delayus(1);SCL=0; //置时钟线为低,准备接收数据位delayus(5); //时钟低电平周期大于4.7μsSCL=1; //置时钟线为高使数据线上数据有效delayus(3);retc=retc<<1;if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中delayus(2);}SCL=0;delayus(2);}void Ack_I2C(bit a){if(a==0)SDA=0; //在此发出应答或非应答信号 elseSDA=1;delayus(3);SCL=1;delayus(5); //时钟低电平周期大于4μsSCL=0; //清时钟线,钳住I2C总线以便继续接收delayus(2);}ucharwrite_byte(ucharaddr, ucharwrite_data){Start_I2C();SendByte(DS3231_WriteAddress);if (ack == 0)return 0;SendByte(addr);if (ack == 0)return 0;SendByte(write_data);if (ack == 0)return 0;Stop_I2C();delayus(10);return 1;}ucharread_current(){ucharread_data;Start_I2C();SendByte(DS3231_ReadAddress);if(ack==0)return(0);read_data = RcvByte();Ack_I2C(1);Stop_I2C();return read_data;}ucharread_random(ucharrandom_addr){Start_I2C();SendByte(DS3231_WriteAddress);if(ack==0)return(0);SendByte(random_addr);if(ack==0)return(0);return(read_current());}void ModifyTime(ucharyea,ucharmon,ucharda,ucharhou,ucharmin,uchar sec) {uchar temp=0;temp=HEX2BCD(yea);write_byte(DS3231_YEAR,temp); //修改年temp=HEX2BCD(mon);write_byte(DS3231_MONTH,temp); //修改月temp=HEX2BCD(da);write_byte(DS3231_DAY,temp); //修改日temp=HEX2BCD(hou);write_byte(DS3231_HOUR,temp); //修改时temp=HEX2BCD(min);write_byte(DS3231_MINUTE,temp); //修改分temp=HEX2BCD(sec);write_byte(DS3231_SECOND,temp); //修改秒}void TimeDisplay(ucharDhour,ucharDmin,ucharDsec)**************{dis_buf[7]=dis_code[Dhour / 10]; // 时十位dis_buf[6]=dis_code[Dhour % 10]; // 时个位dis_buf[4]=dis_code[Dmin / 10]; // 分十位dis_buf[3]=dis_code[Dmin % 10]; // 分个位dis_buf[1]=dis_code[Dsec / 10]; // 秒十位dis_buf[0]=dis_code[Dsec % 10]; // 秒个位dis_buf[2]=0xbf; // 显示"-"dis_buf[5]=0xbf;}void DateDisplay(ucharDyear,ucharDmonth,ucharDday)**************{dis_buf[7]=dis_code[Dyear / 10]; // 年十位dis_buf[6]=dis_code[Dyear % 10]; // 年个位dis_buf[4]=dis_code[Dmonth / 10]; // 月十位dis_buf[3]=dis_code[Dmonth % 10]; // 月个位dis_buf[1]=dis_code[Dday / 10]; // 天十位dis_buf[0]=dis_code[Dday % 10]; // 天个位dis_buf[2]=0xbf; // 显示"-"dis_buf[5]=0xbf;}void get_show_time(void){uchar Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;Htemp1=read_random(DS3231_HOUR); //时 24小时制Htemp1&=0x3f;Htemp2=BCD2HEX(Htemp1);Mtemp1=read_random(DS3231_MINUTE); //分Mtemp2=BCD2HEX(Mtemp1);Stemp1=read_random(DS3231_SECOND); //秒Stemp2=BCD2HEX(Stemp1);TimeDisplay(Htemp2,Mtemp2,Stemp2);}void get_show_date(void){uchar Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;Ytemp1=read_random(DS3231_YEAR); //年Ytemp2=BCD2HEX(Ytemp1);Mtemp1=read_random(DS3231_MONTH); //月Mtemp2=BCD2HEX(Mtemp1);Dtemp1=read_random(DS3231_DAY); //日Dtemp2=BCD2HEX(Dtemp1);DateDisplay(Ytemp2,Mtemp2,Dtemp2);}void get_show_Temperature(void){uchar Ttemp1,Ttemp2,Ttemp3,Ttemp4;Ttemp1=read_random(DS3231_TEMPERATUREH); //温度高字节 Ttemp2=BCD2HEX(Ttemp1);Ttemp3=read_random(DS3231_TEMPERATUREL); //温度低字节Ttemp4=BCD2HEX(Ttemp3);DateDisplay(0,Ttemp2,Ttemp4);}void timer0() interrupt 1{TL0=0x17;P2=0xff; // 先关闭所有数码管P0=dis_buf[dis_index]; // 显示代码传送到P0口P2=dis_digit;if (dis_digit& 0x80)dis_digit=(dis_digit<< 1) | 0x1;elsedis_digit=(dis_digit<< 1);dis_index++;dis_index&=0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描}void main(){uint ii = 0;RESET=0x1; //DS3231复位操作,正常操作下不需要每次都复位delayus(5000);led0=0;led1=0;led2=0;led3=0;led4=0;P0=0xff;P2=0xff;dis_digit=0xfe;dis_index=0;TimeDisplay(12, 5, 18);TMOD=0x11; // 定时器0, 1工作模式1, 16位定时方式TH0=0xFC;TCON=0x01;IE=0x82; // 使能timer0,1 中断TR0=1;if (write_byte(DS3231_CONTROL, 0x1C) == 0)led0=1;if (write_byte(DS3231_STATUS, 0x00) == 0)led1=1;ModifyTime(10,6,13,15,30,00); //初始化时钟,2010/6/13,15/30/00//小时采用24小时制while(1){//get_show_date(); //显示日期//get_show_Temperature(); //显示温度get_show_time(); //显示时间delayus(50000);}}。

使用STM32和DS3231 RTC:设置并获取时间和日期

使用STM32和DS3231 RTC:设置并获取时间和日期

使用STM32和DS3231 RTC:设置并获取时间和日期——笔记在本文中,将使用STM32开发一个驱动程序,用于在DS3231中设置和获取时间存储。

在本文中,将介绍以下内容:DS3231模块。

与STM32F411核-64的连接。

源文件。

产品图片DS3231模块DS3231是一款低成本、极其精确的I 2 C实时时钟(RTC),集成温度补偿晶体振荡器(TCXO)和晶体。

该器件集成了电池输入,并在器件的主电源中断时保持精确的计时。

晶体谐振器的集成提高了设备的长期精度,并减少了生产线中的零件数量。

RTC 维护秒、分钟、小时、星期、日期、月份和年份信息。

对于少于31 天的月份,月底的日期会自动调整,包括闰年的更正。

时钟以24 小时制或12 小时制运行,带有AM/PM 指示器。

提供两个可编程时间闹钟和一个可编程方波输出。

地址和数据通过I 2 C双向总线串行传输。

该模块可在3.3 或5 V 电压下工作,适用于许多开发平台或微控制器。

电池输入为3V,典型的CR2032 3V电池可以为模块供电并保持信息超过一年。

与STM32F411核-64的连接:在开始开发驱动器之前,需要I2C多读和多写才能使DS3231工作。

我们首先创建名称为ds3231.h 的新头文件。

在头文件中,我们将声明一个结构如下:该结构将包含以下内容:秒。

分。

小时。

月中的某天。

月。

年。

计算所需的其他数据。

此外,声明以下三个函数:首先是设置时间和数据,并以结构为参数。

第二个是从DS3231读取时间,并获取指向结构的指针。

第三个功能将打印时间。

因此,整个头文件如下所示:创建一个名称为ds3231.c 的新源代码。

在此声明以下宏:此外,还有两个功能:第一个将 dec 转换为 BCD 的方法:第二个是将 BCD 转换为 dec :为了设置时间和日期:由于我们已经超过了2000 年,因此我们将世纪位设置为1:并从给定年份中减去2000。

然后将变量转换为BCD,并将变量发送到DS3231,以设置时间和日期。

C8051F120与DS3231(高精度内置温补RTC实时时钟)的硬件IIC通信子程序(扫描方式)

C8051F120与DS3231(高精度内置温补RTC实时时钟)的硬件IIC通信子程序(扫描方式)

D S3231.t x t;************************************************************************************ ;作用:I I C通信(D S3231时钟芯片),扫描方式.;单片机型号:C8051F120;通信器件:D S3231内置温补R T C高精度时钟;作者:C Z M3000;占用资源:A C C,R0,R2,R3,R7;************************************************************************************ ;R3:D S3231的内部寄存器地址;************************************************************************************ D S3231W:;写入程序!S E T B S T A;发送起始D W1:M O V A,S M B0S T A;状态查询C J N E A,#08H,D W1;起始条件是否发出C L R S I;清中断标志C L R S T A;清起始条件位M O V W D T C N,#0A5H;喂狗M O V S M B0D A T,#11010000B;器件地址(D S3231)+读写状态位发送D W2:M O V A,S M B0S T A;状态查询C J N E A,#18H,D W2;器件地址+读写状态位是否成功发送并收到A C KM O V W D T C N,#0A5H;喂狗M O V S M B0D A T,R3;待写数据目标地址发送C L R S I;清中断标志D W3:M O V A,S M B0S T A;状态查询C J N E A,#28H,D W3;数据目标地址是否成功发送并收到A C KM O V W D T C N,#0A5H;喂狗C L R S I;清中断标志D W X:M O V S M B0D A T,@R0;数据发送D W4:M O V A,S M B0S T A;状态查询C J N E A,#28H,D W4;数据是否成功发出并收到A C KC L R S I;清中断标志I N C R0;数据指针加一M O V W D T C N,#0A5H;喂狗D J N Z R2,D W X;数据是否全部发送完毕S E T B S T O;发送结束条件L C A L L D E L A Y;调延时程序C L R S I;清中断标志R E T;************************************************************************************* ;R2:读取器件(D S3231)寄存器数据个数.;************************************************************************************* D S3231R:;读取程序!S E T B A A;开应答标志位S E T B S T A;发送起始条件D R1:M O V A,S M B0S T A;状态查询C J N E A,#08H,D R1;起始条件是否发出M O V W D T C N,#0A5H;喂狗M O V S M B0D A T,#11010001B;器件地址+读写状态位发送C L R S T A;清起始条件位C L R S I;清中断标志D R2:M O V A,S M B0S T A;状态查询C J N E A,#40H,D R2;器件地址+读写状态位是否成功发送并收到A C KD R:M O V W D T C N,#0A5H;喂狗C L R S I;清中断标志C J N E R2,#01H,D R3;数据接收是否还剩一个字节C L R A A;清应答标志位D R4:M O V A,S M B0S T A;状态查询C J N E A,#58H,D R4;数据是否接收完毕并返回N A C KM O V W D T C N,#0A5H;喂狗L J M P D R5;跳转D R3:M O V W D T C N,#0A5HM O V A,S M B0S T A;状态查询C J N E A,#50H,D R3;数据是否接收完毕并返回N A C KD R5:第 1页D S3231.t x tM O V A,S M B0D A T;数据载入M O V W D T C N,#0A5H;喂狗M O V@R0,A;数据转存I N C R0;数据指针加一D J N Z R2,D R;数据是否全部接受完毕S E T B S T O;发送结束条件L C A L L D E L A Y;调延时程序C L R S I;清中断标志位R E T;************************************************************************************** ;R2:欲读取器件地址的前一个地址(如:欲读取02H地址以后的数据,则R2为01H).;************************************************************************************** D S3231Z:;地址发送程序!S E T B S T A;发送起始条件D Z1:M O V A,S M B0S T A;状态查询C J N E A,#08H,D Z1;起始条件是否发出M O V W D T C N,#0A5H;喂狗C L R S T A;清起始条件位C L R S I;清中断标志M O V S M B0D A T,#11010000B;器件地址+读写状态位发送D Z2:M O V A,S M B0S T A;状态查询C J N E A,#18H,D Z2;器件地址+读写状态位是否成功发送并收到A C KM O V W D T C N,#0A5H;喂狗C L R S IM O V S M B0D A T,R2;器件寄存器地址发送D Z3:M O V A,S M B0S T A;状态查询C J N E A,#28H,D Z3;器件寄存器地址是否成功发送并收到A C KM O V W D T C N,#0A5H;喂狗C L R S I;清中断标志S E T B S T O;发送结束条件L C A L L D E L A Y;调延时程序C L R S I;清中断标志R E T;***************************************************************************************D E L A Y:;延时程序!M O V R7,#00HD E L A Y1:N O PN O PD J N Z R7,DE L A Y1M O V W D T C N,#0A5H;喂狗R E T;1284周期,25M时钟时约50微秒.;*************************************************************************************** ;初始化程序!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;*************************************************************************************** R e s e t_S o u r c e s_I n i t:m o v W D T C N,#007hr e tT i m e r_I n i t:m o v S F R P A G E,#T M R2_P A G Em o v T M R2C N,#004hm o v T M R2C F,#008hm o v R C A P2L,#082hm o v R C A P2H,#0F D hr e tU A R T_I n i t:m o v S F R P A G E,#U A R T0_P A G Em o v S C O N0,#050hm o v S S T A0,#015hr e tS M B u s_I n i t:m o v S F R P A G E,#S M B0_P A G Em o v S M B0C N,#040hm o v S M B0C R,#0E C hr e t第 2页D S3231.t x t P o r t_I O_I n i t:;P0.0-T X0(U A R T0),O p e n-D r a i n,D i g i t a l;P0.1-R X0(U A R T0),O p e n-D r a i n,D i g i t a l;P0.2-S D A(S M B u s),O p e n-D r a i n,D i g i t a l;P0.3-S C L(S M B u s),O p e n-D r a i n,D i g i t a l;P0.4-I N T0(T m r0),O p e n-D r a i n,D i g i t a l;P0.5-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P0.6-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P0.7-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P1.0-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P1.1-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P1.2-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P1.3-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P1.4-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P1.5-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P1.6-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P1.7-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P2.0-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P2.1-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P2.2-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P2.3-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P2.4-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P2.5-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P2.6-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P2.7-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P3.0-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P3.1-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P3.2-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P3.3-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P3.4-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P3.5-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P3.6-U n a s s i g n e d,O p e n-D r a i n,D i g i t a l;P3.7-U n a s s i g n e d,O p e n-D r a i n,D i g i t a lm o v S F R P A G E,#C O N F I G_P A G Em o v X B R0,#005hm o v X B R1,#004hm o v X B R2,#040hr e tO s c i l l a t o r_I n i t:m o v S F R P A G E,#C O N F I G_P A G Em o v O S C I C N,#083hr e tI n t e r r u p t s_I n i t:m o v I E,#091hr e t;I n i t i a l i z a t i o n f u n c t i o n f o r d e v i c e,;C a l l I n i t_D e v i c e f r o m y o u r m a i n p r o g r a mI n i t_D e v i c e:l c a l l R e s e t_S o u r c e s_I n i tl c a l l T i m e r_I n i tl c a l l U A R T_I n i tl c a l l S M B u s_I n i tl c a l l P o r t_I O_I n i tl c a l l O s c i l l a t o r_I n i tl c a l l I n t e r r u p t s_I n i tr e te n d第 3页。

maxim ds3231实时时钟应用笔记使用指南faq全集

maxim ds3231实时时钟应用笔记使用指南faq全集

Maxim DS3231实时时钟应用笔记、使用指南、FAQ全集Maxim DS3231实时时钟应用笔记、使用指南、FAQ全集2013-03-14 07:11:00分享到:标签:DS3231Maxim实时时钟RTC&amp;amp;amp;amp;lt;a target='_blank'href='/www/delivery/ck.php?n=9ac65 e3'&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;img border='0' alt=''src='/www/delivery/avw.php?zoneid= 212&amp;amp;amp;amp;amp;amp;n=9ac65e3'/&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/a&amp;a mp;amp;amp;gt;编者按:Maxim Integrated新型实时时钟(RTC) DS3231,内部集成了TCXO、RTC和32.768kHz晶体,并采用低成本、标准型、16引脚SOIC封装。

在-40°C 至+85°C温度范围内,计时精度为±2分钟/年。

这一出色性能使DS3231成为当前要求高计时精度应用的最佳解决方案。

而RTC的其它集成功能也扩展了系统应用领域,适合那些对计时精度要求极高的应用。

应用包括:服务器、电表、安防及门禁控制系统、车队管理、远程信息处理系统、GPS导航装置、POS终端以及ATM。

除计时精度高之外,DS3231还具有一些其它功能, 这些功能扩展了系统主机的附加功能和选择范围。

该器件内部集成了一个非常精确的数字温度传感器,可通过I2C* 接口对其进行访问(如同时间一样)。

这个温度传感器的精度为±3°C。

DS3231高精度时钟模块程序

DS3231高精度时钟模块程序

模块参数:1.尺寸:38mm(长)*22mm(宽)*14mm(高)2.重量:8g3.工作电压:3.3--5.5V4.时钟芯片:高精度时钟芯片DS32315.时钟精度:0-40℃范围内,精度2ppm,年误差约1分钟6.带2个日历闹钟7.可编程方波输出8.实时时钟产生秒、分、时、星期、日期、月和年计时,并提供有效期到2100年的闰年补偿9.芯片内部自带温度传感器,精度为±3℃10.存储芯片:AT24C32(存储容量32K)11.IIC总线接口,最高传输速度400KHz(工作电压为5V时)12.可级联其它IIC设备,24C32地址可通过短路A0/A1/A2修改,默认地址为0x5713.带可充电电池LIR2032,保证系统断电后,时钟任然正常走动接线说明,以Arduino uno r3为例:SCL→A5SDA→A4VCC→5VGND→GND代码部分:#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit SDA=P3^6; //模拟I2C数据传送位SDAsbit SCL=P3^7; //模拟I2C时钟控制位SCLsbit INT=P3^2;sbit RESET=P3^3;sbit led0=P1^0;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit led4=P1^4;sbit led5=P1^5;sbit led6=P1^6;sbit led7=P1^7;bit ack; //应答标志位#define DS3231_WriteAddress 0xD0 //器件写地址#define DS3231_ReadAddress 0xD1 //器件读地址#define DS3231_SECOND 0x00 //秒#define DS3231_MINUTE 0x01 //分#define DS3231_HOUR 0x02 //时#define DS3231_WEEK 0x03 //星期#define DS3231_DAY 0x04 //日#define DS3231_MONTH 0x05 //月#define DS3231_YEAR 0x06 //年//闹铃1#define DS3231_SALARM1ECOND 0x07 //秒#define DS3231_ALARM1MINUTE 0x08 //分#define DS3231_ALARM1HOUR 0x09 //时#define DS3231_ALARM1WEEK 0x0A //星期/日//闹铃2#define DS3231_ALARM2MINUTE 0x0b //分#define DS3231_ALARM2HOUR 0x0c //时#define DS3231_ALARM2WEEK 0x0d //星期/日#define DS3231_CONTROL 0x0e //控制寄存器#define DS3231_STATUS 0x0f //状态寄存器#define BSY 2 //忙#define OSF 7 //振荡器停止标志#define DS3231_XTAL 0x10 //晶体老化寄存器#define DS3231_TEMPERATUREH 0x11 //温度寄存器高字节(8位)#define DS3231_TEMPERATUREL 0x12 //温度寄存器低字节(高2位)uchar code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0,1,2,30x99,0x92,0x82,0xf8,0x80,0x90, 0xff}; // 4,5,6,7,8,9,offuchar data dis_buf[8];uchar data dis_index;uchar data dis_digit;uchar BCD2HEX(uchar val) //BCD转换为Byte{uchar temp;temp=val&0x0f;val>>=4;val&=0x0f;val*=10;temp+=val;return temp;}uchar HEX2BCD(uchar val) //B码转换为BCD码{uchar i,j,k;i=val/10;j=val;k=j+(i<<4);return k;}void delayus(uint us){while (us--);}void Start_I2C(){SDA=1; //发送起始条件的数据信号delayus(1);SCL=1;delayus(5); //起始条件建立时间大于4.7us,延时SDA=0; //发送起始信号delayus(5); // 起始条件锁定时间大于4μsSCL=0; //钳住I2C总线,准备发送或接收数据delayus(2);}void Stop_I2C(){SDA=0; //发送结束条件的数据信号delayus(1); //发送结束条件的时钟信号SCL=1; //结束条件建立时间大于4usdelayus(5);SDA=1; //发送I2C总线结束信号delayus(4);}void SendByte(uchar c){uchar BitCnt;for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位 {if((c<<BitCnt)&0x80)SDA=1;//判断发送位elseSDA=0;delayus(1);SCL=1;//置时钟线为高,通知被控器开始接收数据位delayus(5); //保证时钟高电平周期大于4μsSCL=0;}delayus(2);SDA=1;//8位发送完后释放数据线,准备接收应答位delayus(2);SCL=1;delayus(3);if(SDA==1)ack=0;elseack=1;//判断是否接收到应答信号SCL=0;delayus(2);}uchar RcvByte(){uchar retc;uchar BitCnt;retc=0;SDA=1; //置数据线为输入方式for(BitCnt=0;BitCnt<8;BitCnt++){delayus(1);SCL=0; //置时钟线为低,准备接收数据位delayus(5); //时钟低电平周期大于4.7μsSCL=1; //置时钟线为高使数据线上数据有效delayus(3);retc=retc<<1;if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中delayus(2);}SCL=0;delayus(2);return(retc);}void Ack_I2C(bit a){if(a==0)SDA=0; //在此发出应答或非应答信号 elseSDA=1;delayus(3);SCL=1;delayus(5); //时钟低电平周期大于4μsSCL=0; //清时钟线,钳住I2C总线以便继续接收delayus(2);}uchar write_byte(uchar addr, uchar write_data){Start_I2C();SendByte(DS3231_WriteAddress);if (ack == 0)return 0;SendByte(addr);if (ack == 0)return 0;SendByte(write_data);if (ack == 0)return 0;Stop_I2C();delayus(10);return 1;}uchar read_current(){uchar read_data;Start_I2C();SendByte(DS3231_ReadAddress);if(ack==0)return(0);read_data = RcvByte();Ack_I2C(1);Stop_I2C();return read_data;}uchar read_random(uchar random_addr) {Start_I2C();SendByte(DS3231_WriteAddress);if(ack==0)return(0);SendByte(random_addr);if(ack==0)return(0);return(read_current());}void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec) {uchar temp=0;temp=HEX2BCD(yea);write_byte(DS3231_YEAR,temp); //修改年temp=HEX2BCD(mon);write_byte(DS3231_MONTH,temp); //修改月temp=HEX2BCD(da);write_byte(DS3231_DAY,temp); //修改日temp=HEX2BCD(hou);write_byte(DS3231_HOUR,temp); //修改时temp=HEX2BCD(min);write_byte(DS3231_MINUTE,temp); //修改分temp=HEX2BCD(sec);write_byte(DS3231_SECOND,temp); //修改秒}void TimeDisplay(uchar Dhour,uchar Dmin,uchar Dsec){dis_buf[7]=dis_code[Dhour / 10]; // 时十位dis_buf[6]=dis_code[Dhour % 10]; // 时个位dis_buf[4]=dis_code[Dmin / 10]; // 分十位dis_buf[3]=dis_code[Dmin % 10]; // 分个位dis_buf[1]=dis_code[Dsec / 10]; // 秒十位dis_buf[0]=dis_code[Dsec % 10]; // 秒个位dis_buf[2]=0xbf; // 显示"-"dis_buf[5]=0xbf;}void DateDisplay(uchar Dyear,uchar Dmonth,uchar Dday){dis_buf[7]=dis_code[Dyear / 10]; // 年十位dis_buf[6]=dis_code[Dyear % 10]; // 年个位dis_buf[4]=dis_code[Dmonth / 10]; // 月十位dis_buf[3]=dis_code[Dmonth % 10]; // 月个位dis_buf[1]=dis_code[Dday / 10]; // 天十位dis_buf[0]=dis_code[Dday % 10]; // 天个位dis_buf[2]=0xbf; // 显示"-"dis_buf[5]=0xbf;}void get_show_time(void){uchar Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;Htemp1=read_random(DS3231_HOUR); //时 24小时制Htemp1&=0x3f;Htemp2=BCD2HEX(Htemp1);Mtemp1=read_random(DS3231_MINUTE); //分Mtemp2=BCD2HEX(Mtemp1);Stemp1=read_random(DS3231_SECOND); //秒Stemp2=BCD2HEX(Stemp1);TimeDisplay(Htemp2,Mtemp2,Stemp2);}void get_show_date(void){uchar Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;Ytemp1=read_random(DS3231_YEAR); //年Ytemp2=BCD2HEX(Ytemp1);Mtemp1=read_random(DS3231_MONTH); //月Mtemp2=BCD2HEX(Mtemp1);Dtemp1=read_random(DS3231_DAY); //日Dtemp2=BCD2HEX(Dtemp1);DateDisplay(Ytemp2,Mtemp2,Dtemp2);}void get_show_Temperature(void){uchar Ttemp1,Ttemp2,Ttemp3,Ttemp4;Ttemp1=read_random(DS3231_TEMPERATUREH); //温度高字节 Ttemp2=BCD2HEX(Ttemp1);Ttemp3=read_random(DS3231_TEMPERATUREL); //温度低字节Ttemp4=BCD2HEX(Ttemp3);DateDisplay(0,Ttemp2,Ttemp4);}void timer0() interrupt 1{TH0=0xFC;TL0=0x17;P2=0xff; // 先关闭所有数码管P0=dis_buf[dis_index]; // 显示代码传送到P0口P2=dis_digit;if (dis_digit & 0x80)dis_digit=(dis_digit << 1) | 0x1;elsedis_digit=(dis_digit << 1);dis_index++;dis_index&=0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描}void main(){uint ii = 0;RESET=0x1; //DS3231复位操作,正常操作下不需要每次都复位delayus(5000);led0=0;led1=0;led2=0;led3=0;led4=0;P0=0xff;P2=0xff;dis_digit=0xfe;dis_index=0;TimeDisplay(12, 5, 18);TMOD=0x11; // 定时器0, 1工作模式1, 16位定时方式 TH0=0xFC;TL0=0x17;TCON=0x01;IE=0x82; // 使能timer0,1 中断TR0=1;if (write_byte(DS3231_CONTROL, 0x1C) == 0)led0=1;if (write_byte(DS3231_STATUS, 0x00) == 0)led1=1;ModifyTime(10,6,13,15,30,00); //初始化时钟,2010/6/13,15/30/00//小时采用24小时制while(1){//get_show_date(); //显示日期//get_show_Temperature(); //显示温度get_show_time(); //显示时间delayus(50000);}}。

DS3231详细介绍(非芯片手册)

DS3231详细介绍(非芯片手册)

DS3231详细介绍(⾮芯⽚⼿册)年误差⼩于1分钟⾼精度时钟DS3231的设计及应⽤深圳市凌雁电⼦有限公司[1].前⾔在许多单⽚机的测控系统和家⽤电器中都含有时钟显⽰部分,最廉价的是直接使⽤单⽚机中的定时器,辅以⼀定的中断服务程序,构成时钟显⽰部分,这种⽅式是⼏乎不需要增加新的硬件即可实现,缺点是计时误差⼤,同时电源掉电不能保持时钟继续运⾏。

在相对要求较⾼的场合,则使⽤廉价的时钟芯⽚(如DS1302等等)辅以备⽤电池,计时精度略⾼,可满⾜⼀般的要求。

在这篇⽂章中,我们重点介绍⾼精度时钟电路DS3231的设计和应⽤。

在DS1302普及型时钟芯⽚,晶体均需外置,由于晶体的离散性,很难选择到精度很⾼的器件,同时也没有温度补偿电路,不同的温度环境下,晶体的特性也在变化,直接影响着时钟的振荡频率,较⼤的误差在所在所难免。

⽽DS3231⾼精度时钟芯⽚,将晶体和温度补偿均集成在芯⽚中,为提⾼计时精度提供了可能,实册证明,使⽤DS3231时钟芯⽚,误差可做到⼀年⼩于⼀分钟,甚⾄部分显⽰器误差可⼩于20秒/⼀年。

这对有相对精确时钟要求的应⽤场合是个理想的选择。

[2].DS3231时钟芯⽚结构原理DS3231是⼀款⾼精度I2C实时时钟(RTC)器件,具有集成的温度补偿晶体振荡器(TCXO)。

该器件包含电池输⼊端,断开主电源时仍可保持精确计时。

集成的晶体振荡器可提⾼器件的长期精确度。

DS3231的寄存器能保存秒、分、时、星期、⽇期、⽉、年和闹钟设置等信息。

少于31天的⽉份,可⾃动调整⽉末⽇期,包括闰年补偿。

时钟的⼯作格式为24⼩时或带AM/PM指⽰的12⼩时格式。

DS3231提供两个可编程⽇历闹钟和⼀路可编程⽅波输出。

DS3231与单⽚机通过I2C双向串⾏总线传输地址与数据。

下图为DS3231典型应⽤电路,图中可看出,DS3231⼏乎不需要外部元件。

[3].DS3231时钟芯⽚结构如图1所⽰,DS3231的主要组成部分有8个模块,划分为4个功能组:TCXO、电源控制、按钮复位和RTC。

51单片机使用ds3231模块

51单片机使用ds3231模块

51单片机使用ds3231模块//DS3231某宝买的模块,5块不到的样子。

麻烦大家下载一下,不要直接复制。

89c52不能用1t的单片机。

//此修正版的文件可以解决之前的word下载后不能打开的蛋疼问题。

1602数据端口是P2如果需要修改,只有2个地方需要改。

#include#include#define uchar unsigned char#define uint unsigned int#define yh 0x80 //第一行的初始位置#define er 0x80+0x40 //第二行初始位置sbitrs=P0^7;//1602的3个端口sbitwr=P0^6;sbit en=P0^5;sbit SDA=P1^6; //模拟I2C数据传送位SDA 模块只使用了2个端口sbit SCL=P1^7; //模拟I2C时钟控制位SCL//sbit INT=P3^2;sbit key1=P3^5; //功能键,修改键这是3个按键,低电平有效,串联个4到10千欧的电阻到按键开关上,然后接地就行sbit key2=P3^4; //上调键sbit key3=P3^3; //下调键//sbit RESET=P3^3;bit ack; //应答标志位#define DS3231_WriteAddress 0xD0 //器件写地址#define DS3231_ReadAddress 0xD1 //器件读地址#define DS3231_SECOND 0x00 //秒#define DS3231_MINUTE 0x01 //分#define DS3231_HOUR 0x02 //时#define DS3231_WEEK 0x03 //星期#define DS3231_DAY 0x04 //日#define DS3231_MONTH 0x05 //月#define DS3231_YEAR 0x06 //年//闹铃1#define DS3231_SALARM1ECOND 0x07 //秒#define DS3231_ALARM1MINUTE 0x08 //分#define DS3231_ALARM1HOUR 0x09 //时#define DS3231_ALARM1WEEK 0x0A //星期/日//闹铃2#define DS3231_ALARM2MINUTE 0x0b //分#define DS3231_ALARM2HOUR 0x0c //时#define DS3231_ALARM2WEEK 0x0d //星期/日#define DS3231_CONTROL 0x0e //控制寄存器#define DS3231_STATUS 0x0f //状态寄存器#define BSY 2 //忙#define OSF 7 //振荡器停止标志#define DS3231_XTAL 0x10 //晶体老化寄存器#define DS3231_TEMPERATUREH 0x11 //温度寄存器高字节(8位) #define DS3231_TEMPERATUREL 0x12 //温度寄存器低字节(高2位)uchara,miao,shi,fen,ri,yue,nian,week,temp1,temp2,key1n,temp;uchar code tab1[]={"2017- - FRI"};uchar code tab2[]={" : : ."};/*uchar HEX2BCD(ucharval) //B码转换为BCD码{uchar k;k=(val)/10*16+(val)%10;}*/ucharBCD_Decimal(ucharbcd){uchar Decimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F));}void delayus(uint us){while (us--);}void Start_I2C(){SDA=1; //发送起始条件的数据信号delayus(1);SCL=1;delayus(5); //起始条件建立时间大于4.7us,延时SDA=0; //发送起始信号delayus(5); // 起始条件锁定时间大于4μsSCL=0; //钳住I2C总线,准备发送或接收数据delayus(2); }void Stop_I2C(){SDA=0; //发送结束条件的数据信号delayus(1); //发送结束条件的时钟信号SCL=1; //结束条件建立时间大于4usdelayus(5);SDA=1; //发送I2C总线结束信号}void SendByte(uchar c){ucharBitCnt;for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位{if((c<<bitcnt)&0x80)< bdsfid="153" p=""></bitcnt)&0x80)<>SDA=1; //判断发送位elseSDA=0;delayus(1);SCL=1; //置时钟线为高,通知被控器开始接收数据位delayus(5); //保证时钟高电平周期大于4μsSCL=0;}delayus(2);SDA=1; //8位发送完后释放数据线,准备接收应答位delayus(2);SCL=1;delayus(3);if(SDA==1)ack=0;elseack=1; //判断是否接收到应答信号SCL=0;delayus(2);}ucharRcvByte()ucharretc;ucharBitCnt;retc=0;SDA=1; //置数据线为输入方式for(BitCnt=0;BitCnt<8;BitCnt++){delayus(1);SCL=0; //置时钟线为低,准备接收数据位delayus(5); //时钟低电平周期大于4.7μsSCL=1; //置时钟线为高使数据线上数据有效delayus(3);retc=retc<<1;if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中delayus(2);}SCL=0;delayus(2);return(retc);}void Ack_I2C(bit a){if(a==0)SDA=0; //在此发出应答或非应答信号elseSDA=1;delayus(3);SCL=1;delayus(5); //时钟低电平周期大于4μsSCL=0; //清时钟线,钳住I2C总线以便继续接收delayus(2);}ucharwrite_byte(ucharaddr, ucharwrite_data) {Start_I2C();SendByte(DS3231_WriteAddress);if (ack == 0)return 0;SendByte(addr);if (ack == 0)return 0;SendByte(write_data);if (ack == 0)return 0;Stop_I2C();delayus(10);return 1;}ucharread_current(){ucharread_data;Start_I2C();SendByte(DS3231_ReadAddress);if(ack==0)return(0);read_data = RcvByte();Ack_I2C(1);Stop_I2C();return read_data;}ucharread_random(ucharrandom_addr) { Start_I2C();SendByte(DS3231_WriteAddress);if(ack==0)return(0);SendByte(random_addr);if(ack==0)return(0);return(read_current());}/*voidModifyTime(ucharyea,ucharmon,ucharda,ucharhou,ucharmin,uc harsec,uchar week) {uchar temp=0;temp=HEX2BCD(yea);write_byte(DS3231_YEAR,temp); //修改年temp=HEX2BCD(mon);write_byte(DS3231_MONTH,temp); //修改月temp=HEX2BCD(da);write_byte(DS3231_DAY,temp); //修改日temp=HEX2BCD(hou);write_byte(DS3231_HOUR,temp); //修改时temp=HEX2BCD(min);write_byte(DS3231_MINUTE,temp); //修改分temp=HEX2BCD(sec);write_byte(DS3231_SECOND,temp); //修改秒temp=HEX2BCD(week);write_byte(DS3231_WEEK,temp); //修改星期}*//******************液晶写入************************/void write_1602com(uchar com)//液晶写入指令函数{rs=0;//置为写入命令P2=com;//送入数据delayus(1000);en=1;//拉高使能端delayus(1000);en=0;//完成高脉冲}void write_1602dat(uchardat){rs=1;//置为写入数据P2=dat;//送入数据delayus(1000);en=1;delayus(1000);en=0;}/*********************over***********************/ void lcd_init()//液晶初始化函数{ wr=0;write_1602com(0x38);//设置液晶工作模式write_1602com(0x0c);//开显示不显示光标write_1602com(0x06);//整屏不移动,指针加一write_1602com(0x01);write_1602com(yh+1);//字符写入的位置for(a=0;a<14;a++){write_1602dat(tab1[a]);//delay(3);}write_1602com(er);for(a=0;a<12;a++){write_1602dat(tab2[a]);//delay(3);}write_1602com(er+14); //写温度符号write_1602dat(0xdf);write_1602dat(0x43);}void write_sfm(ucharadd,uchardat)//写时分秒及温度{uchargw,sw;gw=dat%10;sw=dat/10;write_1602com(er+add);write_1602dat(0x30+sw);write_1602dat(0x30+gw);}void write_nyr(ucharadd,uchardat) //写日期{uchargw,sw;gw=dat%10;sw=dat/10;write_1602com(yh+add);write_1602dat(0x30+sw);write_1602dat(0x30+gw);}void write_week(uchar week)//写星期函数{write_1602com(yh+0x0c);switch(week){case 1:write_1602dat('M');//delay(5); write_1602dat('O');//delay(5);write_1602dat('N');break;case 2:write_1602dat('T');//delay(5); write_1602dat('U');//delay(5);write_1602dat('E');break;case 3:write_1602dat('W');//delay(5); write_1602dat('E');//delay(5);write_1602dat('D');break;case 4:write_1602dat('T');//delay(5); write_1602dat('H');//delay(5);write_1602dat('U');break;case 5:write_1602dat('F');//delay(5); write_1602dat('R');//delay(5);write_1602dat('I');break;case 6:write_1602dat('S');//delay(5); write_1602dat('T');//delay(5);write_1602dat('A');break;case 7:write_1602dat('S');//delay(5); write_1602dat('U');//delay(5);write_1602dat('N');break;}}void keyscan(){if(key1==0)//key1为功能键{delayus(5000);if(key1==0){while(!key1);key1n++;if(key1n==9)key1n=1;switch(key1n){case 1: TR0=0;//关闭定时器//TR1=0;write_1602com(er+0x06);//写入光标位置write_1602com(0x0f);//设置光标为闪烁break;case 2: write_1602com(er+3);//fen//write_1602com(0x0f);break;case 3: write_1602com(er+0);//shi//write_1602com(0x0f);break;case 4: write_1602com(yh+0x0d);//week //write_1602com(0x0f);break;case 5: write_1602com(yh+0x09);//ri//write_1602com(0x0f);break;case 6: write_1602com(yh+0x06);//yue//write_1602com(0x0f);break;case 7: write_1602com(yh+0x03);//nian//write_1602com(0x0f);break;case 8: write_1602com(0x0c);//设置光标不闪烁write_sfm(6,miao);//写入新的秒数temp=(miao)/10*16+(miao)%10;write_byte(DS3231_SECOND,temp); //退出时修改秒write_1602com(er+6);write_sfm(0x03,fen);temp=(fen)/10*16+(fen)%10;write_byte(DS3231_MINUTE,temp); //修改分write_1602com(er+3);TR0=1;//打开定时器break;}}}if(key1n!=0)//当key1按下以下。

DS3231高精度时钟模块程序

DS3231高精度时钟模块程序

模块参数:1.尺寸:38mm(长)*22mm(宽)*14mm(高)2.重量:8g3.工作电压:3.3--5.5V4.时钟芯片:高精度时钟芯片DS32315.时钟精度:0-40℃范围内,精度2ppm,年误差约1分钟6.带2个日历闹钟7.可编程方波输出8.实时时钟产生秒、分、时、星期、日期、月和年计时,并提供有效期到2100年的闰年补偿9.芯片内部自带温度传感器,精度为±3℃10.存储芯片:AT24C32(存储容量32K)11.IIC总线接口,最高传输速度400KHz(工作电压为5V时)12.可级联其它IIC设备,24C32地址可通过短路A0/A1/A2修改,默认地址为0x5713.带可充电电池LIR2032,保证系统断电后,时钟任然正常走动接线说明,以Arduino uno r3为例:SCL→A5SDA→A4VCC→5VGND→GND代码部分:#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit SDA=P3^6; //模拟I2C数据传送位SDAsbit SCL=P3^7; //模拟I2C时钟控制位SCLsbit INT=P3^2;sbit RESET=P3^3;sbit led0=P1^0;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit led4=P1^4;sbit led5=P1^5;sbit led6=P1^6;sbit led7=P1^7;bit ack; //应答标志位#define DS3231_WriteAddress 0xD0 //器件写地址#define DS3231_ReadAddress 0xD1 //器件读地址#define DS3231_SECOND 0x00 //秒#define DS3231_MINUTE 0x01 //分#define DS3231_HOUR 0x02 //时#define DS3231_WEEK 0x03 //星期#define DS3231_DAY 0x04 //日#define DS3231_MONTH 0x05 //月#define DS3231_YEAR 0x06 //年//闹铃1#define DS3231_SALARM1ECOND 0x07 //秒#define DS3231_ALARM1MINUTE 0x08 //分#define DS3231_ALARM1HOUR 0x09 //时#define DS3231_ALARM1WEEK 0x0A //星期/日//闹铃2#define DS3231_ALARM2MINUTE 0x0b //分#define DS3231_ALARM2HOUR 0x0c //时#define DS3231_ALARM2WEEK 0x0d //星期/日#define DS3231_CONTROL 0x0e //控制寄存器#define DS3231_STATUS 0x0f //状态寄存器#define BSY 2 //忙#define OSF 7 //振荡器停止标志#define DS3231_XTAL 0x10 //晶体老化寄存器#define DS3231_TEMPERATUREH 0x11 //温度寄存器高字节(8位)#define DS3231_TEMPERATUREL 0x12 //温度寄存器低字节(高2位)uchar code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0,1,2,30x99,0x92,0x82,0xf8,0x80,0x90, 0xff}; // 4,5,6,7,8,9,off uchar data dis_buf[8];uchar data dis_index;uchar data dis_digit;uchar BCD2HEX(uchar val) //BCD转换为Byte{uchar temp;temp=val&0x0f;val>>=4;val&=0x0f;val*=10;temp+=val;return temp;uchar HEX2BCD(uchar val) //B码转换为BCD码{uchar i,j,k;i=val/10;j=val;k=j+(i<<4);return k;}void delayus(uint us){while (us--);}void Start_I2C(){SDA=1; //发送起始条件的数据信号delayus(1);SCL=1;delayus(5); //起始条件建立时间大于4.7us,延时SDA=0; //发送起始信号delayus(5); // 起始条件锁定时间大于4μsSCL=0; //钳住I2C总线,准备发送或接收数据 delayus(2);}void Stop_I2C(){SDA=0; //发送结束条件的数据信号delayus(1); //发送结束条件的时钟信号SCL=1; //结束条件建立时间大于4usdelayus(5);SDA=1; //发送I2C总线结束信号delayus(4);}void SendByte(uchar c){uchar BitCnt;for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位{if((c<<BitCnt)&0x80)SDA=1; //判断发送位 elseSDA=0;delayus(1);SCL=1; //置时钟线为高,通知被控器开始接收数据位delayus(5); //保证时钟高电平周期大于4μsSCL=0;}delayus(2);SDA=1; //8位发送完后释放数据线,准备接收应答位delayus(2);SCL=1;delayus(3);if(SDA==1)ack=0;elseack=1; //判断是否接收到应答信号SCL=0;delayus(2);}uchar RcvByte(){uchar retc;uchar BitCnt;retc=0;SDA=1; //置数据线为输入方式for(BitCnt=0;BitCnt<8;BitCnt++){delayus(1);SCL=0; //置时钟线为低,准备接收数据位delayus(5); //时钟低电平周期大于4.7μsSCL=1; //置时钟线为高使数据线上数据有效delayus(3);retc=retc<<1;if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中 delayus(2);}SCL=0;delayus(2);return(retc);}void Ack_I2C(bit a){if(a==0)SDA=0; //在此发出应答或非应答信号elseSDA=1;delayus(3);SCL=1;delayus(5); //时钟低电平周期大于4μsSCL=0; //清时钟线,钳住I2C总线以便继续接收delayus(2);}uchar write_byte(uchar addr, uchar write_data){Start_I2C();SendByte(DS3231_WriteAddress);if (ack == 0)return 0;SendByte(addr);if (ack == 0)return 0;SendByte(write_data);if (ack == 0)return 0;Stop_I2C();delayus(10);return 1;}uchar read_current(){uchar read_data;Start_I2C();SendByte(DS3231_ReadAddress);if(ack==0)return(0);read_data = RcvByte();Ack_I2C(1);Stop_I2C();return read_data;}uchar read_random(uchar random_addr) {Start_I2C();SendByte(DS3231_WriteAddress);if(ack==0)return(0);SendByte(random_addr);if(ack==0)return(0);return(read_current());}void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec){uchar temp=0;temp=HEX2BCD(yea);write_byte(DS3231_YEAR,temp); //修改年temp=HEX2BCD(mon);write_byte(DS3231_MONTH,temp); //修改月temp=HEX2BCD(da);write_byte(DS3231_DAY,temp); //修改日temp=HEX2BCD(hou);write_byte(DS3231_HOUR,temp); //修改时temp=HEX2BCD(min);write_byte(DS3231_MINUTE,temp); //修改分temp=HEX2BCD(sec);write_byte(DS3231_SECOND,temp); //修改秒}void TimeDisplay(uchar Dhour,uchar Dmin,uchar Dsec){dis_buf[7]=dis_code[Dhour / 10]; // 时十位dis_buf[6]=dis_code[Dhour % 10]; // 时个位dis_buf[4]=dis_code[Dmin / 10]; // 分十位dis_buf[3]=dis_code[Dmin % 10]; // 分个位dis_buf[1]=dis_code[Dsec / 10]; // 秒十位dis_buf[0]=dis_code[Dsec % 10]; // 秒个位dis_buf[2]=0xbf; // 显示"-"dis_buf[5]=0xbf;}void DateDisplay(uchar Dyear,uchar Dmonth,uchar Dday){dis_buf[7]=dis_code[Dyear / 10]; // 年十位dis_buf[6]=dis_code[Dyear % 10]; // 年个位dis_buf[4]=dis_code[Dmonth / 10]; // 月十位dis_buf[3]=dis_code[Dmonth % 10]; // 月个位dis_buf[1]=dis_code[Dday / 10]; // 天十位dis_buf[0]=dis_code[Dday % 10]; // 天个位dis_buf[2]=0xbf; // 显示"-"dis_buf[5]=0xbf;}void get_show_time(void){uchar Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;Htemp1=read_random(DS3231_HOUR); //时 24小时制Htemp1&=0x3f;Htemp2=BCD2HEX(Htemp1);Mtemp1=read_random(DS3231_MINUTE); //分Mtemp2=BCD2HEX(Mtemp1);Stemp1=read_random(DS3231_SECOND); //秒Stemp2=BCD2HEX(Stemp1);TimeDisplay(Htemp2,Mtemp2,Stemp2);}void get_show_date(void){uchar Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;Ytemp1=read_random(DS3231_YEAR); //年Ytemp2=BCD2HEX(Ytemp1);Mtemp1=read_random(DS3231_MONTH); //月Mtemp2=BCD2HEX(Mtemp1);Dtemp1=read_random(DS3231_DAY); //日Dtemp2=BCD2HEX(Dtemp1);DateDisplay(Ytemp2,Mtemp2,Dtemp2);}void get_show_Temperature(void){uchar Ttemp1,Ttemp2,Ttemp3,Ttemp4;Ttemp1=read_random(DS3231_TEMPERATUREH); //温度高字节Ttemp2=BCD2HEX(Ttemp1);Ttemp3=read_random(DS3231_TEMPERATUREL); //温度低字节Ttemp4=BCD2HEX(Ttemp3);DateDisplay(0,Ttemp2,Ttemp4);}void timer0() interrupt 1{TH0=0xFC;TL0=0x17;P2=0xff; // 先关闭所有数码管P0=dis_buf[dis_index]; // 显示代码传送到P0口P2=dis_digit;if (dis_digit & 0x80)dis_digit=(dis_digit << 1) | 0x1;elsedis_digit=(dis_digit << 1);dis_index++;dis_index&=0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描}void main(){uint ii = 0;RESET=0x1; //DS3231复位操作,正常操作下不需要每次都复位delayus(5000);led0=0;led1=0;led2=0;led3=0;led4=0;P0=0xff;P2=0xff;dis_digit=0xfe;dis_index=0;TimeDisplay(12, 5, 18);TMOD=0x11; // 定时器0, 1工作模式1, 16位定时方式TH0=0xFC;TL0=0x17;TCON=0x01;IE=0x82; // 使能timer0,1 中断TR0=1;if (write_byte(DS3231_CONTROL, 0x1C) == 0)led0=1;if (write_byte(DS3231_STATUS, 0x00) == 0)led1=1;ModifyTime(10,6,13,15,30,00); //初始化时钟,2010/6/13,15/30/00//小时采用24小时制while(1){//get_show_date(); //显示日期//get_show_Temperature(); //显示温度get_show_time(); //显示时间delayus(50000);} }。

DS3231高精度时钟模块程序

DS3231高精度时钟模块程序

模块参数:1.尺寸:38mm(长)*22mm(宽)*14mm(高)2.重量:8g3.工作电压:3.3--5.5V4.时钟芯片:高精度时钟芯片DS32315.时钟精度:0-40℃范围内,精度2ppm,年误差约1分钟6.带2个日历闹钟7.可编程方波输出8.实时时钟产生秒、分、时、星期、日期、月和年计时,并提供有效期到2100年的闰年补偿9.芯片内部自带温度传感器,精度为±3℃10.存储芯片:AT24C32(存储容量32K)11.IIC总线接口,最高传输速度400KHz(工作电压为5V时)12.可级联其它IIC设备,24C32地址可通过短路A0/A1/A2修改,默认地址为0x5713.带可充电电池LIR2032,保证系统断电后,时钟任然正常走动接线说明,以Arduino uno r3为例:SCL→A5SDA→A4VCC→5VGND→GND代码部分:#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit SDA=P3^6; //模拟I2C数据传送位SDAsbit SCL=P3^7; //模拟I2C时钟控制位SCLsbit INT=P3^2;sbit RESET=P3^3;sbit led0=P1^0;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit led4=P1^4;sbit led5=P1^5;sbit led6=P1^6;sbit led7=P1^7;bit ack; //应答标志位#define DS3231_WriteAddress 0xD0 //器件写地址#define DS3231_ReadAddress 0xD1 //器件读地址#define DS3231_SECOND 0x00 //秒#define DS3231_MINUTE 0x01 //分#define DS3231_HOUR 0x02 //时#define DS3231_WEEK 0x03 //星期#define DS3231_DAY 0x04 //日#define DS3231_MONTH 0x05 //月#define DS3231_YEAR 0x06 //年//闹铃1#define DS3231_SALARM1ECOND 0x07 //秒#define DS3231_ALARM1MINUTE 0x08 //分#define DS3231_ALARM1HOUR 0x09 //时#define DS3231_ALARM1WEEK 0x0A //星期/日//闹铃2#define DS3231_ALARM2MINUTE 0x0b //分#define DS3231_ALARM2HOUR 0x0c //时#define DS3231_ALARM2WEEK 0x0d //星期/日#define DS3231_CONTROL 0x0e //控制寄存器#define DS3231_STATUS 0x0f //状态寄存器#define BSY 2 //忙#define OSF 7 //振荡器停止标志#define DS3231_XTAL 0x10 //晶体老化寄存器#define DS3231_TEMPERATUREH 0x11 //温度寄存器高字节(8位)#define DS3231_TEMPERATUREL 0x12 //温度寄存器低字节(高2位)uchar code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0,1,2,30x99,0x92,0x82,0xf8,0x80,0x90, 0xff}; // 4,5,6,7,8,9,off uchar data dis_buf[8];uchar data dis_index;uchar data dis_digit;uchar BCD2HEX(uchar val) //BCD转换为Byte{uchar temp;temp=val&0x0f;val>>=4;val&=0x0f;val*=10;temp+=val;return temp;uchar HEX2BCD(uchar val) //B码转换为BCD码{uchar i,j,k;i=val/10;j=val;k=j+(i<<4);return k;}void delayus(uint us){while (us--);}void Start_I2C(){SDA=1; //发送起始条件的数据信号delayus(1);SCL=1;delayus(5); //起始条件建立时间大于4.7us,延时SDA=0; //发送起始信号delayus(5); // 起始条件锁定时间大于4μsSCL=0; //钳住I2C总线,准备发送或接收数据 delayus(2);}void Stop_I2C(){SDA=0; //发送结束条件的数据信号delayus(1); //发送结束条件的时钟信号SCL=1; //结束条件建立时间大于4usdelayus(5);SDA=1; //发送I2C总线结束信号delayus(4);}void SendByte(uchar c){uchar BitCnt;for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位{if((c<<BitCnt)&0x80)SDA=1; //判断发送位 elseSDA=0;delayus(1);SCL=1; //置时钟线为高,通知被控器开始接收数据位delayus(5); //保证时钟高电平周期大于4μsSCL=0;}delayus(2);SDA=1; //8位发送完后释放数据线,准备接收应答位delayus(2);SCL=1;delayus(3);if(SDA==1)ack=0;elseack=1; //判断是否接收到应答信号SCL=0;delayus(2);}uchar RcvByte(){uchar retc;uchar BitCnt;retc=0;SDA=1; //置数据线为输入方式for(BitCnt=0;BitCnt<8;BitCnt++){delayus(1);SCL=0; //置时钟线为低,准备接收数据位delayus(5); //时钟低电平周期大于4.7μsSCL=1; //置时钟线为高使数据线上数据有效delayus(3);retc=retc<<1;if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中 delayus(2);}SCL=0;delayus(2);return(retc);}void Ack_I2C(bit a){if(a==0)SDA=0; //在此发出应答或非应答信号elseSDA=1;delayus(3);SCL=1;delayus(5); //时钟低电平周期大于4μsSCL=0; //清时钟线,钳住I2C总线以便继续接收delayus(2);}uchar write_byte(uchar addr, uchar write_data){Start_I2C();SendByte(DS3231_WriteAddress);if (ack == 0)return 0;SendByte(addr);if (ack == 0)return 0;SendByte(write_data);if (ack == 0)return 0;Stop_I2C();delayus(10);return 1;}uchar read_current(){uchar read_data;Start_I2C();SendByte(DS3231_ReadAddress);if(ack==0)return(0);read_data = RcvByte();Ack_I2C(1);Stop_I2C();return read_data;}uchar read_random(uchar random_addr) {Start_I2C();SendByte(DS3231_WriteAddress);if(ack==0)return(0);SendByte(random_addr);if(ack==0)return(0);return(read_current());}void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec){uchar temp=0;temp=HEX2BCD(yea);write_byte(DS3231_YEAR,temp); //修改年temp=HEX2BCD(mon);write_byte(DS3231_MONTH,temp); //修改月temp=HEX2BCD(da);write_byte(DS3231_DAY,temp); //修改日temp=HEX2BCD(hou);write_byte(DS3231_HOUR,temp); //修改时temp=HEX2BCD(min);write_byte(DS3231_MINUTE,temp); //修改分temp=HEX2BCD(sec);write_byte(DS3231_SECOND,temp); //修改秒}void TimeDisplay(uchar Dhour,uchar Dmin,uchar Dsec){dis_buf[7]=dis_code[Dhour / 10]; // 时十位dis_buf[6]=dis_code[Dhour % 10]; // 时个位dis_buf[4]=dis_code[Dmin / 10]; // 分十位dis_buf[3]=dis_code[Dmin % 10]; // 分个位dis_buf[1]=dis_code[Dsec / 10]; // 秒十位dis_buf[0]=dis_code[Dsec % 10]; // 秒个位dis_buf[2]=0xbf; // 显示"-"dis_buf[5]=0xbf;}void DateDisplay(uchar Dyear,uchar Dmonth,uchar Dday){dis_buf[7]=dis_code[Dyear / 10]; // 年十位dis_buf[6]=dis_code[Dyear % 10]; // 年个位dis_buf[4]=dis_code[Dmonth / 10]; // 月十位dis_buf[3]=dis_code[Dmonth % 10]; // 月个位dis_buf[1]=dis_code[Dday / 10]; // 天十位dis_buf[0]=dis_code[Dday % 10]; // 天个位dis_buf[2]=0xbf; // 显示"-"dis_buf[5]=0xbf;}void get_show_time(void){uchar Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;Htemp1=read_random(DS3231_HOUR); //时 24小时制Htemp1&=0x3f;Htemp2=BCD2HEX(Htemp1);Mtemp1=read_random(DS3231_MINUTE); //分Mtemp2=BCD2HEX(Mtemp1);Stemp1=read_random(DS3231_SECOND); //秒Stemp2=BCD2HEX(Stemp1);TimeDisplay(Htemp2,Mtemp2,Stemp2);}void get_show_date(void){uchar Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;Ytemp1=read_random(DS3231_YEAR); //年Ytemp2=BCD2HEX(Ytemp1);Mtemp1=read_random(DS3231_MONTH); //月Mtemp2=BCD2HEX(Mtemp1);Dtemp1=read_random(DS3231_DAY); //日Dtemp2=BCD2HEX(Dtemp1);DateDisplay(Ytemp2,Mtemp2,Dtemp2);}void get_show_Temperature(void){uchar Ttemp1,Ttemp2,Ttemp3,Ttemp4;Ttemp1=read_random(DS3231_TEMPERATUREH); //温度高字节Ttemp2=BCD2HEX(Ttemp1);Ttemp3=read_random(DS3231_TEMPERATUREL); //温度低字节Ttemp4=BCD2HEX(Ttemp3);DateDisplay(0,Ttemp2,Ttemp4);}void timer0() interrupt 1{TH0=0xFC;TL0=0x17;P2=0xff; // 先关闭所有数码管P0=dis_buf[dis_index]; // 显示代码传送到P0口P2=dis_digit;if (dis_digit & 0x80)dis_digit=(dis_digit << 1) | 0x1;elsedis_digit=(dis_digit << 1);dis_index++;dis_index&=0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描}void main(){uint ii = 0;RESET=0x1; //DS3231复位操作,正常操作下不需要每次都复位delayus(5000);led0=0;led1=0;led2=0;led3=0;led4=0;P0=0xff;P2=0xff;dis_digit=0xfe;dis_index=0;TimeDisplay(12, 5, 18);TMOD=0x11; // 定时器0, 1工作模式1, 16位定时方式TH0=0xFC;TL0=0x17;TCON=0x01;IE=0x82; // 使能timer0,1 中断TR0=1;if (write_byte(DS3231_CONTROL, 0x1C) == 0)led0=1;if (write_byte(DS3231_STATUS, 0x00) == 0)led1=1;ModifyTime(10,6,13,15,30,00); //初始化时钟,2010/6/13,15/30/00//小时采用24小时制while(1){//get_show_date(); //显示日期//get_show_Temperature(); //显示温度get_show_time(); //显示时间delayus(50000);} }。

DS3231高精度时钟模块程序

DS3231高精度时钟模块程序

DS3231 高精度时钟模块程序
随着科技的迅猛发展,一些相应的精密仪器也随之问世,这些仪器中通常都需要设置准确的时钟,以保证时段的正确切换。

DS3231 是Maxim/Dallas
公司生产的一款低成本、超高精度的I2C 实时时钟芯片,该器件不仅能够在一定温度范围内提供优于&plusmn;2min/a 的计时精度,而且省去制造过程中
晶体安装和布线校准工序。

DS3231 是低成本,高精度I2C 实时时钟(RTC),具有集成的温补晶体振
荡器(TCXO)和1 个32.768kHz 的晶体。

该晶体包含电池输入端,断开主
电源仍可保持精确计时。

集成晶体振荡器可提高器件的长期精确度,并减少生产的元件数。

DS3231 提供商级和工业级温度范围,采用16 引脚、300mil 的SO 封装。

RTC 保持秒、分、时、星期、日期、月和年信息。

当遇到少于31 天的月
份,将自动调整月末日期,包括闰年补偿。

时钟的工作格式可以是24 小时或带-AM/PM 指示的12 小时格式。

提供2 个可编程日历闹钟和1 路可编程方波
输出。

地址与数据通过I2C 双向串行传输。

通过精密的、经过温度补偿的电压基准和比较器来监视VCC 状态,检测电源故障,提供复位输出,并在必要时自动切换到备用电源。

另外,RST 监视引脚可作为手动按钮输入,以产生外部复位信号。

MAXIM DS3231 说明书

MAXIM DS3231 说明书

_________________________________概述DS3231是低成本、高精度I 2C 实时时钟(RTC),具有集成的温补晶体振荡器(TCXO) 和晶体。

该器件包含电池输入端,断开主电源时仍可保持精确的计时。

集成晶体振荡器提高了器件的长期精确度,并减少了生产线的元件数量。

DS3231提供商用级和工业级温度范围,采用16引脚、300mil 的SO 封装。

RTC 保持秒、分、时、星期、日期、月和年信息。

少于31天的月份,将自动调整月末日期,包括闰年补偿。

时钟的工作格式可以是24小时或带AM /PM 指示的12小时格式。

提供两个可编程日历闹钟和一路可编程方波输出。

地址与数据通过I 2C 双向总线串行传输。

精密的、经过温度补偿的电压基准和比较器用来监视V CC 状态,检测电源故障、提供复位输出,并在必要时自动切换到备用电源。

另外,RST 监视引脚可以作为手动按钮输入以产生外部复位信号。

_________________________________应用服务器电表远程信息处理系统GPS_________________________________特性♦0°C 至+40°C 范围内精度为±2ppm ♦-40°C 至+85°C 范围内精度为±3.5ppm ♦为连续计时提供备用电池输入♦工作温度范围商用级:0°C 至+70°C 工业级:-40°C 至+85°C♦低功耗♦实时时钟提供秒、分、时、星期、日期、月、年信息,并提供有效期到2100年的闰年补偿♦两个日历闹钟♦可编程方波输出♦快速(400kHz) I 2C 接口♦3.3V 工作电压♦数字温度传感器输出:精度为±3°C ♦老化修正寄存器♦RST 输入/输出DS3231高精度、I 2C 集成RTC/TCXO/晶体______________________________________________Maxim Integrated Products1Rev 1; 2/05______________________________定购信息引脚配置在数据资料的最后部分给出。

DIY高精度时钟、温度显示器Ds3231+12864+ds18b20+89c51

DIY高精度时钟、温度显示器Ds3231+12864+ds18b20+89c51

DIY高精度时钟、温度显示器Ds3231+12864+ds18b20+89c51 硬件:程序:#include<reg52.h>#include<intrins.h>#include<stdlib.h>#define uchar unsigned char#define uint unsigned int/*端口定义*/sbit LCD_RS=P2^6;sbit LCD_RW=P2^5;sbit LCD_EN=P2^4;sbit LCD_PSB=P2^3;sbit DQ=P3^7; //18b20sbit SDA=P1^4; //ds32321 //模拟I2C数据传送位SDA sbit SCL=P1^3; //模拟I2C时钟控制位SCL //***按键功能****//////***K1停止时间显示****//////***K2选择修改位置****//////***K3进行加1的修改****//////***K4将修改写入ds3231,同时启动时间显示****//sbit K1=P3^2;sbit K2=P3^3;sbit K3=P3^4;sbit K4=P3^5;//定义变量uchar numbr[10]="0123456789"; //字模uchar dis4[]=" "; // 第四行显示自己添加uchar t[]=" . ℃" ; //18b20uint sdata,xiaoshu1,xiaoshu2; //整数、小数1位、小数2位bit fg=1; //温度正负标志uchar tempL=0,tempH=0; // 变量uchar year,month,date,hour,min,sec; // ds3231uchar a[]="2011年22月33日";uchar b[]="11时22分33秒";///函数//******************延时子程序*******************************//这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时//************************************************************void delay(unsigned char i){for(i;i>0;i--);}//***********************************************************// 延时子程序//************************************************************void delay1ms(uchar j){while(j!=0){uchar i;for(i=124;i>0;i--); //延时124*8+10=1002usj--;}}/**************************12864部分*************************************//**************************12864部分*************************************//*写指令数据到LCDRS=L——表示DB0-DB7为显示指令数据RW=L——表示DB0-DB7数据被write(当E=“H-L”,指令数据被写到IR或DR)E=高脉冲此时DB0-DB7=指令码*/void write_cmd(uchar cmd){LCD_RS=0;LCD_EN=0;P0=cmd;delay1ms(5);LCD_EN=1;delay1ms(5);LCD_EN=0;}/*设定显示位置*/void lcd_pos(uchar X, uchar Y){uchar pos;if(X == 0){X = 0x80;}else if(X == 1){X = 0x90;}else if(X == 2){X = 0x88;}else if(X == 3){X = 0x98;}pos = X + Y;write_cmd(pos); //显示地址}/*写显示数据到LCD*//*RS=H ——表示DB0-DB7为显示数据RW=L ——RW=L,E='H-L',DB0-DB7数据被写到IR或DRE=高脉冲DB0-DB7=显示数据*/void write_dat(uchar dat){LCD_RS=1;LCD_EN=0;P0=dat;delay1ms(5);LCD_EN=1;delay1ms(5);LCD_EN=0;}/*LCD初始化*/void lcd_init(){ uint i;LCD_PSB=1; //并口方式write_cmd(0x30); //基本操作指令delay1ms(5);write_cmd(0x0c); //打开显示,光标关闭delay1ms(5);write_cmd(0x01); //清除LCD显示类容delay1ms(5);lcd_pos(3,0);i=0;while(dis4[i]!='\0'){delay1ms(1);write_dat(dis4[i]);delay1ms(1);i++;}}/**********************************18b20*************************************** *********//**********************************18b20*************************************** *********/void Init_DS18B20(void) //初始化{uchar x=0;DQ=1; //DQ先置高delay(8); //稍延时DQ=0; //发送复位脉冲delay(80); //延时(>480us)DQ=1; //拉高数据线delay(5); //等待(15~60us)x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1delay(20);}//**********读一个字节************//ReadOneChar(void) //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号{unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期unsigned char dat=0;for (i=8;i>0;i--) //一个字节有8位{DQ=1;delay(1);DQ=0;dat>>=1;DQ=1;if(DQ)dat|=0x80;delay(4);}return(dat);}//*********************** **写一个字节**************************//void WriteOneChar(unsigned char dat){unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。

DS3231中文资料

DS3231中文资料

___________________________________DS3231 ӊĂ I 2C (RTC)Lj ԣ (TCXO) ă Ҫ Lj ү ă լ LjԌ դ ăDS3231 LjԳ 16 Ă300mil SO ăRTC ү Ă Ă Ă Ă Ă ă 31 Lj LjҪ ԣխă 24 AM /PM 12 ă Ӭ Ӭ Ԓ ă I 2C ăĂ ԣխ Ӕ V CC Lj Ռ Ă LjԌ Ӥ ӄ ă LjRST Ѣ Lj դ ԩ ă___________________________________ӹGPS___________________________________♦0°C +40°C ±2ppm ♦-40°C +85°C ±3.5ppm ♦ ӄ ♦ǖ0°C +70°C ǖ-40°C +85°C ♦♦ Ă Ă Ă Ă Ă Ă LjԌ 2100 ԣխ♦ ♦ Ӭ Ԓ♦ (400kHz) I 2C ♦3.3V♦ ǖ ±3°C ♦♦RST 0 ♦ү (UL)DS3231ĂI 2C Ă RTC/TCXO/______________________________________________Maxim Integrated Products1Rev 4; 10/06______________________________ăNbyjn LjNbyjn ă Lj Lj Nbyjn ăLj Nbyjn ǖxxx/nbyjn.jd/dpn/doă#ӹ RoHS Ӷ Lj Lj RoHS ăԳ JESD97 e3 Lj ă Ӷ Đ#đ ӹ RoHS Ӷ ăD S 3231ĂI 2C Ă RTC/TCXO/2ABSOLUTE MAXIMUM RATINGSRECOMMENDED DC OPERATING CONDITIONS(T A = T MIN to T MAX , unless otherwise noted.) (Notes 1, 2)Stresses beyond those listed under “Absolute Maximum Ratings” may cause permanent damage to the device. These are stress ratings only, and functional operation of the device at these or any other conditions beyond those indicated in the operational sections of the specifications is not implied. Exposure to absolute maximum rating conditions for extended periods may affect device reliability.Voltage Range on V CC , V BAT , 32kHz, SCL, SDA, RST ,INT /SQW Relative to Ground.............................-0.3V to +6.0V Operating Temperature Range(noncondensing).............................................-40°C to +85°C Junction Temperature......................................................+125°CStorage Temperature Range...............................-40°C to +85°C Lead Temperature(Soldering, 10s).....................................................+260°C/10s Soldering Temperature....................................See the Handling,PC Board Layout, and Assembly section.ELECTRICAL CHARACTERISTICS(V CC = 2.3V to 5.5V, V CC = Active Supply (see Table 1), T A = T MIN to T MAX , unless otherwise noted.) (Typical values are at V CC =3.3V, V BAT = 3.0V, and T A = +25°C, unless otherwise noted.) (Notes 1, 2)DS3231ĂI 2C Ă RTC/TCXO/_____________________________________________________________________3ELECTRICAL CHARACTERISTICS (continued)(V CC = 2.3V to 5.5V, V CC = Active Supply (see Table 1), T A = T MIN to T MAX , unless otherwise noted.) (Typical values are at V CC =3.3V, V BAT = 3.0V, and T A = +25°C, unless otherwise noted.) (Notes 1, 2)ELECTRICAL CHARACTERISTICS(V CC = 0V, V BAT = 2.3V to 5.5V , T A = T MIN to T MAX , unless otherw.ise noted.) (Note 1)D S 3231ĂI 2C Ă RTC/TCXO/AC ELECTRICAL CHARACTERISTICS(V CC = V CC(MIN)to V CC(MAX)or V BAT = V BAT(MIN)to V BAT(MAX), V BAT > V CC , T A = T MIN to T MAX, unless otherwise noted.) (Note 1)POWER-SWITCH CHARACTERISTICS(T = T to T )DS3231ĂI 2C Ă RTC/TCXO/_____________________________________________________________________5___________________________________________________________________Ѣ___________________________________________________________________D S 3231ĂI 2C Ă RTC/TCXO/6__________________________________________________________I 2CNote 1:Limits at -40°C are guaranteed by design and not production tested.Note 2:All voltages are referenced to ground.Note 3:I CCA —SCL clocking at max frequency = 400kHz.Note 4:Current is the averaged input current, which includes the temperature conversion current.Note 5:The RST pin has an internal 50k Ω(nominal) pullup resistor to V CC .Note 6:After this period, the first clock pulse is generated.Note 7:A device must internally provide a hold time of at least 300ns for the SDA signal (referred to the V IH(MIN)of the SCL signal)to bridge the undefined region of the falling edge of SCL.Note 8:The maximum t HD:DAT needs only to be met if the device does not stretch the low period (t LOW ) of the SCL signal.Note 9: A fast-mode device can be used in a standard-mode system, but the requirement t SU:DAT ≥250ns must then be met. Thisis automatically the case if the device does not stretch the low period of the SCL signal. If such a device does stretch the low period of the SCL signal, it must output the next data bit to the SDA line t R(MAX)+t SU:DAT = 1000 + 250 = 1250ns before the SCL line is released.Note 10:C B —total capacitance of one bus line in pF.Note 11:The parameter t OSF is the period of time the oscillator must be stopped for the OSF flag to be set over the voltage range of0.0V ≤V CC ≤V CC(MAX)and 2.3V ≤V BAT ≤3.4V.Note 12:This delay applies only if the oscillator is enabled and running. If the EOSC bit is a 1, t REC is bypassed and RST immediate-ly goes high.DS3231ĂI 2C Ă RTC/TCXO/_____________________________________________________________________7______________________________________________________________________(V CC = +3.3V, T A = +25°C, unless otherwise noted.)STANDBY SUPPLY CURRENT vs. SUPPLY VOLTAGEV CC (V)I C C S (μA )5.04.03.05010015002.0SUPPLY CURRENTvs. SUPPLY VOLTAGEV BAT (V)I B A T (μA )5.04.03.00.8000.9001.0001.1001.2000.7002.0SUPPLY CURRENT vs. TEMPERATURETEMPERATURE (°C)I B A T (μA )80.060.040.020.00.0-20.00.7000.8000.9001.0000.600-40.0FREQUENCY DEVIATION vs.TEMPERATURE vs. AGING VALUECRYSTAL AGING REGISTER VALUE F R E Q U E N C Y D E V I A T I O N (p p m )966432-64-32-96-40-30-20-100102030405060-128128D S 3231ĂI 2C Ă RTC/TCXO/8_________________________________________________________________________132kHz 2V CC3INT /SQW4RST5–12N.C.13GND14V BAT15SDA 16SCLDS3231ĂI 2C Ă RTC/TCXO/_____________________________________________________________________9_____________________________________________________________________________________________________________DS3231 32kHz ԣ RTC ăTCXO Ă Ը ă -40°C +85°C LjRTC ү ±2 / ăTCXO 32kHz ăRTC / Lj Ӭ Ӭ Ԓ ăINT /SQW Ԓ ă /Ă Ă Ă Ă Ă ă 31 Lj LjԌҪ ԣխă 24 AM /PM 12 ă ԩ I 2C ăԣ Ӕ V CC Lj Ռ LjԌ Ӥ ӄ ăRST ԩѢ LjԌ ă32kHz ă ă Lj ă ԥ Lj ү ăDC ă 0.1μF 1.0μF ăԥ Lj ăԒ ă Lj 5.5V 5.5V ă Lj ү ă (0Eh) INTCN ă INTCN 0 Lj ԒLj RS2 RS1 ă INTCN 1 Lj INT /SQW ( )ă INTCN 1Lj Ԍ ăă / ă V CC V PF Ӷ ă V CC V PF LjRST Ӈ ă V CC մ V PF Ԍ t RST LjRST ԩ ă Ă Ѣ ă Ѣ ă ԩ Ӷ 50kΩ V CC ă ă Ljt REC Ӈ ӚLjRST ă ă ԩӤ ă ăӄ ă 0.1μF 1.0μF ă V BAT LjI 2C Lj ă ԥ V BAT Lj ă Lj UL Lj Ը ǖ/qa/info/ul ă/ ă I 2C / ă ă ă I 2C Lj ԧ ăD S 3231______________________________DS3231 ԩ ăѹ ǖTCXO Ă ĂѢ RTC ă ԩ ă32kHz TCXOTCXO Ҫ Ă ă Lj Փ ӹ Lj AGE Lj ă Ӱ Lj Ljԯ Ҫ AGE Ӱ ăV CC Lj 64 ăԣ V CC Ӕ ă V CC V PF Lj V CC ă V CC V PF V BAT LjDS3231 V CC ă V CC V PF Ԍ V BAT Lj V BAT ăԸ ӹ1ăү LjV BAT V CC V PF Ԍԥ Lj I 2C ă 1 ă V CC I 2C 2 Lj Ռ LjԌ ă Lj (V CC V BAT ) ү ă 64 Ռ Ԍ ăѢDS3231 RST Ѣ ă DS3231ԥ Lj RST ă Ռ ӫ LjDS3231 RST ă ԩ (PB DB ) LjDS3231 RST ă ү LjDS3231 Ռ ă Ռ Ѣ LjDS3231 RST Ԍү t RST ăRST Lj Ҵ ă V CC V PF Lj դ ԩ Ҵ LjԌ RST ă V CC մ V PF LjRST ү 250ms (t REC )Lj ă V CC (Ը ԩ )Lj t REC LjRST Ӱ ăTCXO LjRTC Ă Ă Ă Ă Ă ă 31 Lj Lj Ҫ ă 24 AM /PM 12 ăӬ Ӭ Ԓ ăINT /SQW դ Lj Ԓ ă INTCN ă_____________________________ ӹ1 DS3231 ӹă Lj (12h) Lj 00h ă I 2C START 00h Lj ă Lj ă Ճ Lj Ө ă______________________________I 2CV CC V BAT Lj I 2C ă DS3231 V CC Lj DS3231 I 2C ԥ ԧLj ǖ DS3231 ă Lj SDA SCL Lj DS3231 I 2C ă Lj SCL SDA Ljդ START ăĂI 2C Ă RTC/TCXO/10____________________________ă 1 RTC ă ă Գ lj Ӭ (B C D ) ăDS3231 12 24 ă 6 12 24 ă Lj 12 ă 12 Lj 5 AM /PM Lj PM ă 24 Lj 5 (20 23 )ă 99 00 Lj ( 7 )ăă Lj Ӥ ( Lj 1 Lj 2 Lj )ăԥ ԥ Ճ ăLj ( ) ԩ ă Lj START ԩ ԧă Lj ү ă Ճ Ө ăDS3231ĂI 2C Ă RTC/TCXO/____________________________________________________________________111.ǖ Lj ăD S 3231Lj ă DS3231 Ճ ă Lj Ө LjӤ 1 ă LjԌ Ԓ Lj 1Hz Ԓ 500ms ă___________________________________DS3231Ҫ / ă 1 07h 0Ah ă 2 0Bh 0Dh ă Ӭ ( I N T C N )Lj INT /SQW ă / 7 Ӛ (ӹ2)ă Ӛ 0 Lj /ԯ ă Ӭ Ă Ă Ă ăӹ2 ă ԥѢ ӹ Lj ԥ Ճ ăDY/DT ( / 6 ) 0 5 ă DY/DT 0Lj ă DY/DT 1Lj ăRTC Lj Ӷ 'A1F' 'A2F' 1ă 'A1IE' 'A2IE' 1LjԌ INTCN 1Lj INT /SQW ă Ռ ăĂI 2C Ă RTC/TCXO/12ӹ2. Ӛ_________________________DS3231 ( )Lj Ă Ԓ ă(0Eh)7 ǖ (EOSC)ă 0 Lj ă 1Lj DS3231 V BAT ă Lj ( 0)ă DS3231 V CC Lj EOSC Lj ү ă6 ǖ ӄ Ԓ (BBSQW)ă 1Ԍ DS3231 V BAT Lj V CC Lj Ԓ ă BBSQW 0 Lj V CC Lj INT /SQW Ӱ ă Lj ( 0)ă5 ǖ (CONV)ă 1 Lj LjԌ TCXO ă ă TCXO Ճ Lj Փ BSY ă ԥ ԩ64 ă2ms ԥ BSY ăCONV ү 1Lj CONV BSY Ӱ 0ă CONV ă4 3 ǖ (RS2 RS1)ă Ԓ Lj Ԓ ă ӹ RS Ԓ ă Lj 1 (8.192kHz)ă2 ǖ (INTCN)ă INT /SQW ăINTCN 0 LjINT /SQW ԒăINTCN 1 Lj Lj INT /SQW ( )ă Ӷ Lj INTCN ă LjINTCN 1ă1 ǖ2 (A2IE)ă 1 Lj 2Ӷ (A2F) INT /SQW ( INTCN =1 )ă A2IE 0 INTCN 0 LjA2F ԥ ă LjA2IE ( 0)ă0 ǖ 1 (A1IE)ă 1 Lj 1Ӷ (A1F) INT /SQW ( INTCN =1 )ă A1IE 0 INTCN 0 LjA1F ԥ INT /SQW ă LjA1IE ( 0)ăDS3231ĂI 2C Ă RTC/TCXO/____________________________________________________________________13ԒD S 3231(0Fh)7 ǖ Ӷ (OSF)ă 1ӹ Lj Lj ă Lj 1ă OSF ǖ1) ă2)V CC V BAT ԥ ă3) ӄ LjEOSC ӡă4) ԩ ( Ă )ă ү 1Lj 0 ă3 ǖ 32kHz (EN32kHz)ă 32kHz ă 1 Lj 32kHz LjԌ 32.768kHz Ԓ ă 0 Lj32kHz Ӱ ă Lj 1ăDS3231 ( )Lj32kHz 32.768kHz Ԓ ă2 ǖ (BSY)ă ӹ TCXO ă BSY 1ă 1 ă1 ǖ 2Ӷ (A2F)ă 2Ӷ 1 ӹ2 ă A2IE 1LjԌ INTCN 1Lj INT /SQW ă 0 A2F ă 0ă 1 Ճ ԥ Ӱ ă0 ǖ 1Ӷ (A1F)ă 1Ӷ 1 ӹ 1 ă A1IE 1LjԌ INTCN 1Lj INT /SQW ă 0 A1F ă 0ă 1 Ճ ԥ Ӱ ă_____________________________ ԣխԣխ 8 LjԌ ă 2 ԣ ă Lj LSB ă Ljԣխ ǖ ի Lj Ӕ ӰLj ( CONV ) ă Ֆ 32kHz Lj ăLj Ǘ Lj ăԥ Lj LSB Ӱ (ppm) ԥ ă - ă +25°C Lj LSB ի 0.1ppm ăĂI 2C Ă RTC/TCXO/14ԣխ(10h)___________________ (11h 12h)Գ 10 Ӭ ӹ Lj +0.25°C Ӳ Lj 11h 12h ă Ӭ 2 ԣ ă 8 11h Lj 2 12h ҙ ă Lj 0°C Lj ă ă_________________________I 2CDS3231 I 2C ă ӄ Lj ӄ ă ӄ ӄă ӄ ӄ ӄă Ӥ ӄ Lj ӄ դ (SCL)Ă Lj դ START STOP ăDS3231 I 2C ӄ ă ӄ SCL SDA I/O ă Ӷ (100kHz ) (400kHz )ăDS3231 ă ( 2)ǖ• ԯ ă•Lj Lj Ӥ ү ă Ӱ Lj Ӈ ăLj ǖǖ ү ăǖ Lj Ӱ Lj START ăǖ Lj Ӱ Lj STOP ăǖդ START Lj ү Lj ӹ ă Ӥ Ӱă ăSTART LjԌ STOP ă START STOP Lj ӄ ă Lj 9 ăǖӇ ӄӤ ă ӄӤ Lj ăӄӤ SDA Lj LjSDA ү ă Lj ү Ӥ ă ԥ ӄ ԧ դ Lj ӄ ӄ ă Lj ӄӤ ү ӄ դ STOP ăDS3231ĂI 2C Ă RTC/TCXO/____________________________________________________________________15D S 32313 4 I 2C ă R/W Lj ǖӄ ӄ ă ӄ ӄ ă ă ӄ ă (MSB) ăӄ ӄ ă ӄ ( ӄ )ă ӄ ă ӄ ӄ ă Lj ӄ ă Lj ăӄդ START ĂSTOP ă STOP START ă START Lj ԥ ă (MSB) ăDS3231 ǖӄ (DS3231 )ǖ SDA SCL ă Lj ăSTART STOP ăӄ Lj Ӽă ӄդ START Lj ӄ ă ӄ Ҫ 7 DS3231 Lj 1101000Lj (R/W )ă 0Ljӹ Ճ ă Ԍ ӄ LjDS3231 SDA ă DS3231 ӄĂI 2C Ă RTC/TCXO/162. I 2C3. ӄ ()4. ӄ ( )+ Lj ӄ DS3231ă DS3231 LjDS3231 ă ӄ 0 LjDS3231 ă Lj ă ӄդ STOP ăӄ (DS3231 )ǖ ӄ ă Lj Lj ăDS3231 SDA LjԌ SCL ăSTART STOP ă ӄ Lj Ӽă ӄդ START Lj ӄ ă ӄ Ҫ 7 DS3231 Lj 1101000Lj (R/W )ă 1Ljӹ Ճ ă ӄ LjDS3231 SDA ă DS3231 LjԌ ă Lj ăDS3231Ӥ Ճ ă___________________Ճ ĂPCB Ԧ ѠDS3231 Ҫ Ր ă - ӄLj Ӥ Lj үӨ ăӨ մ Ԓ Lj ăՍ Lj Ө ă N.C.( ) Ӥ ăչ կ Գ չҪ ăӤ Ӷ Ճ Lj ăչ (MSD) Ը IPC/JEDEC J-STD-020Ӷ ă 2 ăDS3231ĂI 2C Ă RTC/TCXO/____________________________________________________________________17D S 3231ĂI 2C Ă RTC/TCXO/18______________________________TRANSISTOR COUNT: 33,000SUBSTRATE CONNECTED TO GROUND PROCESS: CMOS______________________________Theta-JA: +73°C/W Theta-JC: +23°C/W______________________________DS3231ĂI 2C Ă RTC/TCXO/`````````````````````````````````````````````````````````````````````````````( Lj Lj /packages ă)____________________________________________________________________19D S 3231ĂI 2C RTC/TCXO/Nbyjn Nbyjn Lj ăNbyjn Ă ă20___________________Maxim Integrated Products, 120 San Gabriel Drive, Sunnyvale, CA 94086 408-737-7600©2006 Maxim Integrated ProductsNbyjn!Joufhsbufe!Qspevdut-!Jod/ ăEbmmbt!Tfnjdpoevdups!Dpsqpsbujpo! ă____________________________________________________________________Rev 0Ǘ1/05ǖ Ԧ ăRev 1Ǘ2/05ǖ( 1Ă3 ) ±2°C ±3°C ă( 1 ) ă( 2Ă3Ă4 )T A = -40°C to +85°C T A = T MIN to T MAX ă( 8 ) ăRev 2Ǘ6/05ǖ( 1 )Đ UL đǗ ӹ Lj Ӷ S Ǘ N.C. ă( 2 )Đԥ đǗV PF MIN 2.35V 2.45V ă( 3 ) ԣխ Ӷă( 7 ) ӶTOC4ă( 8 ) ӹ X1 ă( 9 ) V CC V BAT ă( 10 ) I 2C ԩ ă( 11 ) 1ǖ Ǘ MSB LSB ă( 13 ) ӹ Ӷ ă( 14 ) Lj Ӱ ԣխ = 00h Ǘ 7 ( ԣխ )ă( 15 ) 7 ( )Ǘ I 2C ԩ ă( 17 ) J-STD-020 Ă Ճ ĂPCB Ԧ Ѡ ԩ ăRev 3Ǘ11/05ǖ( 1 ) RoHS Ӷ ăRev 4Ǘ10/06ǖ( 1 ) ԩ RST UL( 2Ă3 )ECĐV CC > V BAT đ ĐV CC = Active Supply (see Table 1)đă( 6 ) 12Lj ӹ t REC Ճ ă( 7 )TOC 1Ă2 3ă( 9 ) 32kHz ĂV CC RST ă( 10 )ӹ1ǖӶĐPowered By đ ĐActive Supply đǗ ԩ Lj Đ V CC đ ĐV CC V PF đă( 13 ) BBSQW SQW Ǘ( 5 )ǗINT /SQW Đ đă( 14 ) ԩ ԣխԩ Ǘ32kHzĐ ӹ đ Đ đăNbyjn9439 211194ǖ911!921!1421 ǖ121.732262:: ǖ121.732263::。

实时时钟DS3231读取信息出错的分析

实时时钟DS3231读取信息出错的分析

实时时钟DS3231读取信息出错的分析实时时钟芯片DS3231Maxim Integrated新型实时时钟(RTC)DS3231,内部集成了TCXO、RTC和32.768kHz晶体,并采用低成本、标准型、16引脚SOIC封装。

在-40C至+85C温度范围内,计时精度为2分钟/年。

这一出色性能使DS3231成为当前要求高计时精度应用的最佳解决方案。

而RTC的其它集成功能也扩展了系统应用领域,适合那些对计时精度要求极高的应用。

应用包括:服务器、电表、安防及门禁控制系统、车队管理、远程信息处理系统、GPS导航装置、POS终端以及ATM。

除计时精度高之外,DS3231还具有一些其它功能,这些功能扩展了系统主机的附加功能和选择范围。

该器件内部集成了一个非常精确的数字温度传感器,可通过I2C* 接口对其进行访问(如同时间一样)。

这个温度传感器的精度为3C。

片上控制电路可实现自动电源检测,并管理主电源和备用电源(即低压电池)之间的电源切换。

如果主电源掉电,该器件仍可继续提供精确的计时和温度,性能不受影响。

当主电源重新加电或电压值返回到容许范围内时,片上复位功能可用来重新启动系统微处理器。

Device Name Extremely Accurate Real-TIme Clock_TCXO_CrystalPackage Size 16-Pin,300 mil SOICOperaTIng V oltage (V)2.3 to 5.5TImekeeping Accuracy (over temp)3ppm (-40 degrees Celsius to +85 degrees Celsius)1ppm (0 to +40 degrees Celsius)Current ConsumpTIon (A)1.5 (typ); 4.0 (max)在单片机系统设计中,对系统的抗干扰设计、信号完整性设计、时序设计大都能引起关注;但对由于备用电池与系统电源上电或电源切换导致个别芯片的时序不稳定,引起不能正常工作或启动的问题,很多设计者还是认识不清。

ds3231测试程序

ds3231测试程序
Mtemp1 = IIC_Read(DS3231_MINUTE); //分
CurrentTime.Min = BCD2HEX(Mtemp1);
Stemp1 = IIC_Read(DS3231_SECOND); //秒
CurrentTime.Sec = BCD2HEX(Stemp1);
}
void get_show_date(void)
TWCR = (1<<TWINT) |(1<<TWEN);
while (!(TWCR & (1<<TWINT))); //等待结束
if((TWSR & 0xF8) != MT_SLA_ACK)
ERROR();
TWDR = addr; //发送地址
TWCR = (1<<TWINT) |(1<<TWEN);
//Delay(1);
}
unsigned char BCD2HEX(unsigned char val) //BCD转换为Byte
{
unsigned char temp;
temp = val & 0x0f; //用4位二进制数来表示1位十进制数中的0~9这10个数码
val>>=4;
val &= 0x0f;
USART1_char_Send(0x30 + ge);
USART1_char_Send('_');
shi = TimeCurrent.Min/10;
ge = TimeCurrent.Min%10;
USART1_char_Send(0x30 + shi);
USART1_char_Send(0x30 + ge);

单片机与高精度时钟芯片DS3231的接口应用【VIP专享】

单片机与高精度时钟芯片DS3231的接口应用【VIP专享】

普及型时钟一年。

这对有相对精确时钟要求的应。

该的寄存器能保存秒、分、时、星期、小时提供两个可编程日历闹钟和一路可双向串[3]. DS3231时钟芯片结构如图1所示,DS3231的主要组成部分有8个模块,划分为4个功能组:TCXO、电源控制、按钮复位和RTC。

1.32 kHz的TCXOTCXO包括温度传感器、振荡器和控制逻辑。

控制器读取片上温度传感器输出,使用查表法确定所需的电容,加上AGE寄存器的老化修正。

然后设置电容选择寄存器。

仅在温度变化或者用户启动的温度转换完成时,才加载包括AGE寄存器变化的新值。

VCC初次上电时就会读取温度值,然后每隔64 s读取一次。

2.DS3231的内部寄存器及功能DS3231寄存器地址为00h~12h,分别用于存放秒、分、时、星期、日期及闹钟设置信息。

在多字节访问期间,如果地址达到RAM空间的结尾12h处,将发生卷绕,此时定位到开始位置即00h单元。

DS3231的时间和日历信息通过读取相应的寄存器来设置和初始化。

用户辅助缓冲区用于防止内部寄存器更新时可能出现的错误。

读取时间和日历寄存器时,用户缓冲区在任何START条件下或者寄存器指针返回到零时与内部寄存器同步。

时间信息从这些辅助寄存器读取,此时时钟继续保持运行状态。

这样在读操作期间发生主寄存器更新时可以避免重新读取寄存器。

以控制寄存器(地址为0EH)为例,可以控制实时时钟、闹钟和方波输出。

其各bit定义如下表。

BIT7位:使能振荡器(EOEC)。

设定为逻辑0时,启动振荡器。

如果设定为逻辑1,在DS3231电源切换至VBAT时,振荡器停止。

初次上电时该位清零(逻辑0) 。

当DS3231由VCC供电时,振荡器与EOSC位的状态无关,始终保持工作状态。

BIT6位:电池备份的方波使能(BBSOW)。

当设定为逻辑1并且DS3231由VBAT引脚供电时,在没有加载VCC的情况下,该位使能方波输出。

当BB-SQW设定为逻辑0时,若VCC降至低于电源故障门限值,则INT/SQW引脚变为高阻抗。

基于DS3231的高精度时钟接口设计

基于DS3231的高精度时钟接口设计

基于DS3231的高精度时钟接口设计
方洁;陈伟
【期刊名称】《电子设计工程》
【年(卷),期】2010(018)002
【摘要】为避免电路系统在上电或断电后出现计时不准确的异常状况,提出采用高精度时钟芯片DS3231的解决方案.介绍DS3231的特点、工作原理以及引脚功能,设计其与微控制器进行通信时的软件、硬件接口,并给出相应的原理图与流程图.此方案对DS3231在一般的电路系统设计中具有通用性.由于DS3231是目前精度最高,并集成有温补振荡器和晶体的实时时钟芯片,因此该方案对那些对计时精度要求极高的应用具有一定的借鉴意义.
【总页数】2页(P134-135)
【作者】方洁;陈伟
【作者单位】武汉理工大学信息工程学院,湖北,武汉,430070;武汉理工大学信息工程学院,湖北,武汉,430070
【正文语种】中文
【中图分类】TN86;TP277
【相关文献】
1.超高精度实时时钟DS3231及其在多费率电能表中的应用 [J], 汪社民
2.AVR单片机与串行时钟器件DS3231的接口设计 [J], 高美珍;毛欲民;刘进军
3.基于DS3231的一种太阳能接收装置的时钟系统 [J], 赵玮;田辉
4.一种基于DS3231实现的高精度守时应用系统设计 [J], 昌畅;曾昱翔;汪国尧;罗剑;孙淼
5.高精度实时时钟SD2000ELP与单片机的接口设计和编程方法 [J], 刘军亮;王盛安;蔡树群
因版权原因,仅展示原文概要,查看原文内容请购买。

一种基于DS3231实现的高精度守时应用系统设计

一种基于DS3231实现的高精度守时应用系统设计

• 122•本文介绍了一种对守时指标要求较高的系统设计,提出了采用DS3231芯片,并结合软件时序流程控制的实现方法,从而较好地解决了基于高精度时间加密传输系统的守时问题,具有广泛的应用前景。

基于高精度时间加密传输系统在设计的过程中,需要考虑授时和守时两个方面的需求。

在满足授时条件的情况下,通过北斗授一种基于DS3231实现的高精度守时应用系统设计四川九洲电器集团有限责任公司 昌 畅 曾昱翔 汪国尧 罗 剑 孙 淼图2 系统硬件框图图1 系统授时守时流程时模块进行精准时间数据接收,并同步写入守时芯片,用于修正守时芯片的守时时间;当不满足授时条件的情况下,通过读取守时芯片内的守时时间,也能满足系统对时间精度的使用要求。

设计流程图如图1所示。

本系统硬件架构如图2所示。

守时芯片选用DS3231,芯片内部实现框图如图3所示。

该芯片支持双电源供电和I 2C配置接口,时钟精度 ≤ 6ppm ,待机模式工作电流≤10uA 。

以系统最大守时时间要求8h 计算,最大守时误差δ = 6×10-6 × 8 × 3600 = 0.1728s ,满足 ≤ 0.2s 的系统需求。

DS3231芯片内部关键寄存器描述如图4所示。

由图4所示,该芯片输出时间数据最小单位为秒,如果仅进行简单的寄存器读取,最大的读取误差将高达1s ,根本无法满足使用要求。

在FPGA 读取流程控制中,巧妙的利用DS3231内部闹钟机制,先读取一次时间数据<time1>,然后将<time1+2>秒作为闹钟计时写入DS3231,DS3231将在<time1+2>时刻产生闹钟中断信号INT ,FPGA 以此信号上升沿进行<time1+2>时间数据的加载,即可保证读取误差忽略不计。

FPGA 读取流程如图5所示。

目前,该设计已成功运用到多个产品中,经过不同环境条件下的反复使用表明,本文介绍的基于DS3231实现的高精度守时应用系统设计实现简单、成熟可靠,具有广泛的推广意义。

DS3231时钟芯片给文件系统提供时间问题

DS3231时钟芯片给文件系统提供时间问题

DS3231高精度时钟芯片自己跟单片机通过IIC总线通信,c8051f500单片机自带IIC通信接口,但本次实验中,我采用了通过I/O口模拟IIC总线方法。

出现问题:1.IIC通信本身有时序要求,但改变内部晶振大小后,依然可以正常通信,即数码管正常点亮。

2.在换为外部晶振时,程序总是停止在while((OSCXCN&0x80)==0)?原因是PORT_I/O_Init()没有在OSCILLATOR_init()之前初始化。

3.文件系统通过函数DWORD get_fattime()来给创建的文件提供日期时间。

1) DWORD tmr= 0x34c9a9a1;总共32位2) DWORD tmr=885587968;二者是相等的3) year=0x34;month=0xc9;DWORD tmr=((DWORD)(year)<<24) | ((DWORD)(month)<<16);4) DWORD tmr=((DWORD)(2006-1980)<<25) | (DWORD)(6)<<21) | ((DWORD)(9)<<16) | (DWORD)(0x0f)<<11) | ((DWORD)(0x15)<<5) | (DWORD)(53)>>1); // 2006. 6 .9, 15: 21: 525) DWORD tmr=((DWORD)(Year0+20)<<25) | (DWORD)(Month0)<<21) | ((DWORD)(Day0)<<16) | (DWORD)(Hour0)<<11) | ((DWORD)(Minute0)<<5) | (DWORD)(Second0)>>1); // 2014这里的Year0,Month0,Day0,Hour0。

发个DS3231的简易时钟,1602液晶显示、串口修改时间

发个DS3231的简易时钟,1602液晶显示、串口修改时间

发个DS3231的简易时钟,1602液晶显示、串口修改时间来极客工坊学习一个多月了,收获很大。

以前学过单片机,加上论坛里的各位前辈无私的奉献,现在学arduino很快上手,十分感谢极客工坊这个大家庭。

最近买了一块DS3231时钟模块,测试了3天,发现走时非常准确,一秒不差。

以前学单片机时用ds1302做过一个简易时钟,一天的误差在5秒左右,需要经常去校时。

来上个照片在论坛里搜索了一下关于DS3231的应用,发现不是很多,就打算将原来ds1302的程序移植到arduino上,但是将时钟芯片换成DS3231。

因为DS3231走时比较准确,不需要经常校时,打算程序里去除用按键修改时间的程序部分。

改为用串口发送字符串来修改时间。

另外,我个人认为桌面时钟就是看时间用的,加上闹钟的功能并不实用。

所以程序里也没有闹钟的功能。

简单介绍一下DS3231:1、I2C接口;2、实时时钟产生秒、分、时、星期、日期、月和年计时,并提供有效期到2100年的闰年补偿;3、两个日历闹钟;4、内部集成了一个数字温度传感器采用4线接法,顺便盗个图UNO 与 1602液晶连接6 -> D77 -> D68 -> D59 -> D410 -> EN11 -> RW12 -> RS顺便盗个图UNO 与 DS3231连接A4 -> SDAA5 -> SCL**************************************** 程序部分 ********************************************ARDUINO 代码1.#include <DS3231.h>2.#include <Wire.h>3.4.DS3231 Clock;5.bool Century=false;6.bool h12;7.bool PM;8.byte ADay, AHour, AMinute, ASecond, ABits;9.bool ADy, A12h, Apm;10.11.int year, month, date, DoW,week , hour, minute, second,temperature;12.13.String comdata = "";14.int numdata[7] = {0}, mark = 0;15./*1602液晶与UNO连接引脚16. 6 -> D717.7 -> D618.8 -> D519.9 -> D420.*/21.22.int LCD1602_RS=12;23.int LCD1602_RW=11;24.int LCD1602_EN=10;25.int DB[] = {6, 7, 8, 9};26.27.char dis1[16]={0},dis2[16]={0};28.29.char self_char[]={//1602液晶自定义符号30.0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02, //年31.0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x01, //月32.0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00, //日33.0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00, //温度标志——摄氏度34.0x00,0x04,0x0E,0x1F,0x0E,0x04,0x00,0x00, //符号◆35.0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, //全开36.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //37.0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 //38.};39.40.void LCD_Command_Write(int command)//写指令41.{42.int i,temp;43.digitalWrite( LCD1602_RS,LOW);44.digitalWrite( LCD1602_RW,LOW);45.digitalWrite( LCD1602_EN,LOW);46.47.temp=command & 0xf0;48.for(i=DB[0]; i <= 9; i++)49.{50.digitalWrite(i,temp & 0x80);51.temp <<= 1;52.}53.54.digitalWrite( LCD1602_EN,HIGH);55.delayMicroseconds(1);56.digitalWrite( LCD1602_EN,LOW);57.58.temp=(command & 0x0f)<<4;59.for(i=DB[0]; i <= 9; i++)60.{62.temp <<= 1;63.}64.65.digitalWrite( LCD1602_EN,HIGH);66.delayMicroseconds(1);67.digitalWrite( LCD1602_EN,LOW);68.}69.70.void LCD_Data_Write(int dat)//写数据71.{72.int i=0,temp;73.digitalWrite( LCD1602_RS,HIGH);74.digitalWrite( LCD1602_RW,LOW);75.digitalWrite( LCD1602_EN,LOW);76.77.temp=dat & 0xf0;78.for(i=DB[0]; i <= 9; i++)79.{80.digitalWrite(i,temp & 0x80);81.temp <<= 1;82.}83.84.digitalWrite( LCD1602_EN,HIGH);85.delayMicroseconds(1);86.digitalWrite( LCD1602_EN,LOW);87.88.temp=(dat & 0x0f)<<4;89.for(i=DB[0]; i <= 9; i++)90.{92.temp <<= 1;93.}94.95.digitalWrite( LCD1602_EN,HIGH);96.delayMicroseconds(1);97.digitalWrite( LCD1602_EN,LOW);98.}99.100.void LCD_SET_XY(int x, int y )//指定坐标,x为列,0~15,y为行,0为第一行,1为第二行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

模块参数:1.尺寸:38mm(长)*22mm(宽)*14mm(高)2.重量:8g3.工作电压:3.3--5.5V4.时钟芯片:高精度时钟芯片DS32315.时钟精度:0-40℃范围内,精度2ppm,年误差约1分钟6.带2个日历闹钟7.可编程方波输出8.实时时钟产生秒、分、时、星期、日期、月和年计时,并提供有效期到2100年的闰年补偿9.芯片内部自带温度传感器,精度为±3℃10.存储芯片:AT24C32(存储容量32K)11.IIC总线接口,最高传输速度400KHz(工作电压为5V时)12.可级联其它IIC设备,24C32地址可通过短路A0/A1/A2修改,默认地址为0x5713.带可充电电池LIR2032,保证系统断电后,时钟任然正常走动接线说明,以Arduino uno r3为例:SCL→A5SDA→A4VCC→5VGND→GND代码部分:#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit SDA=P3^6;//模拟I2C数据传送位SDAsbit SCL=P3^7;//模拟I2C时钟控制位SCLsbit INT=P3^2;sbit RESET=P3^3;sbit led0=P1^0;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit led4=P1^4;sbit led5=P1^5;sbit led6=P1^6;sbit led7=P1^7;bit ack;//应答标志位#define DS3231_WriteAddress 0xD0//器件写地址#define DS3231_ReadAddress0xD1//器件读地址#define DS3231_SECOND0x00//秒#define DS3231_MINUTE0x01//分#define DS3231_HOUR0x02//时#define DS3231_WEEK0x03//星期#define DS3231_DAY0x04//日#define DS3231_MONTH0x05//月#define DS3231_YEAR0x06//年//闹铃1#define DS3231_SALARM1ECOND 0x07//秒#define DS3231_ALARM1MINUTE 0x08//分#define DS3231_ALARM1HOUR0x09//时#define DS3231_ALARM1WEEK0x0A//星期/日//闹铃2#define DS3231_ALARM2MINUTE 0x0b//分#define DS3231_ALARM2HOUR0x0c//时#define DS3231_ALARM2WEEK0x0d//星期/日#define DS3231_CONTROL0x0e//控制寄存器#define DS3231_STATUS0x0f//状态寄存器#define BSY2//忙#define OSF7//振荡器停止标志#define DS3231_XTAL0x10//晶体老化寄存器#define DS3231_TEMPERATUREH 0x11//温度寄存器高字节(8位)#define DS3231_TEMPERATUREL 0x12//温度寄存器低字节(高2位)uchar code dis_code[11]={0xc0,0xf9,0xa4,0xb0,// 0,1,2,30x99,0x92,0x82,0xf8,0x80,0x90, 0xff};//4,5,6,7,8,9,offuchar data dis_buf[8];uchar data dis_index;uchar data dis_digit;uchar BCD2HEX(uchar val)//BCD转换为Byte{uchar temp;temp=val&0x0f;val>>=4;val&=0x0f;val*=10;temp+=val;return temp;}uchar HEX2BCD(uchar val)//B码转换为BCD码{uchar i,j,k;i=val/10;j=val;k=j+(i<<4);return k;}void delayus(uint us){while (us--);}void Start_I2C(){SDA=1;//发送起始条件的数据信号delayus(1);SCL=1;delayus(5);//起始条件建立时间大于4.7us,延时SDA=0;//发送起始信号delayus(5);// 起始条件锁定时间大于4μsSCL=0;//钳住I2C总线,准备发送或接收数据delayus(2);}void Stop_I2C(){SDA=0;//发送结束条件的数据信号delayus(1);//发送结束条件的时钟信号SCL=1;//结束条件建立时间大于4usdelayus(5);SDA=1;//发送I2C总线结束信号delayus(4);}void SendByte(uchar c){uchar BitCnt;for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位{if((c<<BitCnt)&0x80)SDA=1;//判断发送位elseSDA=0;delayus(1);SCL=1;//置时钟线为高,通知被控器开始接收数据位delayus(5);//保证时钟高电平周期大于4μsSCL=0;}delayus(2);SDA=1;//8位发送完后释放数据线,准备接收应答位delayus(2);SCL=1;delayus(3);if(SDA==1)ack=0;elseack=1;//判断是否接收到应答信号SCL=0;delayus(2);}uchar RcvByte(){uchar retc;uchar BitCnt;retc=0;SDA=1;//置数据线为输入方式for(BitCnt=0;BitCnt<8;BitCnt++){delayus(1);SCL=0;//置时钟线为低,准备接收数据位delayus(5);//时钟低电平周期大于4.7μsSCL=1;//置时钟线为高使数据线上数据有效delayus(3);retc=retc<<1;if(SDA==1)retc=retc+1;//读数据位,接收的数据位放入retc中delayus(2);}SCL=0;delayus(2);return(retc);}void Ack_I2C(bit a){if(a==0)SDA=0;//在此发出应答或非应答信号elseSDA=1;delayus(3);SCL=1;delayus(5);//时钟低电平周期大于4μsSCL=0;//清时钟线,钳住I2C总线以便继续接收delayus(2);}uchar write_byte(uchar addr, uchar write_data){Start_I2C();SendByte(DS3231_WriteAddress);return 0;SendByte(addr);if (ack == 0)return 0;SendByte(write_data);if (ack == 0)return 0;Stop_I2C();delayus(10);return 1;}uchar read_current(){uchar read_data;Start_I2C();SendByte(DS3231_ReadAddress);if(ack==0)return(0);read_data = RcvByte();Ack_I2C(1);Stop_I2C();return read_data;}uchar read_random(uchar random_addr) {Start_I2C();SendByte(DS3231_WriteAddress);return(0);SendByte(random_addr);if(ack==0)return(0);return(read_current());}void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec) {uchar temp=0;temp=HEX2BCD(yea);write_byte(DS3231_YEAR,temp);//修改年temp=HEX2BCD(mon);write_byte(DS3231_MONTH,temp);//修改月temp=HEX2BCD(da);write_byte(DS3231_DAY,temp);//修改日temp=HEX2BCD(hou);write_byte(DS3231_HOUR,temp);//修改时temp=HEX2BCD(min);write_byte(DS3231_MINUTE,temp); //修改分temp=HEX2BCD(sec);write_byte(DS3231_SECOND,temp); //修改秒}void TimeDisplay(uchar Dhour,uchar Dmin,uchar Dsec){dis_buf[7]=dis_code[Dhour / 10];// 时十位dis_buf[6]=dis_code[Dhour % 10];// 时个位dis_buf[4]=dis_code[Dmin / 10];// 分十位dis_buf[3]=dis_code[Dmin % 10];// 分个位dis_buf[1]=dis_code[Dsec / 10];// 秒十位dis_buf[0]=dis_code[Dsec % 10];// 秒个位dis_buf[2]=0xbf;// 显示"-"dis_buf[5]=0xbf;}void DateDisplay(uchar Dyear,uchar Dmonth,uchar Dday){dis_buf[7]=dis_code[Dyear / 10];// 年十位dis_buf[6]=dis_code[Dyear % 10];// 年个位dis_buf[4]=dis_code[Dmonth / 10];// 月十位dis_buf[3]=dis_code[Dmonth % 10];// 月个位dis_buf[1]=dis_code[Dday / 10];// 天十位dis_buf[0]=dis_code[Dday % 10];// 天个位dis_buf[2]=0xbf;// 显示"-"dis_buf[5]=0xbf;}void get_show_time(void){uchar Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;Htemp1=read_random(DS3231_HOUR);//时24小时制Htemp1&=0x3f;Htemp2=BCD2HEX(Htemp1);Mtemp1=read_random(DS3231_MINUTE);//分Mtemp2=BCD2HEX(Mtemp1);Stemp1=read_random(DS3231_SECOND);//秒Stemp2=BCD2HEX(Stemp1);TimeDisplay(Htemp2,Mtemp2,Stemp2);}void get_show_date(void){uchar Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;Ytemp1=read_random(DS3231_YEAR);//年Ytemp2=BCD2HEX(Ytemp1);Mtemp1=read_random(DS3231_MONTH);//月Mtemp2=BCD2HEX(Mtemp1);Dtemp1=read_random(DS3231_DAY);//日Dtemp2=BCD2HEX(Dtemp1);DateDisplay(Ytemp2,Mtemp2,Dtemp2);}void get_show_Temperature(void){uchar Ttemp1,Ttemp2,Ttemp3,Ttemp4;Ttemp1=read_random(DS3231_TEMPERATUREH);//温度高字节Ttemp2=BCD2HEX(Ttemp1);Ttemp3=read_random(DS3231_TEMPERATUREL);//温度低字节Ttemp4=BCD2HEX(Ttemp3);DateDisplay(0,Ttemp2,Ttemp4);}void timer0() interrupt 1{TH0=0xFC;TL0=0x17;P2=0xff;// 先关闭所有数码管P0=dis_buf[dis_index];// 显示代码传送到P0口P2=dis_digit;if (dis_digit & 0x80)dis_digit=(dis_digit << 1) | 0x1;elsedis_digit=(dis_digit << 1);dis_index++;dis_index&=0x07;// 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描}void main(){uint ii = 0;RESET=0x1;//DS3231复位操作,正常操作下不需要每次都复位delayus(5000);led0=0;led1=0;led2=0;led3=0;led4=0;P0=0xff;P2=0xff;dis_digit=0xfe;dis_index=0;TimeDisplay(12, 5, 18);TMOD=0x11;// 定时器0, 1工作模式1, 16位定时方式TH0=0xFC;TL0=0x17;TCON=0x01;IE=0x82;// 使能timer0,1 中断TR0=1;if (write_byte(DS3231_CONTROL, 0x1C) == 0)led0=1;if (write_byte(DS3231_STATUS, 0x00) == 0)led1=1;ModifyTime(10,6,13,15,30,00);//初始化时钟,2010/6/13,15/30/00//小时采用24小时制while(1){//get_show_date();//显示日期//get_show_Temperature();//显示温度get_show_time();//显示时间delayus(50000);}}。

相关文档
最新文档