单片机:实现数码管00盗99显示(附带源码)

单片机实现数码管00到99显示

在嵌入式开发中,数码管是最常用的显示设备之一,特别适合用于显示数字信息。本项目的目标是利用8051单片机控制数码管实现数字显示,从00到99的循环显示。我们将通过按键或定时器来控制数字的增减,并通过数码管来显示数字。

一、项目需求

  1. 显示功能:在数码管上显示00到99之间的数字,并能循环显示。
  2. 控制功能:通过按键或者定时器的触发来更新数码管上的显示。
  3. 数码管连接:使用共阳数码管或共阴数码管显示数字。

二、系统设计

2.1 数码管显示原理

数码管由7个LED段组成,可以通过点亮不同的LED来显示数字。每个数码管的数字显示都可以通过指定不同的段码来实现。例如,数字0对应的段码为0x3F,数字1对应的段码为0x06,依此类推。

我们使用4位数码管显示两位数字,其中每一位显示0-9的数字,通过切换不同的显示位置,来显示一个完整的00-99范围内的数字。

2.2 硬件设计
  1. 单片机:使用8051单片机(如AT89C51)。
  2. 数码管:使用2位数码管,分别显示十位和个位数字。
  3. 按键控制:通过按键或定时器控制数字的增减。
2.3 软件设计
  • 数码管驱动:通过控制数码管的段选择和位选择来实现数字显示。
  • 数字更新:通过计数器控制数字的增减。
  • 按键控制:通过按键触发增减操作。

三、程序设计

3.1 数码管的段码定义

首先,我们需要定义每个数字的段码。常见的7段数码管(共阳或共阴)段码如下:

数字 段码 (0x3F)
0 0x3F
1 0x06
2 0xB6
3 0x76
4 0xEE
5 0x7A
6 0xFA
7 0x06
8 0xFE
9 0x7E

其中,每个数字对应一个7段数码管的段码,我们将这些段码存储在数组中,便于后续的数字显示。

3.2 主程序框架
  1. 初始化数码管和按键。
  2. 控制数字的增减(按键控制或定时器中断)。
  3. 显示当前数字。
3.3 完整代码实现
cpp 复制代码
#include <reg51.h>  // 包含8051单片机的寄存器定义

// 数码管段码(共阴数码管)
unsigned char code digit_code[] = {
    0x3F, // 0
    0x06, // 1
    0xB6, // 2
    0x76, // 3
    0xEE, // 4
    0x7A, // 5
    0xFA, // 6
    0x06, // 7
    0xFE, // 8
    0x7E  // 9
};

// 数码管连接端口
#define DIGIT1 P0  // 十位数码管连接到P0口
#define DIGIT2 P1  // 个位数码管连接到P1口

// 定义数码管选择信号
#define SELECT_DIGIT1 P2_0  // 控制十位数码管
#define SELECT_DIGIT2 P2_1  // 控制个位数码管

// 当前数字
unsigned char tens = 0;  // 十位
unsigned char ones = 0;  // 个位

// 延时函数(用来调整数码管刷新时间)
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++) {
        for (j = 0; j < 120; j++) {
            // 空循环,产生延时
        }
    }
}

// 数码管显示函数
void display_number(unsigned char tens, unsigned char ones) {
    // 显示十位
    DIGIT1 = digit_code[tens];  // 显示十位数
    SELECT_DIGIT1 = 0;  // 激活十位数码管
    delay_ms(5);        // 延时,避免闪烁
    SELECT_DIGIT1 = 1;  // 关闭十位数码管

    // 显示个位
    DIGIT2 = digit_code[ones];  // 显示个位数
    SELECT_DIGIT2 = 0;  // 激活个位数码管
    delay_ms(5);        // 延时,避免闪烁
    SELECT_DIGIT2 = 1;  // 关闭个位数码管
}

// 主程序
void main() {
    while (1) {
        // 循环显示00到99
        for (tens = 0; tens < 10; tens++) {
            for (ones = 0; ones < 10; ones++) {
                display_number(tens, ones);  // 显示当前数字
                delay_ms(500);  // 延时500ms,每秒更新一次
            }
        }
    }
}

四、程序说明

  1. 数码管段码定义

    • digit_code[]数组存储了0到9的数字对应的段码。每个数字的段码对应7个LED的开关状态。
  2. 数码管显示函数

    • display_number(unsigned char tens, unsigned char ones)函数将十位和个位的数字分别显示在两个数码管上。通过控制不同的数码管位和段码来实现数字显示。
  3. 任务调度

    • 主程序中的for循环从00到99循环显示,通过更新tensones变量来显示不同的数字。
  4. 延时函数

    • delay_ms()用于延时,调整数码管的刷新时间。为了避免数码管闪烁,刷新时间不宜过短。

五、总结

通过本项目,我们使用8051单片机控制数码管显示00到99的数字。通过控制数码管的段码和位选择,我们可以显示任意数字。该项目不仅实现了数码管的基本显示功能,还通过延时函数和控制逻辑避免了显示的闪烁问题。

如果需要增加更多的功能,例如通过按键控制数字的增减,或者通过外部输入改变显示内容,可以在此基础上进一步扩展。

相关推荐
代码游侠8 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
CODECOLLECT12 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen13 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠15 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_15 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技18 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计18 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
小龙报19 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业19 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能19 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微