单片机:实现数码管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的数字。通过控制数码管的段码和位选择,我们可以显示任意数字。该项目不仅实现了数码管的基本显示功能,还通过延时函数和控制逻辑避免了显示的闪烁问题。

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

相关推荐
zcy8496443711 分钟前
40 基于单片机的温湿度检测判断系统
单片机·嵌入式硬件
夜间看花1 小时前
49 基于单片机的湿度和光照监测
单片机·嵌入式硬件
石板小湫2 小时前
53 基于单片机的8路抢答器加记分
java·数据库·单片机
夜间去看海2 小时前
67 基于单片机的温湿度、烟雾、阈值切换、状态灯、串口收发
单片机·嵌入式硬件·串口·温湿度·状态灯
美式小田2 小时前
硬件工程师面试题 1-10
嵌入式硬件·面试·硬件工程师
小猪写代码2 小时前
STM32进阶 FSMC应用案例:扩展外部 SRAM
stm32·单片机·嵌入式硬件
lucy153027510793 小时前
D7000 低电压立体声手机功放电路芯片,电源纹波抑制比高静态电流低,内置节电模式开关和静噪开关 外接元件少所需外围元件少
单片机·嵌入式硬件·智能手机·音视频·便携式视盘播放器·cd-rom·便携式迷你播放器
youk1103 小时前
STM32之HAL例程-FreeRTOS任务调度流程
stm32·单片机·嵌入式硬件
物联高科4 小时前
电机驱动,为什么不需要变速器?
单片机·嵌入式硬件·物联网·能源·创业创新