51单片机时间戳相关函数-皇冠最新app版本

×
单片机 > 单片机程序设计 > 详情

51单片机时间戳相关函数

发布时间:2024-07-30 发布时间:
|

函数使用了long变量,比较占ram,单片机要是空间紧张就别用了,会把mcu算糊涂的。


/******* timestamp时间戳函数 开始**********/

#define  second_of_day  86400   //一天多少秒

idata uchar dayofmon[]={31,28,31,30,31,30,31,31,30,31,30,31};


/********************************************************************************************************


* functionname   : getsecondtime()
* description    : 日期格式转化为unix time
* entryparameter : 
* returnvalue    : 
********************************************************************************************************/


unsigned long getsecondtime(void)
{
idata uint ryear,i,cyear=0;
idata uchar rmon,rday,rhour,rmin,rsec;
  idata unsigned long countday = 0;


rsec =bcd_to_dec(rtc[6]);
rmin =bcd_to_dec(rtc[5]);
rhour =bcd_to_dec(rtc[4]);
rday =bcd_to_dec(rtc[2]);
rmon =bcd_to_dec(rtc[1]);
ryear= 2000 bcd_to_dec(rtc[0]);


for(i = 1970; i < ryear; i )
  {
     if(((i%4==0) && (i0!=0)) || (i@0==0))  cyear ;
  }
countday = cyear * 366 (ryear-1970-cyear) * 365;

for(i=1; i  {
    if((i==2) && (((ryear%4==0)&&(ryear0!=0)) || (ryear@0==0)))
            countday = 29;
    else
      countday = dayofmon[i-1];
  }


  countday = (rday-1);
  countday = countday*second_of_day (unsigned long)rhour*3600 (unsigned long)rmin*60 rsec;
  countday = countday - 8*3600;//北京时间转化为世界时间
  return countday;

}




/********************************************************************************************************
* functionname   : getdatetimefromsecond()
* description    : unix time转化为常用格式
* entryparameter : 
* returnvalue    : 
********************************************************************************************************/
void getdatetimefromsecond(unsigned long lsec)
{
uint i,j,iday;
idata unsigned long lday;




lsec = lsec 8*3600;//转换为北京时间

  lday = lsec / second_of_day;        
  lsec = lsec % second_of_day;
   i = 1970;
  while(lday > 365)
  {
if(((i%4==0) && (i0!=0)) || (i@0==0))//闰年
{
lday -= 366;
}else
{
lday -= 365;
}
i ;
  }
  if((lday == 365) && !(((i%4==0)&&(i0!=0)) || (i@0==0)))
  {
    lday -= 365;
    i ;
  }


  rtc[0] = i-2000;//年份
  for(j=0;j<12;j )  
  {
if((j==1) && (((i%4==0)&&(i0!=0)) || (i@0==0)))
{
iday = 29;
}else
{
iday = dayofmon[j];
}
    if(lday >= iday)
{
lday -= iday;
}
    else
{
break;
}
}
rtc[1] = j 1;  //月
     rtc[2] = lday 1;//日
     rtc[4] = ((lsec / 3600))$;  //时
     rtc[5] = (lsec % 3600) / 60;  //分
     rtc[6] = (lsec % 3600) % 60;  //秒



}



『本文转载自网络,皇冠最新app版本的版权归原作者所有,如有侵权请联系删除』

热门文章 更多
stm32问题记录:这回keil编译器背锅
网站地图