0 文章介绍

对应定时器/计数器案例目标的实现
用计数器中断0(P3^4)控制数码管段选
P1^6)控制数码位选

1 仿真图

在这里插入图片描述

2 效果图

在这里插入图片描述

3 不完整代码

复制该代码,其中有7个补充点,补充点1-3自己思考,补充点567见下方图片

#include <reg52.h>  // 包含51单片机特殊功能寄存器定义头文件

// 定义无符号整型类型别名
#define uint unsigned int
#define uchar unsigned char

// 数码管控制引脚定义
sbit dula = P3^4;    // 段选锁存器控制引脚(U2锁存器),控制显示内容
sbit wela = P1^6;    // 位选锁存器控制引脚(U3锁存器),控制显示位置

// 拆分后的时间显示变量(十位和个位)
uchar shi2, shi1;     // 小时十位、个位
uchar fen2, fen1;     // 分钟十位、个位
uchar miao2, miao1;   // 秒钟十位、个位

// 当前时间变量(初始为11:12:13)
uchar shi = 11;       // 当前小时
uchar fen = 12;       // 当前分钟
uchar miao = 13;      // 当前秒钟

uchar count;          // 定时器计数变量(用于每秒计时,50ms × 20 = 1秒)

// 数码管段码表(无小数点),按0~9的显示编码,连接至段选锁存器
uchar code tabledula[] = {
    【补充1};

// 数码管段码表(带小数点),用于显示冒号效果(通过点亮小数点位置)
uchar code tableduladian[] = {
    【补充2};

// 数码管位选码(控制哪一位被选中)
// 依次对应数码管第1位~第6位(从左到右)
// 注意:这些值为逐位取0,低电平有效(共阴极数码管常见)
uchar code tablewela[] = {
    【补充3};


// 简单延时函数(x 约等于 x 毫秒)
void delay(uchar x)
{
   【补充4}

// 数码管动态显示函数:依次点亮6位数码管,显示“时:分:秒”
void display(uchar shi2, uchar shi1, uchar fen2, uchar fen1, uchar miao2, uchar miao1)
{
    // 防止误触发,先清除锁存控制引脚
    wela = 0;
    dula = 0;

    // 显示第1位:小时的十位
    P0 = tablewela[0];     // 选中第1位
    wela = 1; wela = 0;    // 鎖存位选信号
    P0 = tabledula[shi2];  // 发送段码(无小数点)
    dula = 1; dula = 0;    // 鎖存段选信号
    delay(1);              // 稍作延时(防止闪烁)

    // 显示第2位:小时的个位(带小数点)
    P0 = tablewela[1];
    wela = 1; wela = 0;
    P0 = tableduladian[shi1]; // 段码带小数点(模拟冒号)
    dula = 1; dula = 0;
    delay(1);

    // 显示第3位:分钟的十位
    wela = 0; dula = 0;
    P0 = tablewela[2];
    wela = 1; wela = 0;
    P0 = tabledula[fen2];
    dula = 1; dula = 0;
    delay(1);

    // 显示第4位:分钟的个位(带小数点)
    P0 = tablewela[3];
    wela = 1; wela = 0;
    P0 = tableduladian[fen1]; // 带小数点,模拟冒号
    dula = 1; dula = 0;
    delay(1);

    // 显示第5位:秒钟的十位
    P0 = tablewela[4];
    wela = 1; wela = 0;
    P0 = tabledula[miao2];
    dula = 1; dula = 0;
    delay(1);

    // 显示第6位:秒钟的个位
    P0 = tablewela[5];
    wela = 1; wela = 0;
    P0 = tabledula[miao1];
    dula = 1; dula = 0;
    delay(1);
}

// 定时器0初始化函数(设置50ms中断)
void init()
{
    【补充5}

// 主函数:程序入口
void main()
{
    init();  // 初始化定时器
    while (1)
    {
        // 主循环中不断刷新6位数码管的显示内容
        display(shi2, shi1, fen2, fen1, miao2, miao1);
    }
}

// 定时器0中断服务函数(每50ms进入一次)
void time0() interrupt 1
{
    // 重装载定时器初值,确保下次50ms
   【补充6】

    count++; // 每50ms中断一次,累积20次为1秒
    if (count >= 20)
    {
        count = 0; // 归零计数
        miao++;    // 秒钟+1

        // 进位判断处理
        if (miao >= 60)
        {
            miao = 0;
            fen++; // 分钟+1

            if (fen >= 60)
            {
                fen = 0;
                shi++; // 小时+1

                if (shi >= 24)
                {
                    shi = 0; // 24小时制归零
                }
            }
        }
    }

    // 将当前时间变量拆分为“十位”和“个位”数字,以便送入数码管显示
    // 例如:shi = 11,将被拆为 shi2 = 1(十位),shi1 = 1(个位)
    //       miao = 13,将被拆为 miao2 = 1,miao1 = 3
    【补充7}


补充点567
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4 思考题

实现以下效果

在这里插入图片描述

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