问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

51单片机数码管显示原理与实现详解

创作时间:
作者:
@小白创作中心

51单片机数码管显示原理与实现详解

引用
CSDN
1.
https://blog.csdn.net/qq_72935001/article/details/140233486

本文详细介绍了数码管的显示原理与实现方法,包括静态数码管和动态数码管的电路连接、工作原理及代码实现。文章内容系统全面,从基础概念到具体应用,层层递进,适合初学者学习和理解。

数码管的结构

数码管(Seven-Segment Display)是一种常见的显示设备,广泛应用于电子时钟、计算器、家电和其他数字设备中。数码管由七个独立的LED段组成,排列成一个类似数字“8”的形状。通过控制这些LED段的开关状态,可以显示0到9的数字及一些字母和符号。同时也称为LED数码管。

一个标准的七段数码管包括七个LED段,每个段用一个字母表示,从A到G。另外,有些数码管还包括一个小数点(DP),被称为八段数码管,用于显示小数或分隔不同的数字。

  
                          --A--			  --A--
                         |     |		 |     |
                         F     B		 F     B
                         |     |		 |     |
                          --G--			  --G--
                         |     |		 |     |
                         E     C		 E     C
                         |     |		 |     |
                          --D--			  --D-- 
                                                • DP
  

数码管的工作原理

数码管的每个段实际上是一个独立的LED,通过控制各个LED的通断状态,可以组合成不同的字符。数码管通常有两种连接方式:共阳极和共阴极。

  1. 共阳极数码管:所有的LED阳极(正极)连接在一起,通常接到电源正极。点亮某个段时,需将相应的段的阴极(负极)接地 GND。
  2. 共阴极数码管:所有的LED阴极(负极)连接在一起,通常接地。点亮某个段时,需将相应的段的阳极(正极)接电源正极。

静态数码管

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

电路图

从资料中提供的电路图可知,此开发板静态数码管使用的是共阳极数码管,如果使用共阴数码管,为了不影响其他IO口的电流,要增加IO口的驱动电路,单片机主要是用来控制的,如果要驱动一些外部的设备,通常会使用专门的驱动电路,比如74HC245芯片,74HC573芯片。

开发板IO连接图

代码演示

控制静态数码管显示数字0,即让P0口端口输出数字0的段码0x3F(共阴,共阳极取反即可),其他数字可根据连接方式自行计算。

  
#include <REGX52.H>
#define SMG_STATIC P0
void main()
{
    SMG_STATIC = ~0x3f;
    while(1)
    {
        
    }
}
  

动态数码管

动态数码管显示,也称为动态扫描显示,是通过快速轮流点亮各个位数码管来实现的。利用人眼的视觉暂留效应,使人感觉所有数码管同时显示不同的数字。

实现步骤

  1. 段选和位选:将所有位数码管的段选线并联在一起,通过位选控制哪一位数码管有效。
  2. 轮流显示:轮流向各个位数码管送出字型码和相应的位选信号。由于切换速度很快,人眼无法分辨出切换过程,从而感觉所有数码管同时显示。
  3. 消影处理:在切换位选信号之前,先将段选信号清零,防止残影现象。

数码管驱动方式

  1. 单片机直接扫描:硬件设备简单,但会消耗大量的单片机CPU时间。
  2. 专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可。如:TM1640芯片、74HC595

电路图

由电路图可知,该开发板的动态数码管是由两个4位一体数码管组成的,一共八个数码管,它们的公共端单独引出来,位选段全部并联在一起,动态进行显示,采用的是共阴极。八个公共端同一个时刻,只有一个数码管可以点亮,因为位选段是并联在一起的,所以即使有多个公共端同一个时刻被点亮,数码管显示的数据也是相同的。可以利用人眼视觉暂留和余晖效应进行延时操作即可!

动态数码管要搭配74H138模块和74H245:

  • 74H138:一种常用的 3 线到 8 线译码器芯片,主要用于地址解码、数据路由和逻辑控制。它可以将输入的三位二进制代码转换成八位的输出,常用于单片机系统中进行 I/O 扩展。即三个输入端操作8个输出端,具体操作方法可查看真值表。

  • 输入端:A0、A1、A2 为三位二进制加权地址输入端口。

  • 输出端:Y0 至 Y7 为八个输出端口。

  • 使能端:E1 和 E2 为低有效,E3 为高有效。只有当 E1 和 E2 置低且 E3 置高时(默认),芯片才会工作

  • 74H245:一种常用的双向总线缓冲器芯片,防止信号干扰。可以将高电平信号转换为低电平信号,或将低电平信号转换为高电平信号,确保不同电平逻辑设备之间的兼容性。它能够隔离不同总线之间的电平差异和噪声干扰,确保数据的可靠传输。

