看资料书有些操作你觉得不合理,但实际却是合理地
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];
/***********************************************************
函数名称:DS3231_Write
函数功能:DS3231 I2C写操作
说 明:addr设备地址 dat数据输入
修改记录:
备注:
***********************************************************/
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();
}
/***********************************************************
函数名称:DS3231_Read
函数功能:DS3231 I2C读操作
出口参数:返回1字节数据
说 明:addr设备地址
修改记录:
备注:
***********************************************************/
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;
}
/***********************************************************
函数名称:RTC_WriteConfig
函数功能:DS3231 年月日时分秒写入
说 明:
修改记录:
备注:
***********************************************************/
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]);
}
/***********************************************************
函数名称:RTC_Read
函数功能:DS3231 时间读取与转换
说 明:把读取的时间保存到当前时间数组,再把当前时间数组进行十进制转换输出
修改记录:
备注:
***********************************************************/
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都可以执行,仅供参考。