DS3231高精度时钟模块程序.docx

上传人:b****4 文档编号:6011865 上传时间:2023-05-09 格式:DOCX 页数:16 大小:17.68KB
下载 相关 举报
DS3231高精度时钟模块程序.docx_第1页
第1页 / 共16页
DS3231高精度时钟模块程序.docx_第2页
第2页 / 共16页
DS3231高精度时钟模块程序.docx_第3页
第3页 / 共16页
DS3231高精度时钟模块程序.docx_第4页
第4页 / 共16页
DS3231高精度时钟模块程序.docx_第5页
第5页 / 共16页
DS3231高精度时钟模块程序.docx_第6页
第6页 / 共16页
DS3231高精度时钟模块程序.docx_第7页
第7页 / 共16页
DS3231高精度时钟模块程序.docx_第8页
第8页 / 共16页
DS3231高精度时钟模块程序.docx_第9页
第9页 / 共16页
DS3231高精度时钟模块程序.docx_第10页
第10页 / 共16页
DS3231高精度时钟模块程序.docx_第11页
第11页 / 共16页
DS3231高精度时钟模块程序.docx_第12页
第12页 / 共16页
DS3231高精度时钟模块程序.docx_第13页
第13页 / 共16页
DS3231高精度时钟模块程序.docx_第14页
第14页 / 共16页
DS3231高精度时钟模块程序.docx_第15页
第15页 / 共16页
DS3231高精度时钟模块程序.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

DS3231高精度时钟模块程序.docx

《DS3231高精度时钟模块程序.docx》由会员分享,可在线阅读,更多相关《DS3231高精度时钟模块程序.docx(16页珍藏版)》请在冰点文库上搜索。

DS3231高精度时钟模块程序.docx

DS3231高精度时钟模块程序

  模块参数:

  1.尺寸:

38mm(长)*22mm(宽)*14mm(高)

  2.重量:

8g

  3.工作电压:

3.3--5.5V

  4.时钟芯片:

高精度时钟芯片DS3231

  5.时钟精度:

0-40℃范围内,精度2ppm,年误差约1分钟

  6.带2个日历闹钟

  7.可编程方波输出

  8.实时时钟产生秒、分、时、星期、日期、月和年计时,并提供有效期到2100年的闰年补偿

  9.芯片内部自带温度传感器,精度为±3℃

  10.存储芯片:

AT24C32(存储容量32K)

  11.IIC总线接口,最高传输速度400KHz(工作电压为5V时)

  12.可级联其它IIC设备,24C32地址可通过短路A0/A1/A2修改,默认地址为0x57

  13.带可充电电池LIR2032,保证系统断电后,时钟任然正常走动

 

接线说明,以Arduinounor3为例:

  SCL→A5

  SDA→A4

  VCC→5V

  GND→GND

 

代码部分:

#include

#include

#defineuchar  unsignedchar  

#defineuint   unsignedint

sbitSDA=P3^6;    //模拟I2C数据传送位SDA        

sbitSCL=P3^7;    //模拟I2C时钟控制位SCL

sbitINT=P3^2;      

sbitRESET=P3^3;

sbitled0=P1^0;

sbitled1=P1^1;

sbitled2=P1^2;

sbitled3=P1^3;

sbitled4=P1^4;

sbitled5=P1^5;

sbitled6=P1^6;

sbitled7=P1^7;

bit ack;         //应答标志位

#defineDS3231_WriteAddress0xD0   //器件写地址 

#defineDS3231_ReadAddress 0xD1   //器件读地址

#defineDS3231_SECOND      0x00   //秒

#defineDS3231_MINUTE      0x01   //分

#defineDS3231_HOUR        0x02   //时

#defineDS3231_WEEK        0x03   //星期

#defineDS3231_DAY         0x04   //日

#defineDS3231_MONTH       0x05   //月

#defineDS3231_YEAR        0x06   //年

//闹铃1            

#defineDS3231_SALARM1ECOND0x07   //秒

#defineDS3231_ALARM1MINUTE0x08   //分

#defineDS3231_ALARM1HOUR  0x09   //时

#defineDS3231_ALARM1WEEK  0x0A   //星期/日

//闹铃2

#defineDS3231_ALARM2MINUTE0x0b   //分

#defineDS3231_ALARM2HOUR  0x0c   //时

#defineDS3231_ALARM2WEEK  0x0d   //星期/日

#defineDS3231_CONTROL     0x0e   //控制寄存器

#defineDS3231_STATUS      0x0f   //状态寄存器

#defineBSY                2      //忙

#defineOSF                7      //振荡器停止标志

#defineDS3231_XTAL        0x10   //晶体老化寄存器

#defineDS3231_TEMPERATUREH0x11   //温度寄存器高字节(8位)

