【问题标题】:8051 microcontroller lcd countdown timer8051单片机液晶倒计时定时器
【发布时间】:2015-02-06 07:20:31
【问题描述】:

目前我在我的液晶屏幕上遇到了一些问题。我正在尝试做一个倒数计时器,但是当我设置 Hour = 0,Min = 1 时,秒达到 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;
    }     

}

【问题讨论】:

    标签: c microcontroller 8051 keil


    【解决方案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
                }
    
            }
        }
    }
    

    【讨论】:

    • @Sunil, @FuFu Alex:请注意这里的示例有点错误。最后一个else 是错误的。那个点会迟到 1 个滴答声!检查“COUNTDOWN REACHED”必须减量完成之后,即在大 if 语句之后。
    • @nielsen,感谢您指出这一点。因此,在每个滴答声上,它都会像 3->2->1->0->"COUNTDOWN REACHED TO 0"。事实上,应该在外面和最上面的 if..else 之后检查“COUNTDOWN REACHED TO 0”。例如 if (milli_sec == 0 && second == 0 && minute == 0 && hour == 0 {//COUNTDOWN REACHED TO 0}
    • 感谢两位的解释。非常感谢。
    【解决方案2】:

    你的逻辑大错特错。 假设前提:

    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
         // ...
         // ....
      }
    }
    

    【讨论】:

      【解决方案3】:

      你有0H : 1M : 0S

      你检查秒,秒是零。你设置minutes = 0。 你检查分钟,现在是0。所以你从小时中减去1。小时已经为零。所以它可能会达到大约 65k。

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

      【讨论】:

      • 那我该怎么做呢?如果我转换为毫秒,它还能显示我的 hh:mm:ss 吗?
      猜你喜欢
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多