Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 阿杜伊诺闰秒钟_C_Arduino - Fatal编程技术网

C 阿杜伊诺闰秒钟

C 阿杜伊诺闰秒钟,c,arduino,C,Arduino,基本上,我正在编写一段简单的代码,每秒钟递增一次,并显示时间和日期,这让我很沮丧,我确信我忽略了一些显而易见的事情 因此,我将时间显示为MJD(修改的朱利安日期)HH:MM:SS,但也允许硬编码的MJD表示闰秒事件,然后正确显示闰秒 它有点有效,但它跳过了23:59:59 我最终计划移植到普通的旧AVR,所以我真的不想和arduino库混在一起 int second = 0, minute = 0, hour = 0; long mjd = 55000; long leap = 55964;

基本上,我正在编写一段简单的代码,每秒钟递增一次,并显示时间和日期,这让我很沮丧,我确信我忽略了一些显而易见的事情

因此,我将时间显示为MJD(修改的朱利安日期)HH:MM:SS,但也允许硬编码的MJD表示闰秒事件,然后正确显示闰秒

它有点有效,但它跳过了23:59:59

我最终计划移植到普通的旧AVR,所以我真的不想和arduino库混在一起

int second = 0, minute = 0, hour = 0;
long mjd = 55000;
long leap = 55964;

void setup()
{
    Serial.begin(9600);
    Serial.print("MDJ ");
    Serial.print(mjd);
    Serial.print(" ");
    Serial.print(hour);
    Serial.print(":");
    Serial.print(minute);
    Serial.print(":");
    Serial.println(second);

}

void loop()
{
    second++;
    if (mjd == leap && hour == 23 && minute == 59 && second == 59) {
        second++;
    } else {
        if (second > 59) {
            minute++;
            second = 0; // reset seconds to zero
        }
    }
    if (minute > 59) {
        hour++;
        minute = 0;
    }

    if (hour > 23) {
        mjd++;
        hour = 0;
    }

    Serial.print("MDJ ");
    Serial.print(mjd);
    Serial.print(" ");
    if (hour < 10)
        Serial.print("0");
    Serial.print(hour);
    Serial.print(":");
    if (minute < 10)
        Serial.print("0");
    Serial.print(minute);
    Serial.print(":");
    if (second < 10)
        Serial.print("0");
    Serial.println(second);
    delay(1000);
}
int秒=0,分钟=0,小时=0;
长mjd=55000;
长跳跃=55964;
无效设置()
{
Serial.begin(9600);
连续打印(“MDJ”);
连续打印(mjd);
连续打印(“”);
连续打印(小时);
连续打印(“:”);
连续打印(分钟);
连续打印(“:”);
序列号println(第二);
}
void循环()
{
第二++;
如果(mjd==闰和时==23和分==59和秒==59){
第二++;
}否则{
如果(秒>59){
分钟++;
秒=0;//将秒数重置为零
}
}
如果(分钟>59){
小时++;
分钟=0;
}
如果(小时>23){
mjd++;
小时=0;
}
连续打印(“MDJ”);
连续打印(mjd);
连续打印(“”);
如果(小时<10)
连续打印(“0”);
连续打印(小时);
连续打印(“:”);
如果(分钟<10)
连续打印(“0”);
连续打印(分钟);
连续打印(“:”);
如果(秒<10)
连续打印(“0”);
序列号println(第二);
延迟(1000);
}

我想您可能只需要很小的改动:

if (mjd == leap && hour == 23 && minute == 59 && second == 60) {
    // allow 23:59:60
} else {
    ...
问题似乎是您增加到下一秒,然后如果是23:59:59,并且指示了闰秒,则再次增加到60(跳过59)


您可能要做的是滚动第二个,除非是闰秒。

当时间提前时,您将第二个增加太多次:23:59:58。输入函数,增加秒数,然后
second==59
测试也为真——因此,再次增加
second

second++;
if (mjd == leap && hour == 23 && minute == 59 && second == 59) {
    second++;

我不知道最干净的重新工作会是什么样子,但你只想在每次循环迭代中增加
一次。

当你说:它跳过23:59:59时。--你是说它每天都跳过这个时间吗?或者它只在闰秒那天跳过这个时间?它只在闰秒那天跳过,所以它会读23:59:58,然后读23:59:60,然后读00:00:00,但在其他任何一天它都会读58,59,00