当前位置: 首页 > news >正文

51单片机-驱动静态数码管和动态数码管模块

本章概述思维导图:

51单片机驱动静态数码管和动态数码管模块

数码管简介

        数码管是一种由多个发光二极管(LED)封装而成的显示器件,通过控制各LED的亮灭组合来显示数字、字母及符号。其核心结构由7个或8个LED段组成,形状为“8”字形,广泛应用于电子设备、工业控制、消费电子等领域。数码管实物如下:

数码管有很多种我们应该如何区分呢?

按段数分类:

        七段数码管:由a、b、c、d、e、f、g七个LED段组成,可显示数组0-9及部分字母;

        八段数码管:在七段基础上增加一个小数点(DP),支持显示带小数的数字;

        十六段数码管:扩展至16个LED段,可显示更加复杂字符和符号;

按极性分类:

        共阴极数码管:所有LED的阴极连接至公共段(COM),阳极独立控制。当阳极接高电平时,对应段点亮;

        共阳极数码管:所有LED的阳极连接至公共段(COM),阴极独立控制。当阴极接低电平时,对应段点亮。

按显示方式分类:

        静态显示:每位数码管独立控制,占用I/O口多,但亮度高、无闪烁;

        动态显示:段选线并联,位选线分时控制,通过快速扫描实现稳定显示,节省I/0口;


数码管显示原理

        数码管其核心原理基于LED的发光特性,通过不同的段组合实现字符显示。以下是数码管显示段图:

观察数码管图可分析出是共阴极八段数码管段数为:a、b、c、d、e、f、g、dp;

实现段控制逻辑:

        每个LED段(a-g、dp)独立控制,通过MCU主控芯片的I/O口输出高低电平组合决定亮灭。

例如:

共阴极数码管显示数字:” 0 ”时,需点亮a、b、c、d、e、f段。MCU(P0~P5)就需输出高电平,MCU(P6、P7)输出低电平;换算二进制为:1111100,进行寄存器赋值操作为P0=0X3f;

共阳极数码管显示数字:” 0 ”时,需点亮a、b、c、d、e、f段。MCU(P0~P5)就需输出低电平,MCU(P6、P7)输出高电平;换算二进制为:00000011,进行寄存器赋值操作为P0=0XC0;

注意:因为数码管的段通常按顺序为:数码管的段通常按顺序排列为dp, g, f, e, d, c, b, a(从高位到低位)。如果段序与MCU引脚序的排列顺序相反观察如下数码管模块硬件电路图,导致需要将原始二进制位反转。就如我上述二进制转16进制时一样是进行反转的结果;

数码管静态显示原理

原理:每个段由独立I/O端口控制,或通过译码器(如BCD码译码器)驱动。

缺点:占用MCU的I/O端口多(如驱动4位数码管需32个端口),需增加译码器

静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持直到送入新字形码为止;

数码管动态显示原理

原理:所有数码管的段选线(a-g、dp)同名端连接,位选线(COM)独立控制。通过分时扫描,快速切换位选信号,利用视觉暂留(>24ms)实现稳定显示。

优点:节省I/O端口(如4位数码管仅需12个端口),功耗低。

实现方式:

        段选线发送字符编码至所有数码管。

        位选线依次选通每位数码管,控制显示位置。

        扫描速度需足够快(通常1-2ms/位),避免闪烁。

数码管硬件电路原理图分析

可观察图中有74HC245芯片和74HC138译码器、2个四位一体数码管(每个又可分为四个数码管)、两个排阻;


74HC245缓冲器:(段选功能驱动单个数码管的8个段控制亮灭)

        功能:增强MCU的P00-P07信号驱动能力,隔离负载对MCU的影响。

        关键连接:方向控制(DIR):接高电平(VCC),数据从A端(MCU)流向B端(数码管)。使能端(OE):接低电平(GND),保持芯片始终导通。


74HC138译码器:(位选功能一共8个数码管,具体选择那个数码管工作)

        功能:将3位二进制信号(P22-P24)转换为8路输出(Y0-Y7),每次仅选通一个数码管。就是MCU芯片的三个GPIO输出引脚可以通过译码器变成8个GPIO输出引脚;74HC138 通过 3 个输入引脚(A2, A1, A0) 接收二进制地址,将其解码为 8 个输出引脚(Y0-Y7) 中的一个低电平信号。

74HC138译码器真值表:输入与输出的对应关系

输入(A2A1A0)输出(Y7-Y0)选中引脚应用场景
00011111110Y0选中第1位数码管(LED1)
00111111101Y1选中第2位数码管(LED2)
01011111011Y2选中第3位数码管(LED3)
01111110111Y3选中第4位数码管(LED4)
10011101111Y4选中第5位数码管(LED5)
10111011111Y5选中第6位数码管(LED6)
11010111111Y6选中第7位数码管(LED7)
11101111111Y7选中第8位数码管(LED8)

        关键连接:输入端:A(P22)、B(P23)、C(P24);输出端:Y0-Y7分别接LED1-LED8的位选端(COM);使能端:G1接高电平(VCC),G2A/G2B接低电平(GND),确保译码器正常工作。


2个四位一体数码管:

     段选连接:a-g、dp段通过排阻RP3/RP4接74HC245的B0-B7端。

     位选连接:每个数码管的COM端接74HC138的Y0-Y7输出。


2个排阻

      功能:限制段选电流,防止LED过流损坏。


