通過上一課的學習,我們貌似成功的點亮了一個LED小燈,但是還有一些知識大家還沒有徹底明白。單片機是根據硬件電路圖的設計來寫代碼的,所以我們不僅僅要學習編程知識,還有硬件知識,也要進一步的學習,這節(jié)課我們就要來穿插介紹電路硬件知識。
3.1 電磁干擾EMI
第一個知識點,去耦電容的應用,那首先要介紹一下去耦電容的應用背景,這個背景就是電磁干擾,也就是傳說中的EMI。
1、冬天的時候,尤其是空氣比較干燥的內陸城市,很多朋友都有這樣的經歷,手觸碰到電腦外殼、鐵柜子等物品的時候會被電擊,實際上這就是“靜電放電”現象,也稱之為ESD。
2、不知道有沒有同學有這樣的經歷,早期我們使用電鉆這種電機設備,并且同時在聽收音機或者看電視的時候,收音機或者電視會出現雜音,這就是“快速瞬間群脈沖”的效果,也稱之為EFT。
3、以前的老電腦,有的性能不是很好,帶電熱插拔優(yōu)盤、移動硬盤等外圍設備的時候,內部會產生一個百萬分之一秒的電源切換,直接導致電腦出現藍屏或者重啟現象,就是熱插拔的“浪涌”效果,稱之為Surge。
... ...
電磁干擾的內容有很多,我們這里不能一一列舉,但是有些內容非常重要,后邊我們要一點點的了解。這些問題大家不要認為是小問題,比如一個簡單的靜電放電,我們用手能感覺到的靜電,可能已經達到3KV以上,如果用眼睛能看得到的,至少是5KV了,只是因為這個電壓雖然很高,電量卻很小,因此不會對人體造成傷害。但是我們應用的這些半導體元器件就不一樣了,一旦瞬間電壓過高,就有可能造成器件的損壞。而且,即使不損壞,在2、3里邊介紹的兩種現象,也嚴重干擾到我們正常使用電子設備了。
基于以上的這些問題,就誕生了電磁兼容(EMC)這個名詞。這節(jié)課我們僅僅講一下去耦電容的應用,電磁兼容的處理在我們今后設計電路,對PCB畫板布局中應用尤為重要,那是后話,暫且不說。
3.2 去耦電容的應用
首先我們來看圖3-1。
圖3-1 去耦電容應用
左邊這張圖,過了保險絲以后,接了一個470uF的電容C16,右邊這種圖,經過開關后,接了一個100uF的電容C19,并且并聯(lián)了一個0.1uF的電容C10。其中C16和C19起到的作用是一樣的,C10的作用和他們兩個不一樣,我們先來介紹這2個大一點的電容。
容值比較大的電容,理論上可以理解成水缸或者水池子,同時,大家可以直接把電流理解成水流,其實大自然萬物的原理都是類似的。
作用一,緩沖作用。當上電的瞬間,電流從電源處流下來的時候,不穩(wěn)定,容易沖擊電子器件,加個電容可以起到緩沖作用。就如同我們直接用水龍頭的水澆地,容易沖壞花花草草的。我們只需要在水龍頭處加個水池,讓水經過水池后再緩慢流進草地,就不會沖壞花草,起到有效的保護作用。
作用二,穩(wěn)定作用。我們一整套電路,后級的電子器件功率大小、電流大小也不一樣,器件工作的時候,電流大小不是一直持續(xù)不變的。比如后級有個器件還沒有工作的時候,電流消耗是100mA,突然它參與工作了,電流猛的增大到150mA了,這個時候如果沒有一個水缸的話,電路中的電壓(水位)就會直接突然下降,比如我們的5V電壓突然降低到3V了。而我們系統(tǒng)中有些電子元器件,必須高于一定的電壓才能正常工作,電壓太低就直接不工作了,這個時候水缸就必不可少了。電容會在這個時候把存儲在里邊的電流釋放一下,穩(wěn)定電壓,當然,隨后前級的電流會及時把水缸充滿的。
有了這個電容,可以說我們的電壓和電流就會很穩(wěn)定了,不會產生大的波動。這種電容常用的有以下三種:

圖3-2 鋁電解電容

圖3-3 鉭電容 圖3-4 陶瓷電容
這三種電容是我們常用的三種電容,其中第一種個頭大,占空間大,單位容量價格最便宜,第二種和第三種個頭小,占空間小,性能一般也略好于第一種,但是價格也貴不少。當然,除了價格,還有一些特殊參數,在通信要求高的場合也要考慮很多,這里暫且不說。我們板子上現在用的是第一種,只要在符合條件的情況下,第一種470uF的電容不到一毛錢,同樣的耐壓和容值,第二種和第三種可能得1塊錢左右。
電容的選取,第一個參數是耐壓值的考慮。我們用的是5V系統(tǒng),電容的耐壓值要高于5V,一般推薦1.5倍到2倍即可,有些場合稍微高于也可以。我們板子上用的是10V耐壓的。第二個參數是電容容值,這個就需要根據經驗來選取了,選取的時候,要看這個電容起作用的這塊系統(tǒng)的功率消耗情況,如果系統(tǒng)耗電較大,波動可能比較大,那么容值就要選大一些,反之,可以小一些。
剛開始同學們設計電路也模仿別人,別人用多大自己也用多大,慢慢積累。比如咱上邊講電容作用二的時候,電流從100mA突然增大到150mA的時候,其實即使加上這個電容,電壓也會輕微波動,比如從5V波動到4.9V,但是只要我們板子上的器件在電壓4.9V以上也可以正常工作的話,這點波動是沒有問題的,但是如果不加或者加的很小,電壓波動比較大,有些器件就會工作不正常了。但是如果加的太大,占空間并且價格也高,所以這個地方電容的選取多參考經驗。
第二個電容,容值較小,是0.1uF,也就是100nF,是用來濾除高頻信號干擾的。比如ESD,EFT等。有一點大家要清楚,我們初中學過電容可以通交流隔直流,但是電容的參數對不同頻率段的干擾的作用是不一樣的。這個100nF的電容,是我們的前輩根據干擾的頻率段,根據板子的參數,根據電容本身的參數所總結出來的一個值。也就是說,以后大家在設計數字電路的時候,在電源處的去耦高頻電容,直接用這個0.1uF就可以了,不需要去計算。
還有一點,就是大家看我們的電路圖可以看出來,通常在電路中可能瞬間電流較大的地方,會加一個大電容,比如在1602液晶左上角的那個,靠近了單片機的VCC以及1602液晶背光的VCC,起到穩(wěn)定電壓的作用,在左上角電機和蜂鳴器位置有一個,也是起到穩(wěn)定電壓的作用。還有在所有的IC器件的VCC和GND之間,都會放一個0.1uF的高頻去耦電容,特別在布板的時候,這個0.1uF電容要盡可能的靠近IC,盡量很順利的將這個IC的VCC和GND連到一起,這個大家先了解,細節(jié)以后再討論。
3.3 三極管在數字電路中的應用
三極管在我們數字電路和模擬電路中都有大量的應用,在我們開發(fā)板上也用了多個三極管。在我們板子上的LED小燈部分,就有這個三極管的應用了,圖3-5的LED電路中的 Q16就是一個PNP型的三極管。
圖3-5 LED電路
3.3.1 三極管的初步認識
三極管是一種很常用的控制和驅動器件,常用的三極管根據材料分有硅管和鍺管兩種,原理相同,壓降略有不同,本課程用硅管的參數來進行講課。三極管共有2種類型,分別是PNP型和NPN型,先來認識一下。