#defineDS3231_TEMPERATUREL0x12   //温度寄存器低字节(高2位) 

 

ucharcodedis_code[11]={0xc0,0xf9,0xa4,0xb0,  //0,1,2,3

           0x99,0x92,0x82,0xf8,0x80,0x90,0xff};      //4,5,6,7,8,9,off

uchardatadis_buf[8];

uchardatadis_index;

uchardatadis_digit;

 

ucharBCD2HEX(ucharval)   //BCD转换为Byte

{

   uchartemp;

   temp=val&0x0f;

   val>>=4;

   val&=0x0f;

   val*=10;

   temp+=val;

   

   returntemp;

}

ucharHEX2BCD(ucharval)   //B码转换为BCD码

{

   uchari,j,k;

   i=val/10;

   j=val;

   k=j+(i<<4);

   returnk;

}

voiddelayus(uintus) 

{

   while(us--);

}

voidStart_I2C()

{

   SDA=1;                 //发送起始条件的数据信号

   delayus

(1);

   SCL=1;

   delayus(5);            //起始条件建立时间大于4.7us,延时

   

   SDA=0;                 //发送起始信号

   delayus(5);            //起始条件锁定时间大于4μs

       

   SCL=0;                 //钳住I2C总线,准备发送或接收数据

   delayus

(2);

}

voidStop_I2C()

{

   SDA=0;                 //发送结束条件的数据信号

   delayus

(1);            //发送结束条件的时钟信号

   SCL=1;                 //结束条件建立时间大于4us

   delayus(5);

   

   SDA=1;                 //发送I2C总线结束信号

   delayus(4);

}

voidSendByte(ucharc)

{

   ucharBitCnt;

   

   for(BitCnt=0;BitCnt<8;BitCnt++)        //要传送的数据长度为8位

   {

       if((c<

           SDA=1;                         //判断发送位

       else 

           SDA=0;               

         delayus

(1);

         SCL=1;                           //置时钟线为高,通知被控器开始接收数据位

         delayus(5);                      //保证时钟高电平周期大于4μs   

         SCL=0;

   }

   

   delayus

(2);

   SDA=1;                                 //8位发送完后释放数据线,准备接收应答位

   delayus

(2);  

   SCL=1;

   delayus(3);

   if(SDA==1)

       ack=0;    

   else

       ack=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μs

      

       SCL=1;                     //置时钟线为高使数据线上数据有效

       delayus(3);

       retc=retc<<1;

       if(SDA==1)

           retc=retc+1;           //读数据位,接收的数据位放入retc中

       delayus

(2);

  }

  SCL=0;

  delayus

(2);

  return(retc);

}

 

voidAck_I2C(bita)

{

 

   if(a==0)

       SDA=0;             //在此发出应答或非应答信号

   else

       SDA=1;

   delayus(3);     

   SCL=1;

   

   delayus(5);            //时钟低电平周期大于4μs

   

   SCL=0;                 //清时钟线,钳住I2C总线以便继续接收

   delayus

(2);   

}

 

ucharwrite_byte(ucharaddr,ucharwrite_data)

{

   Start_I2C();

   SendByte(DS3231_WriteAddress);

   if(ack==0)

       return0;

   

   SendByte(addr);   

   if(ack==0)

       return0;

   

   SendByte(write_data);

   if(ack==0)

       return0;

   

   Stop_I2C();

   delayus(10);      

   return1;

}

 

ucharread_current()

{

   ucharread_data;

   Start_I2C();

   SendByte(DS3231_ReadAddress);

   if(ack==0)

       return(0);

   

   read_data=RcvByte();

   Ack_I2C

(1);

   Stop_I2C();

   returnread_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,ucharsec)

{

   uchartemp=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);//修改秒

}

 

voidTimeDisplay(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; 

}

 

 

voidDateDisplay(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;

}

 

 

voidget_show_time(void)

{

   ucharHtemp1,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);

}

 

voidget_show_date(void)

{

   ucharYtemp1,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);

}

 

 

voidget_show_Temperature(void)

{

   ucharTtemp1,Ttemp2,Ttemp3,Ttemp4; 

   

   Ttemp1=read_random(DS3231_TEMPERATUREH);   //温度高字节

   Ttemp2=BCD2HEX(Ttemp1);

   

   Ttemp3=read_random(DS3231_TEMPERATUREL);   //温度低字节

   Ttemp4=BCD2HEX(Ttemp3);

    

   DateDisplay(0,Ttemp2,Ttemp4);

}

 

 

voidtimer0()interrupt1

{

   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;

   else

       dis_digit=(dis_digit<<1);

   

   dis_index++;

   dis_index&=0x07;           //8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描

}

 

voidmain()

{

   uintii=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);

   }

   

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2