全面解析数码管的工作原理和应用

1. 数码管简介

数码管:也称为LED数码管,基本单元是发光二极管(LED)。分为七段数码管和八段数码管(多一个小数点DP)。
– 共阳数码管:所有LED的阳极连接到一起形成一个公共阳极接VCC,单片机需要控制某段LED的阴极为低电平时,相应led就会点亮
– 共阴数码管:所有LED的阴极连接到一起形成一个公共阴极接GND,单片机需要控制某段LED的阳极为高电平,相应LED会点亮。:单片机上IO口的电压不足以驱动数码管的led,因此共阴数码管的阳极一般并不直接连到单片机的IO上,而是中间再接一个电源。

动态数码管:两个或两个以上单个数码管并列在一起形成的多位数码管,内部分为公共端和段码端。多位数码管上的所有数码管在同一时刻现实的数字是一样的,因为它们共用段选线,而在极短的时间内通过“位选”不同的数码管显示不同的数字,从视觉上实现了多个数码管在同一时间的动态显示不同数字。

  • 公共端:各个数码管相互独立,负责控制多位数码管中具体哪个数码管工作
  • 段码端:各个数码管共用用七段/八段的段选线
  • 2. 原理图分析

    静态数码管:静态化数码管是共阳数码管,可以直接通过单片机输出低电平来控制对应的数码管led是否亮

    动态数码管:动态化数码管是共阴数码管,通过单片机控制段线实现控制数码管的显示具体数字,通过单片机控制位线实现控制具体哪个数码管显示

    74138译码器:默认状态输出的8个IO口(Yn)都是高电平,通过3个输入IO口(A、B 、C)组成的8种状态,实现对8个输出IO口(Yn)具体哪个IO口输出低电平

    3. 代码编写

    共阳数码管码表

    静态数码表

    uunsigned char val[16] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
    void delay()
    {
    	int i = 100, j = 100;
    	while(i--)
    	{
    		while(j--)
    		{}
    	}
    }
    
    void main(void)
    {
    	while (1)
    	{
    		for(int i=0; i<15; i++)
    		{
    			P0 = val[i];
    			delay();
    		}
    	}
    }
    
    

    共阴数码管码表

    动态数码表

    unsigned char led_select[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
    unsigned char bit_select[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
    void delay()
    {
    	int i = 2, j = 100;
    	while(i--)
    	{
    		while(j--)
    		{}
    	}
    }
    void main(void)
    {
    	while (1)
    	{
    		for(int i=0; i<8; i++)
    		{
    			P2 = bit_select[i];	//位选
    			P0 = val[i];		//段选
    			delay();
    			P0 = 0x0;			//清空两个段选数字之间的影响
    		}
    	}
    }
    
    

    38译码器真值表

    unsigned char led_select[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
    void delay()
    {
    	int i = 2, j = 100;
    	while(i--)
    	{
    		while(j--)
    		{}
    	}
    }
    void main(void)
    {
    	while (1)
    	{
    		for(int i=0; i<8; i++)
    		{
    			P2 = i;				//通过译码器位选
    			P0 = val[i];		//段选
    			delay();
    			P0 = 0x0;			//清空两个段选数字之间的影响
    		}
    	}
    }
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 全面解析数码管的工作原理和应用

    发表评论