圖3-6 三極管示意圖
三極管一共有3個極,從圖3-6來看,橫向左側的引腳叫做基極(base),中間有一個箭頭,一頭連接基極,另外一頭連接的是發(fā)射極e(emitter),那剩下的一個引腳就是集電極c(collector)。這塊是必須要記住的內容,死記硬背即可,后邊慢慢用的多了,每次死記硬背一次,多次以后就會深入腦海了。
3.3.2 三極管的原理
三極管的應用有截止、放大、飽和三種狀態(tài)。放大狀態(tài)主要是對模擬信號而言,而且用法的計算內容比較復雜,暫時我們用不到。而我們數字電路主要使用三極管的開關特性,因此我們只用到了截止與飽和兩種狀態(tài),所以我們只講這兩種用法。三極管的類型和用法我給大家總結了一句口訣,大家要把這句口訣記牢了:箭頭朝內PNP,導通電壓順箭頭過,電壓導通,電流控制。
下面我們一句一句來解析口訣。大家可以看圖3-6,三極管有2種類型,箭頭朝內就是PNP,箭頭朝外自然就是NPN了,在實際應用中,往往我們要根據實際電路需求來選擇到底用哪種類型,大家用幾次估計就會了,很簡單。
三極管的用法特點,關鍵點在于b極(基極)和e級(發(fā)射極)之間的電壓情況,對于PNP而言,e極電壓只要高于b級0.7V以上,這個三極管e級和c級之間就可以順利導通。也就是說,控制端在b和e之間,被控制端是e和c之間。同理,NPN型三極管的導通電壓是b極比e極高0.7V,總之是箭頭的始端比末端高0.7V就可以導通三極管的e極和c極。這就是關于“導通電壓順箭頭過,電壓控制”的解釋,我們來看圖3-7。
圖3-7 三極管的用法
我們以圖3-7為例介紹一下。三極管基極通過一個10K的電阻接到了單片機的一個IO口上,發(fā)射極直接接到5V的電源上,集電極接了一個LED小燈,并且串聯(lián)了一個1K的限流電阻最終接到了電源負極GND上。
如果LEDS6我們程序給一個高電平1,那么基極b和發(fā)射極e都是5V,也就是說e到b不會產生一個0.7V的壓降,這個時候,發(fā)射極和集電極也就不會導通,那么豎著看這個電路在三極管處是斷開的,所以沒有電流通過,LED2小燈也就不會亮。如果我們程序給LEDS6的位置一個低電平0,而e極是個5V,產生壓差就會導通,三極管e和b之間大概有0.7V的電壓,那還有(5-0.7)V的電壓會在電阻R47上。這個時候,e和c之間也會導通了,那么LED小燈本身有2V的壓降,三極管本身e和c之間大概有0.2V的壓降,我們忽略不計。那么在R41上就會有大概3V的壓降,可以計算出來,這條之路的電流大概是3mA,可以成功點亮LED。
最后一個概念,電流控制。前邊講過,三極管有截止,放大,飽和三個狀態(tài),截止就不用說了,只要e和b之間不導通即可。我們要讓這個三極管處于飽和狀態(tài),就是我們所謂的開關特性,必須要滿足一個條件。三極管都有一個放大倍數β,要想處于飽和狀態(tài),b極電流就必須大于e和c之間電流值除以β。這個β,對于常用的三極管大概可以認為是100。那么上邊的R47的阻值我們必須要來計算一下了。
剛才我們算過了,e和c之間的電流是3mA,那么b極電流最小就是3mA除以100等于30uA,大概有4.3V電壓會在基極電阻上,那么基極電阻最大值就是4.3V/30uA = 143K。只要比這個值小就可以,當然也不能太小,STC89C52RC的IO口輸入電流最大理論值是25mA,我推薦不要超過10mA。
3.3.3 三極管的應用
三極管在我們數字電路里的開關特性,常用的一個是控制應用,一個是驅動應用。所謂的控制就是如同我們圖3-7里邊介紹的,我們可以通過單片機控制三極管的基極來間接控制后邊的小燈的亮滅,用法大家基本熟悉了。還有一個控制就是進行不同電壓之間的轉換控制,比如我們的單片機的IO口是5V系統(tǒng),如果直接接12V系統(tǒng)會燒壞單片機,所以我們加一個三極管,三極管的工作電壓高于單片機的IO口電壓,用5V的IO口來控制12V的電路,如圖3-8所示。
圖3-8 三極管控制電路圖
圖3-8里所示,當IO口輸出高電平5V時,三極管導通,OUT輸出低電平0V,當IO口輸出低電平時,三極管截止,OUT則由于上拉電阻R2的作用而輸出12V的高電平,這樣就實現了低電壓控制高電壓的工作原理。
所謂的驅動,主要是指電流輸出能力。我們再來看這兩個圖之間的對比
圖3-9 LED小燈對比示意圖
圖3-9中上邊的LED燈,和我們第二課講過的LED燈是一樣的,當IO口是高電平時,小燈熄滅,當IO口是低電平時,小燈點亮。
下邊那個圖呢,按照這種推理,IO口是高電平的時候,應該有電流流過并且點亮小燈,但是實際并非如此。
單片機主要是個控制器件,具備四兩撥千斤的特點。就如同杠桿必須有一個支點一樣,想要撐起整個地球必須有力量承受的支點。單片機的IO口可以輸出一個高電平,但是他的輸出電流很有限,普通IO口輸出高電平的時候,大概只有幾十到幾百uA的電流,達不到1mA,也就點不亮這個LED小燈或者亮度很低,這個時候如果我們想高電平點亮LED,用上三極管就可以這樣來處理,我們板上的這種型號,可以通過500mA的電流,有的三極管通過的電流還更大一些,如圖3-10所示。
圖3-10 三極管驅動LED小燈
圖3-10中,當IO口是高電平,三極管導通,因為三極管的電流放大作用,c極電流就可以達到mA以上了,就可以成功點亮LED小燈。
雖然我們用了IO口的低電平可以直接點亮LED,但是單片機的IO口作為低電平,輸入電流就可以很大嗎?這個我想大家都能猜出來,當然不可以。單片機的IO口電流承受能力,不同型號不完全一樣,就STC89C52來說,官方手冊的81頁有對電氣特性的介紹,整個單片機的工作電流,不要超過50mA,單個IO口總電流不要超過6mA。即使一些增強型51的IO口承受電流大一點,可以到25mA,但是還要受到總電流50mA的限制。那我們來看電路圖的8個LED小燈的這個部分電路,如圖3-11所示。