开发板IO连接图

74H138的A0(A)与P22相连;A1(B)与P23相连;A2(C)与P24相连(真值表)

真值表

L表示0(低电平),H表示1(高电平)

代码演示1

根据真值表操作第五个LED数码管,显示数字6,

Init_Port()函数用于操作操作真值表,为了方便对比,这里保留了静态数码管的代码。

  
#include <REGX52.H>
#define SMG_STATIC P0
void Init_Port()
{
    P2_2 = 0;
    P2_3 = 0;
    P2_4 = 1;
}
void main()
{
    Init_Port();//显示LED数码管5
    SMG_STATIC = ~0x7d;
    P1 = 0x7d;
    while(1)
    {
        
    }
}
  

代码演示2

动态数码管延时循环显示数字6,如果需要循环显示数字1到数字8,定义数组即可。

  
#include <REGX52.H>
#define SMG_STATIC P0
void DelayXms(unsigned int xms)	//@12.000MHz
{
    unsigned char data i, j;
    
    while(xms)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
        xms--;
    }
}
void Init_Port(unsigned char Location)
{
    
    switch(Location)
    {
        case 1:
            P2_2 = 0;P2_3 = 0;P2_4 = 0;
            break;
        case 2:
            P2_2 = 1;P2_3 = 0;P2_4 = 0;
            break;
        case 3:
            P2_2 = 0;P2_3 = 1;P2_4 = 0;
            break;
        case 4:
            P2_2 = 1;P2_3 = 1;P2_4 = 0;
            break;
        case 5:
            P2_2 = 0;P2_3 = 0;P2_4 = 1;
            break;
        case 6:
            P2_2 = 1;P2_3 = 0;P2_4 = 1;
            break;
        case 7:
            P2_2 = 0;P2_3 = 1;P2_4 = 1;
            break;
        case 8:
            P2_2 = 1;P2_3 = 1;P2_4 = 1;
            break;
    }
}
void main()
{
    unsigned char i;
    SMG_STATIC = ~0x7d;
    while(1)
    {
        for(i = 1; i <= 8;i++)
        {
             Init_Port(i);
             P1 = 0x7d;
             DelayXms(1000);
        }
    }
}
  

代码演示3

利用余晖效应,动态持续的显示数字1到8,P1 = 0x00; 这一行用于消影。消影的作用是防止数码管显示的残影现象。具体来说,当你在多位数码管上显示不同的数字时,如果不及时清除前一个数字的显示,可能会出现残影,即前一个数字的部分段码仍然亮着,影响当前数字的显示效果。通过在每次显示完一个数字后,将 P1 置为 0x00,可以确保所有段码都熄灭,从而避免残影现象,确保每次显示的数字都是清晰且正确的。

  
#include <REGX52.H>
#define SMG_STATIC P0
//共阴极数码管显示 0~F 的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void DelayXms(unsigned int xms)	//@12.000MHz
{
    unsigned char data i, j;
    
    while(xms)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
        xms--;
    }
}
void Init_Port(unsigned char Location)
{
    
    switch(Location)
    {
        case 1:
            P2_2 = 0;P2_3 = 0;P2_4 = 0;
            break;
        case 2:
            P2_2 = 1;P2_3 = 0;P2_4 = 0;
            break;
        case 3:
            P2_2 = 0;P2_3 = 1;P2_4 = 0;
            break;
        case 4:
            P2_2 = 1;P2_3 = 1;P2_4 = 0;
            break;
        case 5:
            P2_2 = 0;P2_3 = 0;P2_4 = 1;
            break;
        case 6:
            P2_2 = 1;P2_3 = 0;P2_4 = 1;
            break;
        case 7:
            P2_2 = 0;P2_3 = 1;P2_4 = 1;
            break;
        case 8:
            P2_2 = 1;P2_3 = 1;P2_4 = 1;
            break;
    }
}
void main()
{
    unsigned char i;
    SMG_STATIC = ~0x7d;
    while(1)
    {
        for(i = 1; i <= 8;i++)
        {
            Init_Port(i);
            P1 = gsmg_code[i];
            DelayXms(1);
            P1 = 0x00;//消影
        }
    }
}
  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号