分数不多了,大家帮帮忙!PIC24FJ64GA306利用每次更换下次唤醒时间实现各个时间的闹钟,但是每次到凌晨第二天的时候,唤醒时间会出现6万多秒才能继续唤醒
佚名通过本文主要向大家介绍了分数不多了,大家帮帮忙!PIC24FJ64GA306利用每次更换下次唤醒时间实现各个时间的闹钟,但是每次到凌晨第二天的时候,唤醒时间会出现6万多秒才能继续唤醒等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 分数不多了,大家帮帮忙!PIC24FJ64GA306利用每次更换下次唤醒时间实现各个时间的闹钟,但是每次到凌晨第二天的时候,唤醒时间会出现6万多秒才能继续唤醒
描述:
问题如标题所述,本来设置每次唤醒间隔为15秒,在一天时间里可以持续进入闹钟中断,但是每次凌晨0点的时候,就会出现下一次唤醒在6万多秒以后,请问是什么原因呢?剩下的分数不多了,请大家帮下忙,卡着不知道那错了,谢谢!
程序如下:
unsigned long int xDate2Seconds(Xtime time)
{
static unsigned long int month[12]={
/*01?*/xDAY*(0),
/*02?*/xDAY*(31),
/*03?*/xDAY*(31+28),
/*04?*/xDAY*(31+28+31),
/*05?*/xDAY*(31+28+31+30),
/*06?*/xDAY*(31+28+31+30+31),
/*07?*/xDAY*(31+28+31+30+31+30),
/*08?*/xDAY*(31+28+31+30+31+30+31),
/*09?*/xDAY*(31+28+31+30+31+30+31+31),
/*10?*/xDAY*(31+28+31+30+31+30+31+31+30),
/*11?*/xDAY*(31+28+31+30+31+30+31+31+30+31),
/*12?*/xDAY*(31+28+31+30+31+30+31+31+30+31+30)
};
unsigned long int seconds = 0;
unsigned int year = 0;
year = time.year-1970;
seconds = xYEAR*year;
seconds += xDAY*((year+1)/4);
seconds += month[time.month-1];
if( (time.month > 2) && (((year+2)%4)==0) )
seconds += xDAY;
seconds += xDAY*(time.day-1);
seconds += xHOUR*(time.hour - 8);
seconds += xMINUTE*time.minute;
seconds += time.second;
return seconds;
}
/********************************************
************UTC时间转换为实际时间**************
********************************************/
void xSeconds2Date(unsigned long seconds,Xtime time )
{
static unsigned int month[12]={
/*01?*/31,
/*02?*/28,
/*03?*/31,
/*04?*/30,
/*05?*/31,
/*06?*/30,
/*07?*/31,
/*08?*/31,
/*09?*/30,
/*10?*/31,
/*11?*/30,
/*12?*/31
};
unsigned int days;
unsigned short leap_y_count;
time.second = seconds % 60;
seconds /= 60;
time.minute = seconds % 60;
seconds += 8 * 60 ;
seconds /= 60;
time.hour = seconds % 24;
days = seconds / 24;
leap_y_count = (days + 365) / 1461;
if( ((days + 366) % 1461) == 0)
{//?????1?
time.year = 1970 + (days / 366);
time.month = 12;
time.day = 31;
return;
}
days -= leap_y_count;
time.year = 1970 + (days / 365);
days %= 365;
days = 01 + days;
if( (time.year % 4) == 0 )
{
if(days > 60)--days;
else
{
if(days == 60)
{
time.month = 2;
time.day = 29;
return;
}
}
}
for(time.month = 0;month[time.month] < days;time.month++)
{
days -= month[time.month];
}
++time.month;
time.day = days;
rtcc_time_from_server=time;
}
/****************************************
描述:
本帖最后由 cqqjj3887 于 2016-04-26 11:30:10 编辑
RTCC; 随意设置闹钟时间; 跨天唤醒
各位好:问题如标题所述,本来设置每次唤醒间隔为15秒,在一天时间里可以持续进入闹钟中断,但是每次凌晨0点的时候,就会出现下一次唤醒在6万多秒以后,请问是什么原因呢?剩下的分数不多了,请大家帮下忙,卡着不知道那错了,谢谢!
程序如下:
unsigned long int xDate2Seconds(Xtime time)
{
static unsigned long int month[12]={
/*01?*/xDAY*(0),
/*02?*/xDAY*(31),
/*03?*/xDAY*(31+28),
/*04?*/xDAY*(31+28+31),
/*05?*/xDAY*(31+28+31+30),
/*06?*/xDAY*(31+28+31+30+31),
/*07?*/xDAY*(31+28+31+30+31+30),
/*08?*/xDAY*(31+28+31+30+31+30+31),
/*09?*/xDAY*(31+28+31+30+31+30+31+31),
/*10?*/xDAY*(31+28+31+30+31+30+31+31+30),
/*11?*/xDAY*(31+28+31+30+31+30+31+31+30+31),
/*12?*/xDAY*(31+28+31+30+31+30+31+31+30+31+30)
};
unsigned long int seconds = 0;
unsigned int year = 0;
year = time.year-1970;
seconds = xYEAR*year;
seconds += xDAY*((year+1)/4);
seconds += month[time.month-1];
if( (time.month > 2) && (((year+2)%4)==0) )
seconds += xDAY;
seconds += xDAY*(time.day-1);
seconds += xHOUR*(time.hour - 8);
seconds += xMINUTE*time.minute;
seconds += time.second;
return seconds;
}
/********************************************
************UTC时间转换为实际时间**************
********************************************/
void xSeconds2Date(unsigned long seconds,Xtime time )
{
static unsigned int month[12]={
/*01?*/31,
/*02?*/28,
/*03?*/31,
/*04?*/30,
/*05?*/31,
/*06?*/30,
/*07?*/31,
/*08?*/31,
/*09?*/30,
/*10?*/31,
/*11?*/30,
/*12?*/31
};
unsigned int days;
unsigned short leap_y_count;
time.second = seconds % 60;
seconds /= 60;
time.minute = seconds % 60;
seconds += 8 * 60 ;
seconds /= 60;
time.hour = seconds % 24;
days = seconds / 24;
leap_y_count = (days + 365) / 1461;
if( ((days + 366) % 1461) == 0)
{//?????1?
time.year = 1970 + (days / 366);
time.month = 12;
time.day = 31;
return;
}
days -= leap_y_count;
time.year = 1970 + (days / 365);
days %= 365;
days = 01 + days;
if( (time.year % 4) == 0 )
{
if(days > 60)--days;
else
{
if(days == 60)
{
time.month = 2;
time.day = 29;
return;
}
}
}
for(time.month = 0;month[time.month] < days;time.month++)
{
days -= month[time.month];
}
++time.month;
time.day = days;
rtcc_time_from_server=time;
}
/****************************************