#include <REGX51.H>

define uchar unsigned char uchar code discode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar timer=0; uchar second=60; uchar key=0; void main() { TMOD=0x01; ET0=1; EA=1;

P0=discode[second/10]; P2=discode[second%10]; } void int_T0()interrupt 1 using 0 { TR0=0; TH0=0xee; TL0=0x00; timer++; if(timer==200) { timer=0; second--; P0=discode[second/10]; P2=discode[second%10]; } if(second==0) { TR0=0; second=0; }

}

为什么代码从0-60计时,如何实现从60-0计时?

这是因为在定时器中断中,先将计时器减一,再将数码管显示数值更新。因此,计时器从60开始减,数码管显示数值也是从60开始更新,最终计时器减到0时,数码管显示数值也会变成0。

实现从60到0计时,可以将计时器初始值设为200,将数码管显示数值更新的部分放在计时器减一之后。

例如,在 int_T0 函数中,修改代码如下:

void int_T0()interrupt 1 using 0
{
  TR0=0;
  TH0=0xee;
  TL0=0x00;
  timer++;
  if(timer==200)
  {
    timer=0;
    second--;
    // 将数码管显示数值更新放在这里
    P0=discode[second/10];
    P2=discode[second%10];
  }
  if(second==0)
  {
    TR0=0;
    second=0;
  }
  
}

这样修改后,计时器从200开始减,直到减到0时,数码管显示的数值已经更新到了0,从而实现了从60到0的倒计时。

51单片机定时器实现倒计时功能:从60到0的正确代码

原文地址: https://www.cveoy.top/t/topic/nyCH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录