數(shù)碼管基礎(chǔ)知識(shí)
今天我們先來了解一種新的元器件--數(shù)碼管。數(shù)電教材中一般將他和譯碼一起講解。它是一種顯示器件,現(xiàn)在我們來看看它是一個(gè)什么樣的東西。
以上是最常見的一些數(shù)碼管,當(dāng)然它的外觀樣式非常多,那它的工作原理是怎么樣的呢?
我們現(xiàn)在來看一下它內(nèi)部結(jié)構(gòu)應(yīng)該就能知道它的顯示原理了。
其內(nèi)部就是由一些LED電路構(gòu)成,固定在其底面,然后表面通過注塑一些透明材料讓顯示部分在內(nèi)部LED發(fā)光時(shí)能夠顯示出來,從而達(dá)到顯示信息的效果。這種顯示器是最簡(jiǎn)單,也是最經(jīng)濟(jì)的一種顯示工具。在我們?nèi)粘I钪械碾娖髦惺欠浅3R姷模嘈糯蠖鄶?shù)人都遇到過,只是在這之前你可能不會(huì)想到它叫數(shù)碼管顯示屏。正是因?yàn)樗倪@些特點(diǎn)所以市面上各種各樣的數(shù)碼管顯示屏都有,大家都可以定制一些特定顯示內(nèi)容的屏用在自己的產(chǎn)品上,你若有意把自己的名字制作成屏都可以,哈哈哈……這也是我在電子元器件基礎(chǔ)知識(shí)中沒有介紹它的原因。再來看看它內(nèi)部電路結(jié)構(gòu),剛學(xué)完點(diǎn)亮LED 的朋友是否能想到點(diǎn)亮它的辦法呢?
上圖中的共陰,共陽又是什么意思?從圖中很容易看出來,共陰型數(shù)碼管的所有LED的陰極是接在一起的,而共陽型數(shù)碼管剛好相反,這還是很好區(qū)分的吧。那這么做的目的是什么呢?把某一端接在一起,這樣制作時(shí)就內(nèi)部可以省一些線路,又可以少引出幾個(gè)端口吧。如果使用的是共陽型數(shù)碼管,在使用時(shí)將公共端接到地,這時(shí)要點(diǎn)亮哪一段就將所在端的LED設(shè)置為高電平就好了。
看完以上說明你也會(huì)覺得數(shù)碼管也是很簡(jiǎn)單的吧,但是也先別那么得以,任何簡(jiǎn)單的應(yīng)用原理背后都還隱藏很多復(fù)雜的事情,這只是顯示原理最基礎(chǔ)的一內(nèi)容。當(dāng)然,對(duì)于還不會(huì)使用單片機(jī)控制數(shù)碼管的朋友也不用擔(dān)心,接著看后面的內(nèi)容你就可以入門了。如果你已經(jīng)會(huì)使用數(shù)碼管了不妨再來看看下面這個(gè)圖中的數(shù)碼管,你會(huì)使用它嗎(沒基礎(chǔ)的朋友先跳過這個(gè)問題),注意它只有8個(gè)引腳!這應(yīng)該是擴(kuò)音器或藍(lán)牙音箱產(chǎn)品上用的顯示屏。
P0端口和排阻
根據(jù)以上原理分析,我設(shè)計(jì)如下的一個(gè)電路,接下來我們?cè)谶@個(gè)電路上進(jìn)行講解數(shù)碼管顯示控制的編程內(nèi)容。
細(xì)心的朋友可能發(fā)現(xiàn)了數(shù)碼管連接的單片機(jī)P0端口每個(gè)引腳都接在了一個(gè)元件上,這是什么意思呢?這個(gè)元器件叫做排阻,簡(jiǎn)單說它就是有一排電阻,也就是說它內(nèi)部包含了一組參數(shù)相同的電阻,說白了它還是電阻。我們?yōu)槭裁匆褂眠@種電阻呢,看我們?cè)诮覮ED的電路中使用了8個(gè)一樣的電阻,為了話電路圖時(shí)方便或減少電路板的空間我們是不是也可以像數(shù)碼管一樣把公用的一端接一起呢,是吧?所以就出現(xiàn)了排阻這種器件。當(dāng)然如果不考慮這兩問題的話我們也可以用單獨(dú)的電阻代替,
不過它內(nèi)部結(jié)構(gòu)不一定就剛剛好一個(gè)獨(dú)立引腳對(duì)應(yīng)一個(gè)單獨(dú)的電阻,它可能有具體的一些內(nèi)部電路,但是我們使用時(shí)把它等效成每個(gè)對(duì)應(yīng)一個(gè)電阻就好了。
現(xiàn)在的排阻大多都是貼片的了,像下面這樣:
那我們電路中P0端口為何要接一組排阻到電源呢?這就涉及到P0端口特殊的結(jié)構(gòu)了,在我們介紹單片機(jī)基礎(chǔ)是文章中我們提到了,現(xiàn)在再做一些具體的介紹。
P0端口是開漏設(shè)計(jì)的,我們查看芯片數(shù)據(jù)手冊(cè)來看一下。
官方手冊(cè)是這么說的,是不是看了還是很迷糊?
說到開漏一詞是不是有似曾相識(shí)的感覺,模電課程考及格的朋友應(yīng)該都會(huì)有印象。看上面的圖也可以看出來,就是端口是直接接在一個(gè)nmos管漏極的,nmos管漏極沒有有電源電路連接,我們前面介紹三極管與mos管驅(qū)動(dòng)LED的視頻中nmos管的漏極是要與電源連接才能驅(qū)動(dòng)LED吧,這里也是是個(gè)道理。開漏輸出端口是沒有能力輸出高電平驅(qū)動(dòng)負(fù)載的,當(dāng)控制其輸出低電平時(shí)其引腳將接地,控制其輸出高電平時(shí)引腳既不輸出高電平,也不輸出低電平,為高阻態(tài)狀態(tài)。所以現(xiàn)在知道我們?yōu)槭裁葱枰右慌抛璧诫娫戳税桑窟@個(gè)電阻我們也稱之為上拉電阻,就是將引腳接到電源端的電阻,與之對(duì)應(yīng)的是下拉電阻,就是將引腳接到地端的電阻。
任何顯示具體數(shù)據(jù)
現(xiàn)在問題來了,如我們上面設(shè)計(jì)的電路所示,我們要怎么做才能讓數(shù)碼管上顯示出我們需要顯示的內(nèi)容(比如數(shù)字0,1……9)呢?這時(shí)就需要根據(jù)其內(nèi)部電路分布推算出顯示信息對(duì)應(yīng)的控制位的數(shù)據(jù)了,以我們使用的圖為例,比如要顯示“0”這個(gè)符號(hào)就需要點(diǎn)亮a,b,c,d,e,f這六段,在我們的單片機(jī)中與這六段相連的引腳都要輸出高電平才能點(diǎn)亮。使用這時(shí)我們就將P0端口輸出數(shù)據(jù)數(shù)值為0x3f,同樣的方法我們可以推斷出顯示其他數(shù)據(jù)時(shí)P0端口對(duì)應(yīng)輸出的數(shù)據(jù)。把它計(jì)算出來做成一個(gè)真值表,以后使用時(shí)就很方便了,當(dāng)然這其中需要你根據(jù)具體的電路接線圖來確定數(shù)據(jù)的。實(shí)際做項(xiàng)目時(shí)肯定會(huì)遇到不是同一組端口中連接數(shù)碼管各段的情況,所以現(xiàn)在掌握好基礎(chǔ)知識(shí)后遇到其他情況就需要靈魂處理了。
數(shù)組與數(shù)據(jù)顯示
現(xiàn)在我們來看看顯示一個(gè)數(shù)的程序要怎么實(shí)現(xiàn)。
#include
#include
sbit com1 = P2^0; //定義數(shù)碼管com1引腳
sbit com2 = P2^1; //定義數(shù)碼管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) //定義函數(shù)
{
u8 i,j;
for(i=0;i
}
com1,com2是聲明連接數(shù)碼管兩個(gè)公共端的,只使用一位數(shù)碼管時(shí)可以不用定義,將其公共端直接接地就行,后面的程序中我們會(huì)使用到這兩端口。
程序中出現(xiàn)了我們之前沒有介紹的內(nèi)容--u8 code num_codelist[10],這種數(shù)據(jù)結(jié)構(gòu)叫數(shù)組,在C語言中它用來有序存儲(chǔ)一組相同類型的數(shù)據(jù),"[n]"中的n就是它的序號(hào),也稱它為下標(biāo)。它的基礎(chǔ)定義方式為:
數(shù)據(jù)類型 數(shù)組名 [數(shù)組元素總數(shù)N];
例如:unsigned char code[10];
它的意思是定義了一個(gè)有十位數(shù)據(jù)的數(shù)組。
它的下標(biāo)計(jì)數(shù)規(guī)則是從0開始計(jì)數(shù)的,即以上數(shù)組中第一位數(shù)據(jù)為code[0]。
如果我們定義時(shí)沒對(duì)其進(jìn)行賦值,編譯器一般會(huì)將其中所有內(nèi)容初始化為0(但不一定所有編譯器都是默認(rèn)這么處理的,所有定義時(shí)最好還是初始化一下比較安全)。我們也可以在定義時(shí)對(duì)其中內(nèi)容進(jìn)行賦值,且賦值時(shí)不一定全都要賦值,可以只賦前面一位或幾位部分,未賦值的內(nèi)容還是會(huì)被初始化為0。
有時(shí)我們定義時(shí)也可以省略其數(shù)組元素總數(shù)N,比如:
unsigned char code[] = {1,2,3,4};
這時(shí)編譯器將自動(dòng)識(shí)別出數(shù)組元素總數(shù)N為4。
數(shù)組元素總數(shù)N是定義后就不能變的,即在后面的程序中不能對(duì)數(shù)組添加內(nèi)容,但改變其中的數(shù)據(jù)是可以的。
剛才講的數(shù)組,我們稱為一維數(shù)組,當(dāng)然數(shù)組也可以是二維或多維的,就和我們排隊(duì)一樣,可以排成一排,也可以排成多行,比如定義二維數(shù)組:
unsigned char code[2][5];
這里的意思就是D定義了一個(gè)有2行5列的二維數(shù)組。
使用時(shí)行列下標(biāo)都要包含,比如code[0][2]就是第一行第三列的數(shù)據(jù)。
其他多維數(shù)組以此類推。
關(guān)于數(shù)組我們先介紹這些基礎(chǔ)內(nèi)容,更多知識(shí)內(nèi)容后面遇到時(shí)再詳細(xì)講解。
那為什么在C51單片機(jī)編程時(shí)使用的是code table[]格式呢,這里我們添加了一個(gè)關(guān)鍵詞code,是編譯器決定的,和前面的sfr 和sbit情況類似 ,這些是要記住的內(nèi)容,如果換其他編譯器也要視情況而定,每種編譯器使用的規(guī)則各有不同。
后面的main函數(shù)內(nèi)容就是讓數(shù)碼管從0~9依次切換顯示數(shù)字了。
任何實(shí)現(xiàn)動(dòng)態(tài)數(shù)字顯示
上面只是顯示一位數(shù)據(jù),在實(shí)際情況中要顯示二位甚至多位該怎么處理呢?接下來我們看看顯示兩位時(shí)要怎么編程。
#include
#include
sbit com1 = P2^0; //定義數(shù)碼管com1引腳
sbit com2 = P2^1; //定義數(shù)碼管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()
{
//顯示第一位數(shù)字0
com1 = 0;//將第一位的com端設(shè)置為低電平
com2 = 1;
P0 = num_codelist[0];
delay(1);
P0 = 0x00;
com1 = 1;
com2 = 0;//將第二位的com端設(shè)置為低電平
P0 = num_codelist[1];
delay(1);
P0 = 0x00;
}
void delay(u8 ms) //定義函數(shù)
{
u8 i,j;
for(i=0;i
}
這段代碼中main函數(shù)外的程序段跟前面的一樣,現(xiàn)在主要看main函數(shù)內(nèi)部的程序。
首先我們要了解的是兩位或以上的數(shù)碼管同時(shí)顯示不一樣的內(nèi)容應(yīng)用的原理是人眼視覺暫留的特點(diǎn)。其實(shí)顯示器都是根據(jù)這一原理來設(shè)計(jì)的。
那什么是視覺暫留呢?視覺暫留(英文:Persistence of vision)也稱為正片后像,是光對(duì)視網(wǎng)膜所產(chǎn)生的視覺,在光停止作用后,仍然保留一段時(shí)間的現(xiàn)象,其具體應(yīng)用是電影的拍攝和放映。原因是由視神經(jīng)的反應(yīng)速度造成的,其時(shí)值約是1/16秒,對(duì)于不同頻率的光有不同的暫留時(shí)間。比如:我們?nèi)粘J褂玫娜展鉄裘棵氪蠹s熄滅100余次,但我們基本感覺不到日光燈的閃動(dòng),這就是因?yàn)橐曈X暫留的作用。我們平時(shí)說的某動(dòng)畫片,電影是30幀每秒的,電腦顯示屏是75fps的,手機(jī)顯示屏是120fps的,都是指屏幕刷新率,屏幕就是不停閃爍的,只是什么看不到它的閃爍而已。如果哪天外星人來了,或許它們就能看出吧。
視覺暫留現(xiàn)象首先是咱們中國(guó)人發(fā)現(xiàn)的,走馬燈便是據(jù)歷史記載中最早的視覺暫留運(yùn)用。宋時(shí)已有走馬燈,當(dāng)時(shí)稱“馬騎燈”。隨后法國(guó)人保羅·羅蓋在1828年發(fā)明了留影盤,它是一個(gè)被繩子在兩面穿過的圓盤。盤的一個(gè)面畫了一只鳥,另一面畫了一個(gè)空籠子。當(dāng)圓盤旋轉(zhuǎn)時(shí),鳥在籠子里出現(xiàn)了。這證明了當(dāng)眼睛看到一系列圖像時(shí),它一次保留一個(gè)圖像。再后來就有了電影,最后又了顯示屏。
現(xiàn)在回來我們正題,我們讓數(shù)碼管同時(shí)顯示兩位不一樣的數(shù)字該怎么操作呢?是不是先顯示第一位,然后馬上又顯示第二位,后面再這么一直循環(huán)往復(fù)就形成了視覺暫留效果,數(shù)碼管上的數(shù)據(jù)看起來就成了靜態(tài)不變的數(shù)據(jù)了。現(xiàn)在看注釋是不是就能看明白了?
當(dāng)然這種做法知識(shí)最基礎(chǔ)辦法,當(dāng)我們?cè)趶?fù)雜應(yīng)用中這么使用時(shí)不合理的,至于為什么呢,我們后面介紹其他內(nèi)容時(shí)再詳細(xì)講解。另外這個(gè)應(yīng)用電路圖僅僅也是適用于仿真用,實(shí)際使用時(shí)還是需要進(jìn)一步優(yōu)化的,因?yàn)閿?shù)碼管中每個(gè)LED燈點(diǎn)亮需要耗費(fèi)的電流都是比較大的了,如果同時(shí)亮很多燈,對(duì)于驅(qū)動(dòng)能力若的單片機(jī)可能會(huì)遇到的問題是:你把邏輯正確的程序下載進(jìn)去,結(jié)果沒有任何顯示,或顯示不正常。這種情況可能真的不是你的程序問題,而是單片機(jī)帶不動(dòng)它,就像你是一個(gè)100斤的瘦子去背一個(gè)300斤的胖子一樣,要么你瞬間被壓第地上,如果你很堅(jiān)強(qiáng)那就還能走走停停動(dòng)兩步吧。
在進(jìn)化設(shè)計(jì)電路時(shí)要參考單片機(jī)數(shù)據(jù)手冊(cè)中的電流參數(shù)來確定你的電路是否合理。遇到可能使電路工作不正常的情況我們需要借助一些外部芯片來驅(qū)動(dòng)它,比如使用鎖存器或?qū)S?a target="_blank">驅(qū)動(dòng)芯片,鎖存器一是可以幫助單片機(jī)鍵顯示數(shù)據(jù)暫時(shí)鎖存利于減少單片機(jī)內(nèi)部CPU資源消耗,二是可以它可以加大驅(qū)動(dòng)電流,使得顯示電路不影響單片機(jī)內(nèi)部工作的穩(wěn)定。
做過項(xiàng)目的朋友應(yīng)該對(duì)電路中電流的波動(dòng)對(duì)產(chǎn)品性能的影響非常有印象吧。因?yàn)槲以谖覄?chuàng)業(yè)之前我的本職工作一直都是做醫(yī)療器械。因電流電路中變化產(chǎn)品出現(xiàn)的大小問題基本都是能看的出來(雖然我主要職責(zé)是軟件開發(fā)的,電路整改由硬件工程師負(fù)責(zé))。因?yàn)?a href="http://m.xsypw.cn/soft/data/39-96/" target="_blank">醫(yī)療電子行業(yè)是國(guó)家限制最嚴(yán)格的一個(gè)行業(yè),人命關(guān)天,即使是萬分之一概率事故發(fā)生你都承擔(dān)不了。不過這個(gè)行業(yè)薪資還是很不錯(cuò)的,不比互聯(lián)網(wǎng)差多少(具體差不差也還看個(gè)人能力哈),有興趣的朋友這是一個(gè)很好的選擇。但做這行你要沉得住氣,做好一個(gè)產(chǎn)品2~3年,甚至更久都不能上市的準(zhǔn)備,也就是你至少要熬出一款產(chǎn)品來。過程會(huì)比較枯燥,但程序員不都是自樂其中嗎,干啥不是干呢,有錢就行,對(duì)吧?
評(píng)論