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