51单片机-数码管

193 阅读5分钟

数码管的介绍

  • LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件

数码管的引脚定义

image-20220204154444377.png

image-20220204154550802.png 由于四位数码管四个数字的段显示是相同的连接在一个引脚上的。一共需要14个引脚。

我们称12,9,8,6为位选 11、7、4、2、1、10、5、3为段选

由此我们知道这样是不可以4位同时显示不同的数值的,要想实现这一效果我们用到了数码管扫描

我们可以使第一位显示一个数字,第二位显示一个数字,然后一直循环,因为我们人眼的视觉暂留,看起来就是同时显示了。

数码管在开发板中的连接

image-20220204155940561.png

74HC138译码器

  • 作用:译码,用三个引脚控制8个引脚。

  • 使用:使能端G1接高电平 G2A、G2B接低电平。A、B、C为输入端 输出端为低电平有效,其他为高电平

CBA输出
000Y0低电压
001Y1
010Y2
011Y3
100Y4
101Y5
110Y6
111Y7

138译码器数据手册

74HC245双向缓冲器

低电平的驱动能力强 高电平的驱动能力弱

所以需要用一个缓冲区来加强电压

使用: OE为使能端 低电平有效 即OE端低电平芯片工作

DIR方向控制 高电平 A到B 低电平 B到A

其他引脚是一一对应的 A0 对 B0 以此类推

代码示例

静态数码管显示

//静态数码管显示 第三位显示6
#include <REGX52.H>void main()
{
    P2_2=1;
    P2_3=0;
    P2_4=1;
    P0=0x7D;
    while(1);
}

优化代码

//数码管代码模块化
#include <REGX52.H>
/*
----------------------------------------------------------------------
名称:    数码管模块化代码
函数名称: Nixie(unsigned char Loaction,Number) Loaction 位选 Number 数字
         其中Number 10为空 11为点
----------------------------------------------------------------------
*/
unsigned char NixieTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x80};
void Nixie(unsigned char Loaction,Number)
{
    switch(Loaction)
    {
        case 1:P2_4=1;P2_3=1;P2_2=1;break;
        case 2:P2_4=1;P2_3=1;P2_2=0;break;
        case 3:P2_4=1;P2_3=0;P2_2=1;break;
        case 4:P2_4=1;P2_3=0;P2_2=0;break;
        case 5:P2_4=0;P2_3=1;P2_2=1;break;
        case 6:P2_4=0;P2_3=1;P2_2=0;break;
        case 7:P2_4=0;P2_3=0;P2_2=1;break;
        case 8:P2_4=0;P2_3=0;P2_2=0;break;
     }
    P0=NixieTab[Number];
}
void main()
{
    Nixie(3,6);
    while(1);
}

动态数码管显示

数码管显示是 位选 段选 位选 段选 地重复 在重复时因为单片机速度很快 所以会有重影地现象

消影; 我们延时1微秒 然后空显示就可以了

不延时的话 亮度会明显变暗

#include <REGX52.H>
#include <INTRINS.H> 
void Delay(unsigned int ums)        //@11.0592MHz
{
    while(ums){
        _nop_();
        _nop_();
        _nop_();
        ums--;
    }
}
​
unsigned char NixieTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x80};
void Nixie(unsigned char Loaction,Number)
{
    switch(Loaction)
    {
        case 1:P2_4=1;P2_3=1;P2_2=1;break;
        case 2:P2_4=1;P2_3=1;P2_2=0;break;
        case 3:P2_4=1;P2_3=0;P2_2=1;break;
        case 4:P2_4=1;P2_3=0;P2_2=0;break;
        case 5:P2_4=0;P2_3=1;P2_2=1;break;
        case 6:P2_4=0;P2_3=1;P2_2=0;break;
        case 7:P2_4=0;P2_3=0;P2_2=1;break;
        case 8:P2_4=0;P2_3=0;P2_2=0;break;
     }
    P0=NixieTab[Number];
    Delay(1);
    P0=0x00;
}
void main()
{
    while(1){
        Nixie(1,1);
        Nixie(2,2);
        Nixie(3,3);
        Nixie(4,4);
        Nixie(5,11);
        Nixie(6,5);
        Nixie(7,6);
        Nixie(8,7);
    }
}

利用双74CH595控制8位数码管

74CH595

74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。

202204141846955.png

image.png

202204141844396.png

#include <REGX52.H>
​
sbit RCK =P3^5;//转存
sbit SRCK=P3^6;//一位
sbit SER =P3^4;
​
unsigned char code  NixieNum[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
​
void _74HC595_Write(unsigned char location,unsigned char Num)
{
    unsigned char i,locat;
    RCK=0;
    SRCK=0;
    
    if(location==1)locat=~(0x80);
    if(location==2)locat=~(0x40);
    if(location==3)locat=~(0x20);
    if(location==4)locat=~(0x10);
    if(location==5)locat=~(0x08);
    if(location==6)locat=~(0x04);
    if(location==7)locat=~(0x02);
    if(location==8)locat=~(0x01);
​
    for(i=0;i<8;i++)
    {
        SER=locat&(0x80>>i);
        SRCK=1;
        SRCK=0;
    }
    for(i=0;i<8;i++)
    {
        SER=NixieNum[Num]&(0x80>>i);
        SRCK=1;
        SRCK=0;
    }
    RCK=1;
    RCK=0;  
}
​
void main()
{
    while(1)
    {
        _74HC595_Write(1,1);
        _74HC595_Write(2,2);
        _74HC595_Write(3,3);
        _74HC595_Write(4,4);
        _74HC595_Write(5,5);
        _74HC595_Write(6,6);
        _74HC595_Write(7,7);
        _74HC595_Write(8,8);
    }
    
}

数码管的驱动方式

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

image-20220204182603471.png