这是一个基于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 著作权归作者所有。请勿转载和采集!

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