控制核心MCU:

 通过 P00-P07 端口输出段选信号(控制对应的数码管各段亮灭),P22-P24 端口输出位选信号(控制哪个数码管被点亮)。

驱动静态数码管模块和动态数码管软件设计

驱动静态数码管模块

驱动静态数码管直接控制MCU芯片的P0端口(P0.0~P0.7)输出高电平就可点亮数码管的对应段;

点亮0~F驱动编码示例:

P0=0x3f;//驱动静态数码管显示:0
P0=0x06;//驱动静态数码管显示:1
P0=0x5b;//驱动静态数码管显示:2
P0=0x4f;//驱动静态数码管显示:3
P0=0x66;//驱动静态数码管显示:4
P0=0x6d;//驱动静态数码管显示:5
P0=0x7c;//驱动静态数码管显示:6
P0=0x07;//驱动静态数码管显示:7
P0=0x7f;//驱动静态数码管显示:8
P0=0x67;//驱动静态数码管显示:9
P0=0x77;//驱动静态数码管显示:A
P0=0x7c;//驱动静态数码管显示:B
P0=0x39;//驱动静态数码管显示:C
P0=0x5e;//驱动静态数码管显示:D
P0=0x79;//驱动静态数码管显示:E
P0=0x71;//驱动静态数码管显示:F

代码示例:(1个数码管静态显示0~F)

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
void Delay_10us(u16 us)//延时函数:输入1大概延时时间为10us
{while(us--);
}u8	gsmg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极数码管
int main()															 
{int i=0;while(1){for(i=0;i<16;i++){P0=gsmg[i];Delay_10us(60000);Delay_10us(60000);}}
}

驱动静态数码管驱动效果展示:

静态数码管驱动效果展示


驱动动态数码管模块

驱动动态数码管的核心是通过74HC138译码器快速切换位选信号和74HC245缓冲区快速驱动段选信号,利用人眼视觉暂留效应实现稳定显示:

代码示例:(8个数码管显示:521.1314)

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit Y1=P2^2;//数码管138编译器输入1  
sbit Y2=P2^3;//数码管138编译器输入2
sbit Y3=P2^4;//数码管138编译器输入3
void Delay_10us(u16 us)//延时函数:输入1大概延时时间为10us
{while(us--);
}
u8	gsmg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极数码管
void smg_long(void)//动态数码管显示函数:显示20030107
{u8 j=0;for(j=0;j<8;j++){switch(j){case 0:Y3=0;Y2=0;Y1=0;P0=gsmg[4];break;case 1:Y3=0;Y2=0;Y1=1;P0=gsmg[1];break;case 2:Y3=0;Y2=1;Y1=0;P0=gsmg[3];break;case 3:Y3=0;Y2=1;Y1=1;P0=gsmg[1];break;case 4:Y3=1;Y2=0;Y1=0;P0=0x80;break;case 5:Y3=1;Y2=0;Y1=1;P0=gsmg[1];break;case 6:Y3=1;Y2=1;Y1=0;P0=gsmg[2];break;case 7:Y3=1;Y2=1;Y1=1;P0=gsmg[5];break;}Delay_10us(10);//延时时间1000us=1msP0=0x00;//消隐}
}
int main()															 
{while(1){smg_long();	   }
}

驱动动态数码管效果展示:


制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

http://www.dtcms.com/a/336275.html

相关文章:

  • linux线程被中断打断,不会计入调度次数
  • 解决 SECURE_PCI_CONFIG_SPACE_ACCESS_VIOLATION蓝屏报错
  • 攻防世界—unseping(反序列化)
  • 机器学习----PCA降维
  • RocketMQ面试题-未完
  • 芋道RBAC实现介绍
  • python+flask后端开发~项目实战 | 博客问答项目--模块化文件架构的基础搭建
  • Valgrind 并发调试 ·:用 Helgrind 抓住线程里的“看不见的错”
  • 数据结构:在二叉搜索树中插入元素(Insert in a BST)
  • linux-高级IO(上)
  • 猫头虎AI分享|一款Coze、Dify类开源AI应用超级智能体Agent快速构建工具:FastbuildAI
  • #买硬盘欲安装k8s记
  • Flutter 3.35 更新要点解析
  • ICCV 2025 | Reverse Convolution and Its Applications to Image Restoration
  • 如何运用好DeepSeek为自己服务:智能增强的范式革命 1.2 DeepSeek认知增强模型
  • 计算机基础速通--数据结构·图的基础应用三(基础图算法进阶)
  • Tauri 框架介绍
  • 《Nursing Research》(护理SCI)LaTeX模板详细教程:从入门到投稿(一)
  • 炒股术语:“洗盘”
  • LLM入门学习
  • 【165页PPT】锂电池行业SAP解决方案(附下载方式)
  • 【C++】Windows 下 TCP接口超详介绍,如何实现一个TCP服务端和客户端
  • 又一家茑屋书店即将歇业,精品书店的未来在哪里?
  • ruoyi-vue(十一)——代码生成
  • Python爬虫实战:研究optimesh库,构建Github网格数据采集系统
  • AntSK-PyAPI技术深度解析:打造企业级文本嵌入向量服务的完整指南
  • C语言(12)——进阶函数
  • 【Linux】文件基础IO
  • 软件需求High-Level(高层级)需求和Low-Level(低层级)需求
  • rt-thread audio框架移植stm32 adc+dac,用wavplayer录音和播放