數碼管基礎知識
今天我們先來了解一種新的元器件--數碼管。數電教材中一般將他和譯碼一起講解。它是一種顯示器件,現在我們來看看它是一個什么樣的東西。
以上是最常見的一些數碼管,當然它的外觀樣式非常多,那它的工作原理是怎么樣的呢?
我們現在來看一下它內部結構應該就能知道它的顯示原理了。
其內部就是由一些LED電路構成,固定在其底面,然后表面通過注塑一些透明材料讓顯示部分在內部LED發光時能夠顯示出來,從而達到顯示信息的效果。這種顯示器是最簡單,也是最經濟的一種顯示工具。在我們日常生活中的電器中是非常常見的,相信大多數人都遇到過,只是在這之前你可能不會想到它叫數碼管顯示屏。正是因為它的這些特點所以市面上各種各樣的數碼管顯示屏都有,大家都可以定制一些特定顯示內容的屏用在自己的產品上,你若有意把自己的名字制作成屏都可以,哈哈哈……這也是我在電子元器件基礎知識中沒有介紹它的原因。再來看看它內部電路結構,剛學完點亮LED 的朋友是否能想到點亮它的辦法呢?
上圖中的共陰,共陽又是什么意思?從圖中很容易看出來,共陰型數碼管的所有LED的陰極是接在一起的,而共陽型數碼管剛好相反,這還是很好區分的吧。那這么做的目的是什么呢?把某一端接在一起,這樣制作時就內部可以省一些線路,又可以少引出幾個端口吧。如果使用的是共陽型數碼管,在使用時將公共端接到地,這時要點亮哪一段就將所在端的LED設置為高電平就好了。
看完以上說明你也會覺得數碼管也是很簡單的吧,但是也先別那么得以,任何簡單的應用原理背后都還隱藏很多復雜的事情,這只是顯示原理最基礎的一內容。當然,對于還不會使用單片機控制數碼管的朋友也不用擔心,接著看后面的內容你就可以入門了。如果你已經會使用數碼管了不妨再來看看下面這個圖中的數碼管,你會使用它嗎(沒基礎的朋友先跳過這個問題),注意它只有8個引腳!這應該是擴音器或藍牙音箱產品上用的顯示屏。
P0端口和排阻
根據以上原理分析,我設計如下的一個電路,接下來我們在這個電路上進行講解數碼管顯示控制的編程內容。
細心的朋友可能發現了數碼管連接的單片機P0端口每個引腳都接在了一個元件上,這是什么意思呢?這個元器件叫做排阻,簡單說它就是有一排電阻,也就是說它內部包含了一組參數相同的電阻,說白了它還是電阻。
我們為什么要使用這種電阻呢,看我們在接LED的電路中使用了8個一樣的電阻,為了話電路圖時方便或減少電路板的空間我們是不是也可以像數碼管一樣把公用的一端接一起呢,是吧?所以就出現了排阻這種器件。當然如果不考慮這兩問題的話我們也可以用單獨的電阻代替,
不過它內部結構不一定就剛剛好一個獨立引腳對應一個單獨的電阻,它可能有具體的一些內部電路,但是我們使用時把它等效成每個對應一個電阻就好了。
現在的排阻大多都是貼片的了,像下面這樣:
那我們電路中P0端口為何要接一組排阻到電源呢?這就涉及到P0端口特殊的結構了,在我們介紹單片機基礎是文章中我們提到了,現在再做一些具體的介紹。
P0端口是開漏設計的,我們查看芯片數據手冊來看一下。
官方手冊是這么說的,是不是看了還是很迷糊?
說到開漏一詞是不是有似曾相識的感覺,模電課程考及格的朋友應該都會有印象。看上面的圖也可以看出來,就是端口是直接接在一個nmos管漏極的,nmos管漏極沒有有電源電路連接,我們前面介紹三極管與mos管驅動LED的視頻中nmos管的漏極是要與電源連接才能驅動LED吧,這里也是是個道理。
開漏輸出端口是沒有能力輸出高電平驅動負載的,當控制其輸出低電平時其引腳將接地,控制其輸出高電平時引腳既不輸出高電平,也不輸出低電平,為高阻態狀態。所以現在知道我們為什么需要接一排阻到電源了吧?這個電阻我們也稱之為上拉電阻,就是將引腳接到電源端的電阻,與之對應的是下拉電阻,就是將引腳接到地端的電阻。
任何顯示具體數據
現在問題來了,如我們上面設計的電路所示,我們要怎么做才能讓數碼管上顯示出我們需要顯示的內容(比如數字0,1……9)呢?這時就需要根據其內部電路分布推算出顯示信息對應的控制位的數據了,以我們使用的圖為例,比如要顯示“0”這個符號就需要點亮a,b,c,d,e,f這六段,在我們的單片機中與這六段相連的引腳都要輸出高電平才能點亮。使用這時我們就將P0端口輸出數據數值為0x3f,同樣的方法我們可以推斷出顯示其他數據時P0端口對應輸出的數據。把它計算出來做成一個真值表,以后使用時就很方便了,當然這其中需要你根據具體的電路接線圖來確定數據的。實際做項目時肯定會遇到不是同一組端口中連接數碼管各段的情況,所以現在掌握好基礎知識后遇到其他情況就需要靈魂處理了。
數組與數據顯示
現在我們來看看顯示一個數的程序要怎么實現。
#include
#include
sbit com1 = P2^0; //定義數碼管com1引腳
sbit com2 = P2^1; //定義數碼管com2引腳
typedef unsigned char u8;
typedef unsigned int u16;
u8 code num_codelist[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(u8 ms);
void main()
{
u8 i;
for(i=0;i< 10;i++)
{
P0 = num_codelist[i];
delay(100);
}
}
void delay(u8 ms) //定義函數
{
u8 i,j;
for(i=0;i< ms;i++)
{
for(j=0;j< 100;j++)
{
;
}
}
}
com1,com2是聲明連接數碼管兩個公共端的,只使用一位數碼管時可以不用定義,將其公共端直接接地就行,后面的程序中我們會使用到這兩端口。
程序中出現了我們之前沒有介紹的內容--u8 code num_codelist[10],這種數據結構叫數組,在C語言中它用來有序存儲一組相同類型的數據,"[n]"中的n就是它的序號,也稱它為下標。它的基礎定義方式為:
數據類型 數組名 [數組元素總數N];
例如:unsigned char code[10];
它的意思是定義了一個有十位數據的數組。
它的下標計數規則是從0開始計數的,即以上數組中第一位數據為code[0]。
如果我們定義時沒對其進行賦值,編譯器一般會將其中所有內容初始化為0(但不一定所有編譯器都是默認這么處理的,所有定義時最好還是初始化一下比較安全)。我們也可以在定義時對其中內容進行賦值,且賦值時不一定全都要賦值,可以只賦前面一位或幾位部分,未賦值的內容還是會被初始化為0。
有時我們定義時也可以省略其數組元素總數N,比如:
unsigned char code[] = {1,2,3,4};
這時編譯器將自動識別出數組元素總數N為4。
數組元素總數N是定義后就不能變的,即在后面的程序中不能對數組添加內容,但改變其中的數據是可以的。
剛才講的數組,我們稱為一維數組,當然數組也可以是二維或多維的,就和我們排隊一樣,可以排成一排,也可以排成多行,比如定義二維數組:
unsigned char code[2][5];
這里的意思就是D定義了一個有2行5列的二維數組。
使用時行列下標都要包含,比如code[0][2]就是第一行第三列的數據。
其他多維數組以此類推。
關于數組我們先介紹這些基礎內容,更多知識內容后面遇到時再詳細講解。
那為什么在C51單片機編程時使用的是code table[]格式呢,這里我們添加了一個關鍵詞code,是編譯器決定的,和前面的sfr 和sbit情況類似 ,這些是要記住的內容,如果換其他編譯器也要視情況而定,每種編譯器使用的規則各有不同。
后面的main函數內容就是讓數碼管從0~9依次切換顯示數字了。
任何實現動態數字顯示
上面只是顯示一位數據,在實際情況中要顯示二位甚至多位該怎么處理呢?接下來我們看看顯示兩位時要怎么編程。
#include
#include
sbit com1 = P2^0; //定義數碼管com1引腳
sbit com2 = P2^1; //定義數碼管com2引腳
typedef unsigned char u8;
typedef unsigned int u16;
u8 code num_codelist[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(u8 ms);
void main()
{
//顯示第一位數字0
com1 = 0;//將第一位的com端設置為低電平
com2 = 1;
P0 = num_codelist[0];
delay(1);
P0 = 0x00;
com1 = 1;
com2 = 0;//將第二位的com端設置為低電平
P0 = num_codelist[1];
delay(1);
P0 = 0x00;
}
void delay(u8 ms) //定義函數
{
u8 i,j;
for(i=0;i< ms;i++)
{
for(j=0;j< 100;j++)
{
;
}
}
}
這段代碼中main函數外的程序段跟前面的一樣,現在主要看main函數內部的程序。
首先我們要了解的是兩位或以上的數碼管同時顯示不一樣的內容應用的原理是人眼視覺暫留的特點。其實顯示器都是根據這一原理來設計的。
那什么是視覺暫留呢?視覺暫留(英文:Persistence of vision)也稱為正片后像,是光對視網膜所產生的視覺,在光停止作用后,仍然保留一段時間的現象,其具體應用是電影的拍攝和放映。原因是由視神經的反應速度造成的,其時值約是1/16秒,對于不同頻率的光有不同的暫留時間。比如:我們日常使用的日光燈每秒大約熄滅100余次,但我們基本感覺不到日光燈的閃動,這就是因為視覺暫留的作用。我們平時說的某動畫片,電影是30幀每秒的,電腦顯示屏是75fps的,手機顯示屏是120fps的,都是指屏幕刷新率,屏幕就是不停閃爍的,只是什么看不到它的閃爍而已。如果哪天外星人來了,或許它們就能看出吧。
視覺暫留現象首先是咱們中國人發現的,走馬燈便是據歷史記載中最早的視覺暫留運用。宋時已有走馬燈,當時稱“馬騎燈”。隨后法國人保羅·羅蓋在1828年發明了留影盤,它是一個被繩子在兩面穿過的圓盤。盤的一個面畫了一只鳥,另一面畫了一個空籠子。當圓盤旋轉時,鳥在籠子里出現了。這證明了當眼睛看到一系列圖像時,它一次保留一個圖像。再后來就有了電影,最后又了顯示屏。
現在回來我們正題,我們讓數碼管同時顯示兩位不一樣的數字該怎么操作呢?是不是先顯示第一位,然后馬上又顯示第二位,后面再這么一直循環往復就形成了視覺暫留效果,數碼管上的數據看起來就成了靜態不變的數據了。現在看注釋是不是就能看明白了?
當然這種做法知識最基礎辦法,當我們在復雜應用中這么使用時不合理的,至于為什么呢,我們后面介紹其他內容時再詳細講解。另外這個應用電路圖僅僅也是適用于仿真用,實際使用時還是需要進一步優化的,因為數碼管中每個LED燈點亮需要耗費的電流都是比較大的了,如果同時亮很多燈,對于驅動能力若的單片機可能會遇到的問題是:你把邏輯正確的程序下載進去,結果沒有任何顯示,或顯示不正常。這種情況可能真的不是你的程序問題,而是單片機帶不動它,就像你是一個100斤的瘦子去背一個300斤的胖子一樣,要么你瞬間被壓第地上,如果你很堅強那就還能走走停停動兩步吧。
在進化設計電路時要參考單片機數據手冊中的電流參數來確定你的電路是否合理。遇到可能使電路工作不正常的情況我們需要借助一些外部芯片來驅動它,比如使用鎖存器或專用驅動芯片,鎖存器一是可以幫助單片機鍵顯示數據暫時鎖存利于減少單片機內部CPU資源消耗,二是可以它可以加大驅動電流,使得顯示電路不影響單片機內部工作的穩定。
做過項目的朋友應該對電路中電流的波動對產品性能的影響非常有印象吧。因為我在我創業之前我的本職工作一直都是做醫療器械。因電流電路中變化產品出現的大小問題基本都是能看的出來(雖然我主要職責是軟件開發的,電路整改由硬件工程師負責)。因為醫療電子行業是國家限制最嚴格的一個行業,人命關天,即使是萬分之一概率事故發生你都承擔不了。不過這個行業薪資還是很不錯的,不比互聯網差多少(具體差不差也還看個人能力哈),有興趣的朋友這是一個很好的選擇。但做這行你要沉得住氣,做好一個產品2~3年,甚至更久都不能上市的準備,也就是你至少要熬出一款產品來。過程會比較枯燥,但程序員不都是自樂其中嗎,干啥不是干呢,有錢就行,對吧?
-
三極管
+關注
關注
142文章
3603瀏覽量
121677 -
MOS管
+關注
關注
108文章
2397瀏覽量
66627 -
數碼管
+關注
關注
32文章
1876瀏覽量
90970 -
單片機控制
+關注
關注
0文章
59瀏覽量
18706 -
LED發光
+關注
關注
0文章
23瀏覽量
8246
發布評論請先 登錄
相關推薦
評論