#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; }

}

代码解释:

  1. #include <REGX51.H>:包含了51单片机的寄存器定义和函数声明等头文件。
  2. #define uchar unsigned char:定义了一个无符号字符类型uchar,用于表示0~255的数。
  3. uchar code discode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};:定义了一个无符号字符类型的常量数组discode,每个元素表示一个数字的七段数码管编码。
  4. uchar timer=0;:定义了一个无符号字符类型的变量timer,用于计时。
  5. uchar second=60;:定义了一个无符号字符类型的变量second,用于表示倒计时剩余秒数,初始值为60。
  6. uchar key=0;:定义了一个无符号字符类型的变量key,暂未使用。
  7. void main():主函数。
  8. TMOD=0x01;:设置定时器0的工作方式,为模式1(16位定时器,仅用TR0控制计数器的启动和停止)。
  9. ET0=1;:开启定时器0中断。
  10. EA=1;:开启总中断。
  11. P0=discode[second/10];:将P0口输出倒计时剩余秒数的十位数码管编码。
  12. P2=discode[second%10];:将P2口输出倒计时剩余秒数的个位数码管编码。
  13. void int_T0()interrupt 1 using 0:定义定时器0中断服务函数。
  14. TR0=0;:停止定时器0。
  15. TH0=0xee;:设置定时器0的计数初值为0xee00,即65536-62500,使定时器0在1秒后溢出。
  16. TL0=0x00;:设置定时器0的低8位计数初值为0x00。
  17. timer++;:计时器加1。
  18. if(timer==200):如果计时器达到200,即1秒钟。
  19. timer=0;:计时器清零。
  20. second--;:倒计时秒数减1。
  21. P0=discode[second/10];:将P0口输出倒计时剩余秒数的十位数码管编码。
  22. P2=discode[second%10];:将P2口输出倒计时剩余秒数的个位数码管编码。
  23. if(second==0):如果倒计时秒数为0。
  24. TR0=0;:停止定时器0。
  25. second=0;:倒计时秒数清零。

程序运行结果:

在数码管上显示从60开始的倒计时,每秒数码管显示的数字减1,倒计时结束后数码管显示00。

51单片机倒计时程序:使用定时器0实现秒级倒计时

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

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