看资料书有些操作你觉得不合理,但实际却是合理地
DS3231.C
#include "DS3231.h"
//当前时间数组
unsigned char rtc_current[8] = {0x20,0x22,0x03,0x13,0x23,0x59,0x59,0x01};
//用于存储十六进制转十进制的数组
unsigned char rtc[15];
//修改时间数组
xdata unsigned char rtc_gaishijian[8] = {0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
xdata unsigned char rtc_gaishuzu[15];
//闹钟数组
xdata unsigned char alarm_clock[4] = {0x00,0x00,0x00,0x01};
xdata unsigned char alarm[8];
void DS3231_Write(unsigned char addr,unsigned char dat)
{
I2C_Start();
I2C_SendByte(0xD0);
I2C_ReadACK();
I2C_SendByte(addr);
I2C_ReadACK();
I2C_SendByte(dat);
I2C_ReadACK();
I2C_Stop();
}
unsigned char DS3231_Read(unsigned char addr)
{
unsigned char test=0x00;
I2C_Start();
I2C_SendByte(0xD0);
I2C_ReadACK();
I2C_SendByte(addr);
I2C_ReadACK();
I2C_Start();
I2C_SendByte(0xD1);
I2C_ReadACK();
test=I2C_ReadByte();
I2C_SendNAK();
I2C_Stop();
return I2CRXD;
}
void RTC_WriteConfig(void)
{
DS3231_Write(rtc_year,rtc_current[1]);
DS3231_Write(rtc_mon,rtc_current[2]);
DS3231_Write(rtc_date,rtc_current[3]);
DS3231_Write(rtc_hour,rtc_current[4]);
DS3231_Write(rtc_min,rtc_current[5]);
DS3231_Write(rtc_sec,rtc_current[6]);
DS3231_Write(rtc_week,rtc_current[7]);
}
void RTC_Read(void)
{
rtc_current[1]=DS3231_Read(rtc_year);
rtc_current[2]=DS3231_Read(rtc_mon);
rtc_current[3]=DS3231_Read(rtc_date);
rtc_current[4]=(DS3231_Read(rtc_hour)&0x3f);
rtc_current[5]=(DS3231_Read(rtc_min)&0x7f);
rtc_current[6]=(DS3231_Read(rtc_sec)&0x7f);
rtc_current[7]=DS3231_Read(rtc_week);
//-------年-------//
rtc[0] = ((rtc_current[0]&0xf0)>>4);
rtc[1] = (rtc_current[0]&0x0f);
rtc[2] = ((rtc_current[1]&0xf0)>>4);
rtc[3] = (rtc_current[1]&0x0f);
//-------月-------//
rtc[4] = ((rtc_current[2]&0xf0)>>4);
rtc[5] = (rtc_current[2]&0x0f);
//-------日-------//
rtc[6] = ((rtc_current[3]&0xf0)>>4);
rtc[7] = (rtc_current[3]&0x0f);
//-------时-------//
rtc[8] = ((rtc_current[4]&0xf0)>>4);
rtc[9] = (rtc_current[4]&0x0f);
//-------分-------//
rtc[10] = ((rtc_current[5]&0xf0)>>4);
rtc[11] = (rtc_current[5]&0x0f);
//-------秒-------//
rtc[12] = ((rtc_current[6]&0xf0)>>4);
rtc[13] = (rtc_current[6]&0x0f);
//--------------//
rtc[14] = (rtc_current[7]&0x0f);
}
void rtc_gaishuzu_Read(void)
{
//-------年-------//
rtc_gaishuzu[0] = ((rtc_gaishijian[0]&0xf0)>>4);
rtc_gaishuzu[1] = (rtc_gaishijian[0]&0x0f);
rtc_gaishuzu[2] = ((rtc_gaishijian[1]&0xf0)>>4);
rtc_gaishuzu[3] = (rtc_gaishijian[1]&0x0f);
//-------月-------//
rtc_gaishuzu[4] = ((rtc_gaishijian[2]&0xf0)>>4);
rtc_gaishuzu[5] = (rtc_gaishijian[2]&0x0f);
//-------日-------//
rtc_gaishuzu[6] = ((rtc_gaishijian[3]&0xf0)>>4);
rtc_gaishuzu[7] = (rtc_gaishijian[3]&0x0f);
//-------时-------//
rtc_gaishuzu[8] = ((rtc_gaishijian[4]&0xf0)>>4);
rtc_gaishuzu[9] = (rtc_gaishijian[4]&0x0f);
//-------分-------//
rtc_gaishuzu[10] = ((rtc_gaishijian[5]&0xf0)>>4);
rtc_gaishuzu[11] = (rtc_gaishijian[5]&0x0f);
//-------秒-------//
rtc_gaishuzu[12] = ((rtc_gaishijian[6]&0xf0)>>4);
rtc_gaishuzu[13] = (rtc_gaishijian[6]&0x0f);
//--------------//
rtc_gaishuzu[14] = (rtc_gaishijian[7]&0x0f);
}
void rtc_alarm_Read(void)
{
//-------时-------//
alarm[0] = ((alarm_clock[0]&0xf0)>>4);
alarm[1] = (alarm_clock[0]&0x0f);
//-------分-------//
alarm[2] = ((alarm_clock[1]&0xf0)>>4);
alarm[3] = (alarm_clock[1]&0x0f);
//-------秒-------//
alarm[4] = ((alarm_clock[2]&0xf0)>>4);
alarm[5] = (alarm_clock[2]&0x0f);
//--------------//
alarm[6] = (alarm_clock[3]&0x0f);
}
DS3231.H
//DS3231寄存器地址 ---------------- #define rtc_sec 0x00 #define rtc_min 0x01 #define rtc_hour 0x02 #define rtc_date 0x04 #define rtc_mon 0x05 #define rtc_year 0x06 #define rtc_week 0x03 //----------------------------------
重点是读程序,网上找不到对应的程序,程序stc和stm32都可以执行,仅供参考。



