51单片机基础-静态数码管显示

第五章 驱动静态数码管显示

1. 导入

在掌握了LED与蜂鸣器的控制后,本章将引入一种更复杂的输出设备------数码管。数码管能够显示数字和部分字符,广泛应用于电子钟、计数器、仪表等场合。

本章聚焦于静态数码管显示,即每个数码管的段选线独立控制,不采用动态扫描方式。通过本章学习,你将掌握:

  • 数码管的结构与工作原理;
  • 共阴极与共阳极数码管的驱动方法;
  • 如何通过单片机I/O口输出特定段码以显示数字;
  • 实现数字0~9的静态显示;
  • 为后续学习动态扫描、多位显示打下基础。

2. 硬件设计

2.1 数码管结构

最常见的数码管为7段数码管 (含a、b、c、d、e、f、g七段)和8段数码管(加一个小数点dp)。

引脚排列通常为双列直插形式,共10个引脚(含两个公共端)。

2.2 数码管类型

类型 公共端 特点
共阴极(Common Cathode) 所有LED阴极连在一起接GND 段选线输入高电平点亮对应段
共阳极(Common Anode) 所有LED阳极连在一起接VCC 段选线输入低电平点亮对应段

本章以共阴极数码管为例。

2.3 引脚识别

使用万用表"二极管档"识别数码管引脚:

  1. 找公共端:若某引脚与其他多个引脚导通且红笔接该脚时亮,则为共阴极公共端;
  2. 确认a~g及dp段对应引脚。

2.4 电路连接

假设使用共阴极数码管,段选线(a~g, dp)连接到P0口:

数码管段 连接单片机引脚
a P0.0
b P0.1
c P0.2
d P0.3
e P0.4
f P0.5
g P0.6
dp P0.7

公共端(COM)接地(GND)。

注意:P0口为开漏输出,必须外接上拉电阻(10kΩ排阻)或使用驱动芯片。


3. 软件设计

3.1 段码编码原理

要显示某个数字,需点亮特定段。例如:

  • 显示"0":a、b、c、d、e、f 亮 → g灭 → 0x3F(共阴极)
  • 显示"1":b、c 亮 → 0x06
  • 显示"2":a、b、d、e、g 亮 → 0x5B
共阴极数码管段码表(a~g, dp 对应 P0.0 ~ P0.7)
数字 段码(十六进制) 说明
0 0x3F abcdef
1 0x06 bc
2 0x5B abged
3 0x4F abgcd
4 0x66 fgbc
5 0x6D afgcd
6 0x7D afgcde
7 0x07 abc
8 0x7F abcdefg
9 0x6F abcdfg

段码计算方式:假设 a=P0.0, b=P0.1, ..., g=P0.6, dp=P0.7,则"0"对应二进制 00111111 = 0x3F

3.2 定义段码数组

c 复制代码
#include <reg52.h>

// 共阴极段码表
unsigned char code seg_code[] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

使用 code 关键字将数据存入程序存储器(Flash),节省RAM。

3.3 简单静态显示"8"

c 复制代码
void main() {
    P0 = seg_code[8];  // 显示数字8
    while(1);          // 保持
}

若P0接的是a~g段,则显示"8"。


3.4 循环显示0~9

c 复制代码
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 125; j++);
}

void main() {
    unsigned char i;
    while(1) {
        for (i = 0; i < 10; i++) {
            P0 = seg_code[i];    // 显示数字i
            delay_ms(500);       // 延时500ms
        }
    }
}

实现0~9依次显示,每秒切换一次。


3.5 显示带小数点的数字

若需显示"5.",即数字5加小数点亮:

c 复制代码
P0 = seg_code[5] | 0x80;  // 0x80 = 10000000,点亮dp

| 0x80 表示将P0.7置1(共阴极,高电平点亮dp)。


3.6 多位静态数码管显示(扩展)

若系统中有多个数码管,每个都独立连接到不同I/O口(如P0、P1、P2),则可分别控制。

例如:

  • 数码管1 → P0(显示十位)
  • 数码管2 → P1(显示个位)

显示数字"25":

c 复制代码
P0 = seg_code[2];  // 十位显示2
P1 = seg_code[5];  // 个位显示5

此为真正"静态显示",每个数码管持续点亮,无需扫描。


3.7 编译与下载

  • Keil中新建工程,包含代码;
  • 确保reg52.h正确;
  • 编译生成HEX文件;
  • 使用STC-ISP下载至单片机;
  • 观察数码管是否按预期显示数字。

若显示混乱:

  • 检查段选线连接是否错位;
  • 确认数码管是共阴还是共阳;
  • 若为共阳极,段码需取反:~seg_code[i]

4. 小结

本章通过驱动静态数码管,掌握了数字显示的基本原理与实现方法,主要内容包括:

  • 硬件连接:学会识别数码管类型与引脚,正确连接段选线与公共端;
  • 段码编码:理解a~g段与数字的关系,掌握共阴极与共阳极的编码差异;
  • 软件实现:使用数组存储段码,实现0~9循环显示;
  • 扩展能力:支持小数点显示与多位静态控制;
  • 开发流程:完成从设计、编码到烧录验证的全过程。

4.1 常见问题与解决

问题 原因 解决方法
数码管不亮 未供电、公共端未接地/接VCC 检查电源与公共端连接
显示乱码 段选线接错 对照段码表逐段测试
某段不亮 对应I/O未输出、线路断开 用万用表测电压
亮度低 P0口无上拉电阻 外接10kΩ上拉排阻
显示固定 程序未循环或跑飞 检查while(1)与延时函数

4.2 下一步学习建议

  • 学习动态数码管扫描,节省I/O资源;
  • 使用定时器实现精确显示刷新;
  • 实现计时器功能,结合数码管显示时间;
  • 引入按键,实现数字可调输入。

本章标志着你已掌握基本的数字显示能力,下一章将进入动态数码管扫描的学习,进一步提升显示控制水平。


相关推荐
bu_shuo4 小时前
单片机中经常定义的结构体解读
单片机·嵌入式硬件
00后程序员张4 小时前
Windows 安全分割利器:strtok_s () 详解
windows·单片机·安全
小莞尔5 小时前
【51单片机】【protues仿真】基于51单片机矩阵电子琴系统
单片机·嵌入式硬件
蜀黍@猿5 小时前
【GD32】软、硬件I2C对比
单片机·嵌入式硬件·mcu
@小张要努力5 小时前
STM32学习记录-0.1 STM32外设
stm32·嵌入式硬件·学习
哈泽尔都5 小时前
运动控制教学——5分钟学会PRM算法!
人工智能·单片机·算法·数学建模·贪心算法·机器人·无人机
代码会说话6 小时前
i2c通讯
android·linux·嵌入式硬件·嵌入式
qq_384049036 小时前
stm32第二天之基本定时器
stm32·单片机·嵌入式硬件