8051微控制器lcd倒数计时器

时间:2015-02-06 07:20:32

标签: c microcontroller 8051 keil

目前我在液晶屏上遇到了一些问题。我试着做一个倒数计时器,但是当我设置Hour = 0,Min = 1时,sec命中0,我的小时变成一个未知的角色,min = 59,sec = 59.我错过了什么?

void Timer1(void) interrupt 3
{
    TF1 = 0;
    TH1 = 0xB1;
    TL1 = 0XE0;
    cd_msec--;

    if(cd_msec == 0)
    {
        cd_msec = 99;
        cd_sec--;
    }
    if(cd_sec == 0)
    {
        cd_sec = 59;
        cd_min--;
    }
    if(cd_min == 0) 
    {
        cd_min = 59;
        cd_hour--;
    }
    if(cd_hour == 0)
    {
        cd_hour = 0;
    }
    if(cd_hour == 0 && cd_min == 0)
    {
        cd_hour = 0;
        cd_min = 0;
    }
    if(cd_hour == 0 && cd_min == 0 && cd_sec == 0)
    {
        cd_hour = 0;
        cd_min = 0;
        cd_sec = 0;
        cd_msec = 0;
    }     

}

3 个答案:

答案 0 :(得分:1)

你的逻辑非常错误。 假设前提条件:

cd_msec=1; cd_sec=1; cd_min=5;

当代码执行时,您将获得:

cd_msec=99; cd_sec=59; cd_min=4;

因此,单个刻度改变了倒计时超过1秒。

请记住,零是有效值!我建议您重写代码,以便在递减之前检查零

类似的东西:

if (cd_msec > 0) {
  cd_msec--;
}
else
{
  if (cd_sec > 0) {
    cd_sec--;
    cd_msec = 99; // Assummes 10ms ticks
  }
  else
  {
     // Handle case with both cd_msec and cd_sec being zero
     // ...
     // ....
  }
}

答案 1 :(得分:1)

我同意@nielsen的观点是错误的。您可以考虑采用以下方法在每毫秒刻度更新所有变量。

另外,考虑到你将设法获得16位变量,我已经将milli_sec指定为999。

if (milli_sec > 0)
{
    milli_sec--
} else {
    if (second > 0) {
        milli_sec = 999;
        second--;
    } else {
        if (minute > 0) {
            milli_sec = 999;
            second = 59
            minute--
        } else {
            if (hour > 0) {
                milli_sec = 999;
                second = 59;
                minute = 59;
                hour--
            }
            else {
                //COUNTDOWN REACHED TO 0
                //hour,minute,second,milli_second is zero
            }

        }
    }
}

答案 2 :(得分:0)

您有0H : 1M : 0S

你检查秒,秒是零。您设置了minutes = 0。 你检查分钟,现在是0。所以你从小时中减去1。小时数已经为零。所以它可能包含~65k左右。

恕我直言,最好只有msecs,只有在更新显示器时才转换为hours:minutes:seconds。(如果需要)。