圖3-11 LED電路圖(一)
3-11圖示這里我們要學會看電路圖的一個知識點,大家注意看,電路圖右側所有的LED下側的線最終都連到一根黑色的粗線上去了,大家注意,這個地方不是實際的完全連到一起,而是一種總線的畫法,畫了這種線以后,表示這是個總線結構,所有的名字一樣的是一一對應的連接到一起,其他名字不一樣的,是不連到一起的。比如左側的DB0和右側的最左邊的LED2小燈下邊的DB0是連在一起的,而和DB1等其他線不是連在一起的。
那么我們把3-11電路圖里的我們現在需要講的這部分再摘出來看。
圖3-12 LED電路圖(二)
大家通過3-12的電路圖來計算一下,5V的電壓減去LED本身的壓降,減掉三極管e和c之間的壓降,限流電阻用的是330歐,那么每條支路的電流大概是8mA,那么8路LED如果全部同時點亮的話電流總和就是64mA。這樣如果直接接到單片機的IO口,那單片機肯定是承受受不住的,即使短時間可以承受,長時間工作就會不穩(wěn)定,甚至導致單片機燒毀。
有的同學會提出來可以加大限流電阻的方式來降低這個電流。比如改到1K,那么電流不到3mA,8路總的電流就是20mA左右。首先,降低電流會導致LED小燈亮度變弱,小燈的亮度可能關系不大,因為我們同樣的電路接了數碼管,后邊我們要講數碼管還要動態(tài)顯示,如果數碼管亮度不夠的話,那視覺效果就會很差,所以降低電流的方法并不可取;其次,對于單片機來說,他主要是起到控制作用,電流輸入和輸出的能力相對較弱,P0的8個口總電流也有一定限制,所以如果接一兩個LED小燈觀察,可以勉強直接用單片機的IO口來接,但是接多個小燈,從實際工程的角度去考慮,就不推薦直接接IO口了。那么我們如果要用單片機控制多個LED小燈該怎么辦呢?
除了三極管之外,其實還有一些驅動IC,這些驅動IC可以作為單片機的緩沖器,僅僅是電流驅動緩沖,不起到任何邏輯控制的效果,比如我們板子上用的74HC245D這個芯片,這個芯片在邏輯上起不到什么別的作用,就是當做電流緩沖器的,我們通過查看其數據手冊,74HC245穩(wěn)定工作在70mA電流是沒有問題的,比單片機的8個IO口大多了,所以我們可以把他接在小燈和IO口之間做緩沖,如圖3-13所示

