8051单片机数码管显示时间代码 - 详细解析及实现
这是一个基于8051单片机的数码管显示时间的代码,使用了定时器和中断控制,可以在4个数码管上同时显示小时和分钟。代码如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示段码表
uchar hour, minute; // 当前时间的小时和分钟数
uchar display[4]; // 数码管显示的内容,分别为:小时的十位,小时的个位,分钟的十位,分钟的个位
void delay(uint i) // 延时函数
{
while(i--);
}
void init() // 初始化函数
{
TMOD = 0x01; // 定时器0工作在模式1(16位定时器)下
TH0 = 0xfc; // 定时器0初始值为65536-50000=15536,即50ms
TL0 = 0x00;
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
TR0 = 1; // 启动定时器0
}
void display_time() // 数码管显示函数
{
display[0] = hour / 10; // 分解小时的十位数
display[1] = hour % 10; // 分解小时的个位数
display[2] = minute / 10; // 分解分钟的十位数
display[3] = minute % 10; // 分解分钟的个位数
P2 = 0xff; // 关闭所有数码管
P0 = table[display[0]]; // 显示小时的十位数
P2 = 0xfe; // 打开第一个数码管,即显示小时的十位数
delay(1000); // 延时1ms
P2 = 0xff; // 关闭所有数码管
P0 = table[display[1]]; // 显示小时的个位数
P2 = 0xfd; // 打开第二个数码管,即显示小时的个位数
delay(1000); // 延时1ms
P2 = 0xff; // 关闭所有数码管
P0 = table[display[2]]; // 显示分钟的十位数
P2 = 0xfb; // 打开第三个数码管,即显示分钟的十位数
delay(1000); // 延时1ms
P2 = 0xff; // 关闭所有数码管
P0 = table[display[3]]; // 显示分钟的个位数
P2 = 0xf7; // 打开第四个数码管,即显示分钟的个位数
delay(1000); // 延时1ms
}
void main()
{
init(); // 初始化
hour = 12; // 初始时间为12:00
minute = 0;
while(1)
{
display_time(); // 数码管显示当前时间
}
}
void timer0() interrupt 1 // 定时器0中断服务函数,每50ms进入一次
{
static uchar cnt = 0; // 静态变量,用于计数
TH0 = 0xfc; // 重置定时器0初始值
TL0 = 0x00;
cnt++; // 计数器+1
if(cnt == 20) // 如果计数器到达20,即1s
{
cnt = 0; // 计数器清零
minute++; // 分钟数+1
if(minute == 60) // 如果分钟数到达60,即1小时
{
minute = 0; // 分钟数清零
hour++; // 小时数+1
if(hour == 24) // 如果小时数到达24,即一天结束
{
hour = 0; // 小时数清零
}
}
}
}
代码中使用了定时器0和中断控制,每50ms进入一次定时器0中断服务函数,计数器累加,每当计数器到达20时,即1s,分钟数加1,如果分钟数到达60,则分钟数清零,小时数加1,如果小时数到达24,则小时数清零,这样就实现了时间的计算。同时,数码管的显示通过函数display_time()实现,将当前小时和分钟分解成十位和个位,然后依次在4个数码管上显示出来。
功能特点:
- 使用定时器0和中断控制实现实时时间计数
- 分解小时和分钟,并依次显示在4个数码管上
- 代码清晰易懂,并附带详细注释,适合初学者学习
应用场景:
- 简单的时钟设计
- 需要显示时间的其他嵌入式系统
学习价值:
- 学习8051单片机的定时器和中断使用
- 学习数码管显示控制方法
- 掌握时间计数和显示的程序设计技巧
原文地址: https://www.cveoy.top/t/topic/l3aU 著作权归作者所有。请勿转载和采集!