数码管显示原理及应用实现详解

数码管显示原理及应用实现

视频链接
对应课程:P11-P12

数码管显示原理

  1. 我们先看一下一个数码管是如何亮起来的。数码管内部电路如图所示:

    image-20221027143142574

    为了封装统一,生产商为单位数码管都封装了10个引脚,其中第3个和第8个引脚是连接在一起的。显示一个8字需要七个小段,另外还有一个小数点,所以其内部共有8个小的发光二极管,最后还有一个公共端。

    公共端可分为共阳极和共阴极,其内部原理图如图所示:

    image-20221027144528501

    对于共阴极数码而言,其8个发光二极管的阴极在数码管内部全部连接在一起,所以称为”共阴“,它们的阳极是独立的。当我们给数码管的任一个阳极加上一个高电平时,对应的发光二极管就点亮了。

    例如如果想让数码管显示”0“,只需要让”g“"dp"引脚送入低电平,而其余引脚全部输入高电平。

    共阳极数码同理,其8个发光二极管的阳极在数码管内部全部连接在一起,所以称为”共阳“,它们的阴极是独立的。当我们给数码管的任一个阴极加上一个低电平时,对应的发光二极管就点亮了。

    数码管内部发光二极管要想点亮,需要5mA以上的电流,但电流也不可过大,否则会烧毁发光二极管。由于单片机的I/O口送不出如此大的电流,所以数码管与单片机连接时需要加上驱动电路。

  2. 多位一体数码管

    以四位一体的数码管为例,其内部原理图如图所示:

    image-20221027145804875

    它们内部的公共端是独立的,而负责显示什么数字的段线全部是连接在一起的,独立的公共端可以控制多位一体中的哪一位数码管点亮,而连接在一起的段线可知控制这个能点亮数码管亮什么数字。

    通常我们把公共端叫做位选线

    连接在一起的段线叫做段选线

    有了这两个线,通过单片机及外部电路就可以控制任意的数码管显示任意的数字了。

数码管静态显示

先来看巫妖王V2版数码管原理图:

image-20221027154500301

本实验板使用的数码管为共阴极,COM为公共端,若想让LED6亮,则赋LED6为0其余为1,此为”选中“,若想LED6显示1,则要给阳码:0110 0000 (1是亮 0是灭)

  • 74LS138(38译码器)

    LED1—LED8连接38译码器的输出端,即通过38译码器可实现P22、P23、P24这三个I/O口来控制LED1—LED8的输出。

  • 74HC573(锁存器)

    OE(使能端,低电平有效)

    LE连接VCC(跳帽连接)

    这样锁存器的输入端连接单片机的P0口,实现D0-D7的数据原封不动的送入Q0-Q7.

  • 代码

    先介绍C51数组

  • 数组:把相同类型的一系列数据统一编制到某一个组别中,可以通过数组名+索引号简单快捷的操作大量数据

  • 定义和引用:

    int x[3];	//定义一组变量(3个)
    int x[]={1,2,3};//定义一组变量并初始化
    
    x[0] 		//引用数组的第0个变量
    x[1] 		//引用数组的第1个变量
    x[2]		//引用数组的第2个变量
    引用x[3]时,数组越界,读出的数值不确定,应避免这种操作
    
  • Switch语句

    switch(变量)
    {
    	case 常量1:语句体1;break;
    	case 常量2:语句体2;break;
    	case 常量3:语句体3;break;
    	case 常量4:语句体4;break;
    	...
    	default:语句体x;break;
    }
    

    将变量与case后的各个常量对比,若有相等,则执行相应的语句体。若没有一个相等,则执行default后的语句体(default可以不写)

  • 完整代码如下:

    #include <REGX52.H>    //和#include <REG52.H>的区别
    
    //段位表(共阴极数码管编码,对于的符号为0,1,2,3,4,5,7,8,9)
    unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    
    //数码管显示子函数
    void Nixie(unsigned char Location,Number)
    {
    	switch(Location)		//位码输出,通过38译码器进而实现数码管的选中
    	{
    		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=NixieTable[Number];	//段码输出          
    }												
                                                    
    void main()
    {
    	while(1)
    	{
    		Nixie(3,0); //在第3个数码管位置显示0
    	}
    }	
    /*
    当P0等于0x3f,换算成2进制为 0011 1111
    P0.0是低位,P0.7是高位,则P0.0-P0.7:1111 1100
    由于是共阴极连接,1是亮,0是灭,则g,dp不亮,其余亮,显示为数字0
    */
    

    数码管动态显示

    数码管驱动方式通常有两种:

  • 单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间

  • 专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可

  • 数码管动态扫描,其实是轮流向各个数码管送出字形码和相应的位选,利用发光管的余晖和人眼视觉暂留作用,使得人的感觉好像数码管同时都在显示,实际上多位数码管是一位一位轮流显示的,只是轮流的速度非常快,人眼无法分辨出来。

    #include <REGX52.H>    //和#include <REG52.H>的区别
    
    //段位表(共阴极数码管编码,对于的符号为0,1,2,3,4,5,7,8,9)
    unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
    //延时子函数
    void Delay1ms(unsigned int xms)		//@12.000MHz
    {
    	while(xms--)
    	{
    		unsigned char i, j;
    		i = 2;
    		j = 239;
    		do
    		{
    			while (--j);
    		} while (--i);
    	}	
    }
    //数码管显示子函数
    void Nixie(unsigned char Location,Number)
    {
    	switch(Location)		//位码输出,通过38译码器进而实现数码管的选中
    	{
    		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=NixieTable[Number];	//段码输出 
    	Delay1ms(1);    //
    	P0=0x00;        //消影
    }												
                                                    
    void main()
    {
    	while(1)
    	{
    		Nixie(1,0); //八个数码管依次显示为01234567
    		Nixie(2,1); 
    		Nixie(3,2); 
    		Nixie(4,3); 
    		Nixie(5,4);
    		Nixie(6,5);
    		Nixie(7,6); 
    		Nixie(8,7); 
    	}
    }  
    
    
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 数码管显示原理及应用实现详解

    发表评论