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

📄 rtc.c

📁 51单片机下的RTC程序
💻 C
字号:
/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  Copyright (c)  $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$												肖遥电子(广州)研发中心
$										Shawyoo Electronics (GuangZhou) R&D Center
$                       	http://www.shawyoo.com		 Email: autoele@qq.com
$								 QQ群:9069471/9069433/9524253		All rights reserved.	  
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  Copyright (c)  $$$$$$$$$$$$$$$$$$$$$$$$$$$ */
/*  
                                      文件描述
	文件名: 	 RTC.c
	功能描述:把日期时间变成秒,把秒变成日期时间格式
	编译环境:通用C编译器 
	目标CPU:  
	作者:
	创建时间:
	建议编辑环境:UltraEdit 11.00a+  制表符宽度为三个字符,程序可读性更好。
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/					  

#define		 	DEF_RTC			1
#define			RTC_GLOBALS		1
#include     	"RTC.h"

#include			<stdio.h>


/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
	平年中,每个月的天数.月是从1开始
*/
signed char code DayOfMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
	从START_YEAR开始,总计TOTAL_YEAR,每年的润年标志,润年为1,否则为0
	这个表是从2000年开始,共100年。不同年份要作相应修改。
*/
unsigned char code LeapYearFlag[100] = 
{
	1,0,0,0,	1,0,0,0,	1,0,0,0,	1,0,0,0,	1,0,0,0,
	1,0,0,0,	1,0,0,0,	1,0,0,0,	1,0,0,0,	1,0,0,0,
	1,0,0,0,	1,0,0,0,	1,0,0,0,	1,0,0,0,	1,0,0,0,
	1,0,0,0,	1,0,0,0,	1,0,0,0,	1,0,0,0,	1,0,0,0,
	1,0,0,0,	1,0,0,0,	1,0,0,0,	1,0,0,0,	1,0,0,0,
};



/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
   平年中,当月及前面月份的总天数
*/  
signed short code DayOfYear[13] = { 0,31,59,90,120,151,181,212,243,273,304,334,365  };  



/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
	函数名称:DateTimeToSecond
   功能描述:把日期和时间转换为秒(2000年1月1日0时0分0秒时刻为0秒)
   入口参数:RTC结构指针	          
   出口参数:秒
   全局变量: 无
   创建时间:2006-5-6 17:40
   修改时间:
*/ 
uint32			DateTimeToSecond(RTC_STR  *pRTC)
{
	uchar		i;
   int16  	LeapYear,wYear;
   uint32 	Day,Sec,ySec; 	
 	//////////////////////////////////////////	
	wYear = pRTC->wYear;
   wYear -= START_YEAR;		
	/////////////////////////////////// 计算出已过去的整年总共秒数
	for(i=0,ySec=0;i<wYear;i++)
	{
		ySec += ONE_YEAR_SECOND;
		if(LeapYearFlag[i])
			ySec += ONE_DAY_SECOND;
	}
	/////////////////////////////////// 计算出当年已过去的整天数
	LeapYear = LeapYearFlag[wYear];
	Day = DayOfYear[pRTC->Month-1];
	Day += pRTC->Day;
	Day -= 1;
	if((LeapYear!=0)&&(pRTC->Month>2))
		Day += 1;
	/////////////////////////////////// 计算出当天已过去的总秒数
	Sec = (pRTC->Hour)*3600L + (pRTC->Min)*60L + pRTC->Sec;
	Sec += ySec;
	Sec += (Day*ONE_DAY_SECOND);
	/////////////////////////////////// 
   return Sec;
}	// End of function <DateTimeToSecond>



/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
	函数名称:SecondToDateTime
   功能描述:把秒(2000年1月1日0时0分0秒时刻为0秒)转换为年月日时分秒
   入口参数:秒,RTC结构指针	          
   出口参数:成功标志,成功为OK,不成功为ERROR
   全局变量: 无
   创建时间:2006-5-6 17:40
   修改时间:
*/ 
uchar			SecondToDateTime(uint32	Second, RTC_STR  *pRTC)
{
	uchar		i,Month,Day;
   int16  	LeapYear,wYear;
   uint32 	Sec; 	
 	/////////////////////////////////// 计算出已过去的整年数
	for(i=0,wYear=0;i<TOTAL_YEAR;i++)
	{
		Sec = ONE_YEAR_SECOND;
		if(LeapYearFlag[i])
			Sec += ONE_DAY_SECOND;
		if(Second<Sec)	break;
		wYear++;
		Second -= Sec;
	}
	pRTC->Year = wYear;
	pRTC->wYear = wYear+START_YEAR;
	/////////////////////////////////// 计算出当年已过去的整月数
	LeapYear = LeapYearFlag[wYear];
	for(i=0,Month=1;i<12;i++)
	{
		Sec = DayOfMonth[i];
		Sec *= ONE_DAY_SECOND;
		if((LeapYear!=0)&&(Month==2))
			Sec += ONE_DAY_SECOND;
		if(Second<Sec)	break;
		Month++;
		Second -= Sec;
	}
	pRTC->Month = Month;
	/////////////////////////////////// 计算出当月已过去的整天数
	pRTC->Day = Second/ONE_DAY_SECOND;
	pRTC->Day += 1;
	/////////////////////////////////// 计算出当天已过去的整小时数
	Second %= ONE_DAY_SECOND;
	pRTC->Hour = Second/3600L;
	/////////////////////////////////// 计算出分钟、秒
	Second %= 3600L;
	pRTC->Min = Second/60;
	pRTC->Sec = Second%60;
	/////////////////////////////////// 星期
	wYear = pRTC->wYear;
	Month = pRTC->Month;
	Day   = pRTC->Day;
	if((Month==1)||(Month==2))
	{
  		Month += 12;
  		wYear--;
	}
	pRTC->Week = ((Day+2*Month+3*(Month+1)/5+wYear+wYear/4-wYear/100+wYear/400)+1)%7;
	return 0;
}			
	// End of function <SecondToDateTime>		




/*
 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  End of File $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
 */

⌨️ 快捷键说明

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