圖3-13 74HC245功能圖
從圖3-13我們來分析,其中VCC和GND就不用多說了,細心的同學會發(fā)現這里有個0.1uF的去耦電容噢。
74HC245是個雙向緩沖器,1引腳DIR是方向引腳,當這個引腳接高電平的時候,右側所有的B編號的電壓都等于左側A編號對應的電壓。比如A0是高電平,那么B0就是高電平,A1是低電平,B1就是低電平等等。如果DIR引腳接低電平,得到的效果是左側A編號的電壓都會等于右側B編號對應的電壓。因為我們這個地方控制端是左側接的是P0口,所以我們要求B等于A的狀態(tài),所以1腳我們直接接的高電平。圖3-13中還有一排電阻R10到R17是上拉電阻,這個電阻的用法我們在后邊介紹。
還有最后一個使能引腳19腳OE,這個引腳上邊有一橫,表明是低電平有效,當接了低電平后,74HC245就會按照剛才上邊說的起到雙向緩沖器的作用,如果OE接了高電平,那么無論DIR怎么接,A和B的引腳是沒有關系的,也就是74HC245功能不能實現出來。
從我們的電路圖3-14可以看出來,我們的P0口和74HC245的A端是直接接起來的。這個地方,有個別同學有一個疑問,就是我們明明在電源VCC那地方加了一個三極管驅動了,為何還要再加245驅動芯片呢。這里大家要理解一個道理,電路上從正極經過器件到地,首先必須有電流才能正常工作,電路中任何一個位置斷開,都不會有電流,器件也就不會參與工作了。其次,和水流一個道理,從電源正極到負極的電流水管的粗細都要滿足要求,任何一個位置的管子過細,都會出現瓶頸效應,電流在整個通路中細管處會受到限制而降低,所以在電路通路的每個位置上,都要保證足夠通道足夠暢通,這個245的作用就是消除單片機IO這一環(huán)節(jié)的瓶頸。

圖3-14 單片機和74HC245接口
3.3.4 74HC138三八譯碼器的應用
在我們設計單片機電路的時候,單片機的IO口數量是有限的,有時并滿足不了我們的設計需求,比如我們的STC89C52RC一共是32個IO口,但是我們?yōu)榱丝刂聘嗟钠骷鸵褂靡恍┩鈬臄底中酒@種數字芯片由簡單的輸入邏輯來控制輸出邏輯,比如74HC138這個三八譯碼器,圖3-15是74HC138在我們原理圖上的一個應用。

圖3-15 74HC138應用原理圖
從這個名字來分析,三八譯碼器,就是把3種輸入狀態(tài)翻譯成8種輸出狀態(tài)。從圖3-15所看出來的,74HC138一共有1~6一共是6個輸入引腳,但是其中4、5、6這三個引腳是使能引腳。使能引腳和我們前邊講74HC245的OE引腳是一樣的,這三個引腳如果不符合規(guī)定的輸入要求,Y0到Y7不管你輸入的1、2、3引腳是什么電平狀態(tài),總是高電平。所以我們要想這個74HC138正常工作,ENLED那個輸入位置必須輸入低電平,ADDR3位置必須輸入高電平,這兩個位置都是使能控制端口。不知道大家是否記得我們第二課的程序有這么兩句ENLED = 0;ADDR3 = 1;就是控制使這個74HC138使能的。
這類邏輯芯片,大多都是有使能引腳的,使能符合要求了,那下面就要研究邏輯控制了。對于數字器件的引腳,如果一個引腳輸入的時候,有0和1兩種狀態(tài);對于兩個引腳輸入的時候,就會有00,01,10,11這四種狀態(tài)了,那么對于3個輸入的時候,就會出現8種狀態(tài)了,大家可以看下邊的這個真值表——圖3-16,其中輸入是A2,A1,A0的順序,輸出是從Y0,Y1....Y7的順序。
圖3-16 74HC148真值表
從圖3-16可以看出,任一輸入狀態(tài)下,只有一個輸出引腳是低電平,其他的引腳都是高電平。我們清楚的知道,8個LED小燈的總開關三極管Q16基極的控制端是LEDS6,也就是Y6輸出一個低電平的時候,可以開通三極管Q16,從右側的希望輸出的結果,我們可以推導出我們的A2,A1,A0的輸入狀態(tài)應該是110,那我們再來看下原理圖3-17。

