DS3231高精度时钟模块程序 -.z.模块参数: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修改,默认地址为0*57 13.带可充电电池LIR2032,保证系统断电后,时钟任然正常走动接线说明,以Arduinounor3为例:SCL→A5SDA→A4VCC→5VGND→GND代码部分:*include<reg51.h> *include<intrins.h>*defineucharunsignedchar*defineuintunsignedintsbitSDA=P3^6;//模拟I2C数据传送位SDAsbitSCL=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;bitack;//应答标志位*defineDS3231_WriteAddress0*D0//器件写地址*defineDS3231_ReadAddress0*D1//器件读地址*defineDS3231_SECOND0*00//秒*defineDS3231_MINUTE0*01//分*defineDS3231_HOUR0*02//时*defineDS3231_WEEK0*03//星期*defineDS3231_DAY0*04//日*defineDS3231_MONTH0*05//月*defineDS3231_YEAR0*06//年//闹铃1*defineDS3231_SALARM1ECOND0*07//秒*defineDS3231_ALARM1MINUTE0*08//分*defineDS3231_ALARM1HOUR0*09//时*defineDS3231_ALARM1WEEK0*0A//星期/日//闹铃2 *defineDS3231_ALARM2MINUTE0*0b//分*defineDS3231_ALARM2HOUR0*0c//时*defineDS3231_ALARM2WEEK0*0d//星期/日*defineDS3231_CONTROL0*0e//控制寄存器*defineDS3231_STATUS0*0f//状态寄存器*defineBSY2//忙*defineOSF7//振荡器停止标志*defineDS3231_*TAL0*10//晶体老化寄存器*defineDS3231_TEMPERATUREH0*11//温度寄存器高字节(8位) *defineDS3231_TEMPERATUREL0*12//温度寄存器低字节(高2位)ucharcodedis_code[11]={0*c0,0*f9,0*a4,0*b0,//0,1,2,3 0*99,0*92,0*82,0*f8,0*80,0*90,0*ff};//4,5,6,7,8,9,offuchardatadis_buf[8]; uchardatadis_inde*; uchardatadis_digit;ucharBCD2HE*(ucharval)//BCD转换为Byte { uchartemp; temp=val&0*0f; val>>=4; val&=0*0f; val*=10; temp+=val; returntemp; } ucharHE*2BCD(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) { ucharBitt; for(Bitt=0;Bitt<8;Bitt++)//要传送的数据长度为8位{ if((c<<Bitt)&0*80) 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;else ack=1;//判断是否接收到应答信号SCL=0; delayus(2); } ucharRcvByte() { ucharretc; ucharBitt; retc=0; SDA=1;//置数据线为输入方式for(Bitt=0;Bitt<8;Bitt++) { 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=HE*2BCD(yea); write_byte(DS3231_YEAR,temp);//修改年temp=HE*2BCD(mon); write_byte(DS3231_MONTH,temp);//修改月temp=HE*2BCD(da); write_byte(DS3231_DAY,temp);//修改日temp=HE*2BCD(hou); write_byte(DS3231_HOUR,temp);//修改时temp=HE*2BCD(min); write_byte(DS3231_MINUTE,temp);//修改分temp=HE*2BCD(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]=0*bf;//显示”-” dis_buf[5]=0*bf; }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]=0*bf;//显示”-” dis_buf[5]=0*bf; }voidget_show_time(void) { ucharHtemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;Htemp1=read_random(DS3231_HOUR);//时24小时制Htemp1&=0*3f;Htemp2=BCD2HE*(Htemp1); Mtemp1=read_random(DS3231_MINUTE);//分Mtemp2=BCD2HE*(Mtemp1); Stemp1=read_random(DS3231_SECOND);//秒Stemp2=BCD2HE*(Stemp1); TimeDisplay(Htemp2,Mtemp2,Stemp2); }voidget_show_date(void) { ucharYtemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;Ytemp1=read_random(DS3231_YEAR);//年Ytemp2=BCD2HE*(Ytemp1); Mtemp1=read_random(DS3231_MONTH);//月Mtemp2=BCD2HE*(Mtemp1); Dtemp1=read_random(DS3231_DAY);//日Dtemp2=BCD2HE*(Dtemp1); DateDisplay(Ytemp2,Mtemp2,Dtemp2); }voidget_show_Temperature(void) { ucharTtemp1,Ttemp2,Ttemp3,Ttemp4;Ttemp1=read_random(DS3231_TEMPERATUREH);//温度高字节Ttemp2=BCD2HE*(Ttemp1); Ttemp3=read_random(DS3231_TEMPERATUREL);//温度低字节Ttemp4=BCD2HE*(Ttemp3); DateDisplay(0,Ttemp2,Ttemp4); }voidtimer0()interrupt1 { TH0=0*FC; TL0=0*17; P2=0*ff;//先关闭所有数码管P0=dis_buf[dis_inde*];//显示代码传送到P0口P2=dis_digit; if(dis_digit&0*80) dis_digit=(dis_digit<<1)|0*1; else dis_digit=(dis_digit<<1); dis_
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/68966.html