DS3231高精度时钟模块程序
低电平周期大于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); } void Ack_I2C(bit a) { if(a==0) SDA=0; //在此发出应答或非应答信号 else SDA=1; delayus(3); SCL=1; delayus(5); //时钟低电平周期大于4μs SCL=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; else dis_digit=(dis_digit < 1); dis_index++; dis_index&=0x07; // 8个数码管全部扫描完一遍之后
DS3231高精度时钟模块程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)