圖3-17 點亮LED小燈整體示意圖
那么我們在整體捋一遍點亮LED小燈的過程,首先看74HC138,我們要讓LEDS6為低電平才能導通三極管Q16,所以ENLED = 0;ADDR3 = 1;保證74HC138使能。然后ADDR2 = 1; ADDR1 = 1; ADDR0 = 0;這樣保證了三極管Q16這個開關開通,5V電源加到LED上。
而74HC245左側是通過P0口控制,我們讓P0.0引腳等于0,就是DB_0等于0,而右側DB0等于DB_0的狀態(tài),也是0,那么這樣在這一排共8個LED小燈當中,只有最右側的小燈和5V之間有壓差,有壓差就會有電流通過,有電流通過我們的LED2就會發(fā)光。
74HC245左側我們可以看出來,是直接接到P0口上的,而74HC138的ADDR0 ~ ADDR3接在何處呢?

圖3-18 跳線帽接口部分
跳線帽是大家以后要常用的一個器件,他的作用就是起到導線的作用,我們可以通過跳線帽來實現連接線的切換。
圖3-19 跳線實物圖
大家看,跳線帽本身可以占2個針的位置,現在是把右側和中間的針插到了一起,這樣實現的就是圖3-18中的P1.0和ADDR0連接到一起,P1.1和ADDR1接一起,P1.2和ADDR2接一起,P1.3和ADDR3接一起。這樣就可以透徹理解我們第二課的程序了。
好了,大家認真再回顧一下我們第二課的那個程序,再領悟一下這幾個數字器件的用法。
3.4 LED閃爍程序
點亮LED小燈的程序我們第二課完成了,就是讓LED = 0;熄滅小燈的程序也很簡單,就是LED = 1;亮和滅中間加個時間延時,點亮和熄滅就都學會了,那么我們中間加個延時程序,反復不停的點亮和熄滅小燈,就成了閃爍了。
我們首先復習一下Keil寫程序的過程,建立工程--保存工程--建立文件--添加文件到工程--編寫程序--編譯--下載程序。
LED閃爍程序對于有C基礎的同學來說很簡單,那我先寫出來,大家可以先看下。沒有C語言基礎的同學也可以跟著抄一遍,下節(jié)課我會補充部分C語言基礎知識,這樣你先抄一遍后,再跟著看C語言基礎知識的時候也比較容易理解透徹。
#include<reg52.h> //包含寄存器的庫文件
sbit LED = P0^0; //位地址聲明,注意:sbit必須小寫!
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
unsigned int i = 0;
ENLED = 0;
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
ADDR3 = 1; //74HC138開啟三極管
while(1) //程序死循環(huán)
{
LED = 0; //點亮小燈
for(i=0;i<30000;i++); //延時一段時間
LED = 1; //熄滅小燈
for(i=0;i<30000;i++); //延時一段時間
}
}
大家把這個程序編譯一下,下載到單片機里,會發(fā)現LED2這個小燈會閃爍了。關于閃爍燈程序的詳解請看:http://www.zg4o1577.cn/mcuteach/248.html 里面有c語言和匯編2個版本的.
3.5 作業(yè)
1、深刻理解電容的意義,并且在今后的學習電路過程中要多多注意并且參考別人電路中所用到的去耦電路,積累經驗。
2、完全背過三極管的導通原理,并且可以熟練應用NPN和PNP這兩種三極管在開關特性下的應用方法。
3、學習并且掌握74HC245和74HC138的應用原理,能夠在設計電路中正確應用。
4、能夠獨立實現點亮開發(fā)板上的每一個小燈,并且可以實現小燈點亮和關閉以及閃爍功能。
上一課:第二章 點亮你的LED
下一課:第四章 C語言基礎以及流水燈的實現
|