#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>:包含 8051 单片机的头文件。该头文件包含了 8051 单片机的所有寄存器定义和宏定义,方便程序员使用这些资源。
  2. #define uchar unsigned char:定义一个无符号字符型变量类型为 uchar。这个宏定义简化了代码,使用 uchar 代替 unsigned char,使代码更加简洁易读。
  3. uchar code discode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};:定义一个常量数组 discode,用于存储数码管显示的数字对应的编码。这个数组存储了 0 到 9 的十进制数对应的数码管编码,用于控制数码管的显示。
  4. uchar timer=0;:定义一个无符号字符型变量 timer,用于计时。这个变量用于记录定时器溢出的次数,用于实现倒计时功能。
  5. uchar second=60;:定义一个无符号字符型变量 second,用于倒计时。这个变量用于存储倒计时的秒数。
  6. uchar key=0;:定义一个无符号字符型变量 key,暂未使用。这个变量可以用于后续的扩展功能,例如添加按键控制。
  7. void main():程序主函数,程序从这里开始执行。
  8. TMOD=0x01;:定时器模式寄存器赋值为 0x01,表示定时器 0 的工作模式为模式 1。模式 1 允许定时器 0 作为 16 位定时器,可以实现更长的计时。
  9. ET0=1;:打开定时器 0 的中断允许位。设置这个位表示允许定时器 0 溢出时触发中断。
  10. EA=1;:打开总中断允许位。设置这个位表示允许所有中断的发生。
  11. P0=discode[second/10];:将变量 second 的十位数码管显示的编码通过 P0 口输出。这行代码将 second 变量的十位数对应的编码从 discode 数组中取出,然后输出到 P0 口,控制十位数码管的显示。
  12. P2=discode[second%10];:将变量 second 的个位数码管显示的编码通过 P2 口输出。这行代码将 second 变量的个位数对应的编码从 discode 数组中取出,然后输出到 P2 口,控制个位数码管的显示。
  13. void int_T0()interrupt 1 using 0:定时器 0 的中断函数,当定时器 0 溢出时自动调用此函数。这个函数是定时器 0 溢出时会自动执行的函数,用于实现倒计时功能。
  14. TR0=0;:关闭定时器 0。在进入中断函数后,首先关闭定时器 0,避免在执行中断函数期间定时器继续计数。
  15. TH0=0xee;:将定时器 0 的高字节赋值为 0xee,定时器 0 的计数初值为 65536-0xee00=0x1200。这行代码设置了定时器 0 的计数初值,决定了定时器 0 溢出一次需要的时间。
  16. TL0=0x00;:将定时器 0 的低字节赋值为 0x00,定时器 0 的计数初值为 0x1200。这行代码与上一行代码共同设置了定时器 0 的计数初值。
  17. timer++;:计时器加 1。每当定时器 0 溢出一次,timer 变量就会加 1,用于记录定时器溢出的次数。
  18. if(timer==200):如果计时器 timer 等于 200。当 timer 等于 200 时,表示定时器已经溢出了 200 次,也就是一秒钟过去了。
  19. timer=0;:计时器 timer 归零。当 timer 等于 200 时,将其归零,开始新的计时。
  20. second--;:秒数减一。当 timer 等于 200 时,将 second 变量减 1,表示倒计时时间减少了一秒。
  21. P0=discode[second/10];:将变量 second 的十位数码管显示的编码通过 P0 口输出。这行代码更新了十位数码管的显示,显示当前的倒计时时间。
  22. P2=discode[second%10];:将变量 second 的个位数码管显示的编码通过 P2 口输出。这行代码更新了个位数码管的显示,显示当前的倒计时时间。
  23. if(second==0):如果倒计时结束。当 second 变量等于 0 时,表示倒计时结束。
  24. TR0=0;:关闭定时器 0。当倒计时结束时,关闭定时器 0,停止计数。
  25. second=0;:将变量 second 赋值为 0。当倒计时结束时,将 second 变量赋值为 0,停止显示倒计时时间。

代码实现步骤:

  1. 定义常量数组 discode,用于存储数码管显示的数字对应的编码。
  2. 定义变量 timer,用于计时。
  3. 定义变量 second,用于倒计时。
  4. 设置定时器 0 的工作模式和计数初值。
  5. 打开定时器 0 的中断允许位和总中断允许位。
  6. 在主函数中,初始化 P0 口和 P2 口,并根据 second 变量的值控制数码管显示初始时间。
  7. 在中断函数 int_T0 中,实现倒计时功能:
    • 每当定时器 0 溢出一次,计时器 timer 加 1。
    • 当计时器 timer 等于 200 时,表示一秒钟过去了,秒数 second 减 1,并更新数码管显示。
    • 当秒数 second 等于 0 时,表示倒计时结束,关闭定时器 0,并停止显示倒计时时间。

相关知识点:

  • 8051 单片机的定时器
  • 中断机制
  • 数码管驱动
  • C 语言编程
8051 单片机数码管倒计时程序代码详解

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

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