时钟芯片DS3231程序I2C,留下记录避坑

看资料书有些操作你觉得不合理,但实际却是合理地

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都可以执行,仅供参考。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值