LED數碼管結構與工作原理

一.什麼是數碼管

LED數碼管(LED Segment Displays)是由8個發光二極管構成,並按照一定的圖形及排列封轉在一起的顯示器件。其中7個LED構成7筆字形,1個LED構成小數點(固有時成爲八段數碼管)。
數碼管位數有半位,1,2,3,4,5,6,8,10位等等(及數碼管的位數),顏色有紅,綠,藍,黃等幾種。瞭解LED的這些特性,對編程是很重要的,因爲不同類型的數碼管,除了它們的硬件電路有差異外,編程方法也是不同的。
在這裏插入圖片描述

二.數碼管基本構造

LED數碼管有兩大類,一類是共陰極接法,另一類是共陽極接法,共陰極就是7段的顯示字碼共用一個電源的負極,是高電平點亮,共陽極就是7段的顯示字碼共用一個電源的正極,是低電平點亮。只要控制其中各段LED的亮滅即可顯示相應的數字、字母或符號。
共陰和共陽極數碼管的內部電路,它們的發光原理是一樣的,只是它們的電源極性不同而已,共陰爲所有的LED負極接在一起,共陽爲爲所有的LED正極接在一起。如下圖爲1位數碼管的共陰極和共陽極原理圖:
在這裏插入圖片描述

三、數碼管顯示原理

要是數碼管顯示數字,有兩個條件:1.是要在VT端加合適的電源(一般每顆LED還需串上合適的電阻,起限流作用);2.要使(a,b,c,d,e,f,g,dp)端接低電平或“0”電平。這樣才能顯示的。
例如下圖的共陰極數碼管,須在VT端接上地端,(a,b,c,d,e,f,g,dp)端接到單片機的引腳上;如果要使其中一個LED亮時,對應的單片機引腳輸出高電平,即可點亮LED等。
在這裏插入圖片描述
共陰極LED數碼管的內部結構原理圖

能夠點亮數碼管後,就可以通過單片機控制數碼管顯示數字或字母。爲了控制方便,我們將數碼管的a~dp引腳依次連接單片機的P10-P17引腳,如圖:
在這裏插入圖片描述
我們對數碼管所要顯示的每個數字和字母進行編碼,然後在編程時,將編碼放在一個數組上,需要顯示什麼數字或者字母,從數組裏面提取相應的編碼就可顯示所要顯示的字符了。
如圖,要顯示數字“5”時,編碼爲0x6D。如果數碼管爲共陽極,只需要對共陰極的編碼做一個取反操作即可。
在這裏插入圖片描述

四.數碼管驅動方式

根據LED數碼管的驅動方式的不同,可以分爲靜態式和動態式兩類。

1.靜態驅動方式
靜態驅動也稱直流驅動。靜態驅動是指每個數碼管的每一個段碼都由一個單片機的I/O口進行驅動,或者使用如BCD碼二-十進位轉換器進行驅動。靜態驅動的優點是編程簡單,顯示亮度高,缺點是佔用I/O口多,如驅動5個數碼管靜態顯示則需要5×8=40根I/O口來驅動,要知道一個89S51單片機可用的I/O口才32個呢。故實際應用時必須增加驅動器進行驅動,增加了硬體電路的複雜性。

2.動態驅動方式
數碼管動態顯示介面是單片機中應用最爲廣泛的一種顯示方式之一,動態驅動是將所有數碼管的8個顯示筆劃"a,b,c,d,e,f,g,dp "的同名端連在一起,另外爲每個數碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制。
當單片機輸出字形碼時,所有數碼管都接收到相同的字形碼,但究竟是那個數碼管會顯示出字形,取決於單片機對位元選通COM端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開,該位就顯示出字形,沒有選通的數碼管就不會亮。
透過分時輪流控制各個LED數碼管的COM端,就使各個數碼管輪流受控顯示,這就是動態驅動。在輪流顯示過程中,每位數碼管的點亮時間爲1~2ms,由於人的視覺暫留現象及發光二極體的餘輝效應,儘管實際上各位數碼管並非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示資料,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,能夠節省大量的I/O口,而且功耗更低。
在這裏插入圖片描述
四位數碼管動態驅動方式連接圖

五.八位數碼管動態驅動例程

以八位共陰極數碼管,動態驅動的方式爲例:

#include<reg51.h>

//--定義使用的IO口--//
#define GPIO_DIG   P0	//段選
#define GPIO_PLACE P1	//位選

//--定義全局變量--//
unsigned char code DIG_PLACE[8] = {
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位選控制   查表的方法控制
unsigned char code DIG_CODE[17] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
unsigned char DisplayData[8];
//用來存放要顯示的8位數的值

//--聲明全局函數--//
void DigDisplay(); //動態顯示函數
/*******************************************************************************
* 函 數 名         : main
* 函數功能		   : 主函數
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void main(void)
{
	unsigned char i;

	for(i=0; i<8; i++)
	{
		DisplayData[i] = DIG_CODE[i];	
	}
	while(1)
	{
		DigDisplay();
	}				
}

/*******************************************************************************
* 函 數 名         : DigDisplay
* 函數功能		   : 使用數碼管顯示
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void DigDisplay()
{
	unsigned char i;
	unsigned int j;

	for(i=0; i<8; i++)
	{
		GPIO_PLACE = DIG_PLACE[i];	 //發送位選
		GPIO_DIG = DisplayData[i];     //發送段碼
		j = 10;						 //掃描間隔時間設定
		while(j--);	
		GPIO_DIG = 0x00;//消隱
	}

如果您喜歡,可關注個人公衆號“電子應用學習館”,獲取更多的資料例程。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章