51单片机倒计时程序:使用定时器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; }
}
代码解释:
#include <REGX51.H>:包含了51单片机的寄存器定义和函数声明等头文件。#define uchar unsigned char:定义了一个无符号字符类型uchar,用于表示0~255的数。uchar code discode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};:定义了一个无符号字符类型的常量数组discode,每个元素表示一个数字的七段数码管编码。uchar timer=0;:定义了一个无符号字符类型的变量timer,用于计时。uchar second=60;:定义了一个无符号字符类型的变量second,用于表示倒计时剩余秒数,初始值为60。uchar key=0;:定义了一个无符号字符类型的变量key,暂未使用。void main():主函数。TMOD=0x01;:设置定时器0的工作方式,为模式1(16位定时器,仅用TR0控制计数器的启动和停止)。ET0=1;:开启定时器0中断。EA=1;:开启总中断。P0=discode[second/10];:将P0口输出倒计时剩余秒数的十位数码管编码。P2=discode[second%10];:将P2口输出倒计时剩余秒数的个位数码管编码。void int_T0()interrupt 1 using 0:定义定时器0中断服务函数。TR0=0;:停止定时器0。TH0=0xee;:设置定时器0的计数初值为0xee00,即65536-62500,使定时器0在1秒后溢出。TL0=0x00;:设置定时器0的低8位计数初值为0x00。timer++;:计时器加1。if(timer==200):如果计时器达到200,即1秒钟。timer=0;:计时器清零。second--;:倒计时秒数减1。P0=discode[second/10];:将P0口输出倒计时剩余秒数的十位数码管编码。P2=discode[second%10];:将P2口输出倒计时剩余秒数的个位数码管编码。if(second==0):如果倒计时秒数为0。TR0=0;:停止定时器0。second=0;:倒计时秒数清零。
程序运行结果:
在数码管上显示从60开始的倒计时,每秒数码管显示的数字减1,倒计时结束后数码管显示00。
原文地址: https://www.cveoy.top/t/topic/nyEa 著作权归作者所有。请勿转载和采集!