51单片机定时器实现倒计时功能:从60到0的正确代码
#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的倒计时。
原文地址: https://www.cveoy.top/t/topic/nyCH 著作权归作者所有。请勿转载和采集!