⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1307.c

📁 ds1307的程序
💻 C
字号:
//=====================================================================
//	ds1307.c
//=====================================================================
#define A_DS1307			0xd0

//===================================================================
//= 函数原型: int8 bcd2bin(int8 bcdval)
//= 参    数: 待转换的BCD码
//= 返 回 值: 转换后的BCD进制代码
//= 功    能: BCD => BIN
//===================================================================
int8 bcd2bin(int8 bcdval)
{
	int8 binval;
/*	
	if(bcdval >= 0x10)
	{
//		binval = 10*(bcdval>>4) + (bcdval&0x0f);
		binval = bcdval>>4;
		binval = 10*binval;
		binval = binval+(bcdval&0x0f);
	}
	else
		binval = bcdval;
*/
	binval = bcdval>>4;
	binval = 10*binval;
	binval = binval+(bcdval&0x0f);
		
	return binval;
}
/*
//===================================================================
//= 函数原型: int8 bin2bcd(int8 binval)
//= 参    数: 待转换的BIN码
//= 返 回 值: 转换后的BCD进制代码
//= 功    能: BIN => BCD
//===================================================================
int8 bin2bcd(int8 binval)
{
	int8 bcdval;
	
	if(binval >= 10)
		bcdval = ((binval/10) << 4) | (binval%10);
	else
		bcdval = binval;
		
	return bcdval;
}
*/
//===================================================================
//= 函数原型: int8 LeapYear(int8 year)
//= 参    数: 年份(0--99) bin码
//= 返 回 值: 1--闰年 0--平年
//= 功    能: 判断是否是闰年
//===================================================================
int8 LeapYear(int8 year)
{
	int16 inty;
	int8 leapy = 0;
	
	inty = year + 2000;
	
	if (((inty%4 == 0) && (inty%100 != 0)) || (inty%400 == 0))
		leapy = 1;

	return(leapy);	
}

//===================================================================
//= 函数原型: int8 GetNumDays(int8 year,int8 month)
//= 参    数: 年份 月份
//= 返 回 值: 该月的天数
//= 功    能: 判断某个月的天数
//===================================================================
int8 GetNumDays(int8 year,int8 month)
{
	int16 inty;
	int8 day;
	
	static char daytab[] = {31,28,31,30,31,30,31,31,30,31,30,31};
	inty = year + 2000;

	if (LeapYear(inty) && (month==2))
		day = 29;
	else
		day = daytab[month-1];
	
	return(day);
}
//===================================================================
//= 函数原型: bit RTCTimeSet(void)
//= 参    数: 无(全局变量gv_time_data[]传递参数)
//= 返 回 值: TRUE/FALSE
//= 功    能: 设置时间(写时间)
//===================================================================
int1 RTCTimeSet(void)
{
	unsigned char i,buf[7],retval;

	for (i=0;i<7;i++) buf[i] = gv_time_data[i];

	if (i2c_pkt_write(A_DS1307,RTC_SECOND,&buf[RTC_SECOND],3))
	{	
		i2c_pkt_write(A_DS1307,RTC_DATE,&buf[RTC_DATE],3);
		retval = 1;
	}
	else
		retval = 0;
		
	return retval;
	
}

//===================================================================
//= 函数原型: bit RTCTimeRead(void)
//= 参    数: 无(全局变量gv_time_data[]传递参数)
//= 返 回 值: TRUE/FALSE
//= 功    能: 取时间(读时间)
//===================================================================
int1 RTCTimeRead(void)
{
	unsigned char i,buf[7],retval;

	if (i2c_pkt_read(A_DS1307,RTC_SECOND,&buf[RTC_SECOND],3))
	{	
		i2c_pkt_read(A_DS1307,RTC_DAY,&buf[RTC_DAY],4);
		
		for (i=0;i<7;i++) 
			gv_time_data[i] = buf[i];					//二进制BCD码
		
		retval = 1;
	}
	else
		retval = 0;
		
	return retval;
}

//===================================================================
//= 函数原型: void InitDS1307(void)
//= 参    数: 无
//= 返 回 值: 无
//= 功    能: 初始化DS1307
//===================================================================
void InitDS1307(void)
{
	int8 i;
	int8 time_err = 0;

	if(!RTCTimeRead()) return;
	
//	i = Bin(10000000);
	i = 0x80;
	
	i2c_pkt_write(A_DS1307,RTC_CONTROL,&i,3);	// 写控制字
	
	for (i=0;i<7;i++) gv_time_data[i] = bcd2bin(gv_time_data[i]);

	if ((gv_time_data[RTC_SECOND] > 59) ||
	    (gv_time_data[RTC_MINUTE] > 59) ||
	    (gv_time_data[RTC_HOUR] > 23)) 
		time_err = 1;
		
	if ((gv_time_data[RTC_DATE] == 0) ||
		(gv_time_data[RTC_DATE] > GetNumDays(gv_time_data[RTC_YEAR],gv_time_data[RTC_MONTH])))
		time_err = 1;
	
	if ((gv_time_data[RTC_MONTH] == 0) ||
		(gv_time_data[RTC_MONTH] > 12))
		time_err = 1;
	
	if(time_err == 1)
	{
		gv_time_data[RTC_SECOND] = 1;						
		gv_time_data[RTC_MINUTE] = 1;						
		gv_time_data[RTC_HOUR] = 1;						
		gv_time_data[RTC_DATE] = 1;						
		gv_time_data[RTC_MONTH] = 1;						
		gv_time_data[RTC_YEAR] = 6;						
		time_err = 0;

		RTCTimeSet();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -