官术网_书友最值得收藏!

第4章 LED數碼管靜態驅動原理

如果你覺得實現LED閃爍功能沒什么挑戰,那就試試LED數碼管(segment display,下文簡稱數碼管)吧!它是將多個LED發光單元制作成一定的形狀,并按特定位置排列封裝在一起的顯示器件。最常用的數碼管是“8”字型的,相應的一位數碼管引腳定義通常如圖4.1所示。

圖4.1 一位數碼管的引腳定義

一位數碼管通常有兩種引腳排列方式,圖4.1b所示排列方式一般存在于尺寸比較小的數碼管中(例如9mm),這樣可以使引腳的間距不會那么緊張(因為數碼管的寬度比較小)。這里所說的9mm指的是數碼管“8”字的高度,換算成英制單位就是0.36in(英寸),如圖4.2所示。

圖4.2 0.36in數碼管

英寸是電子工程師對數碼管大小的通俗稱謂,其他常用的還有0.4英寸、0.56英寸等。為了方便對數碼管進行顯示控制,我們使用字母對每個LED發光單元進行了標記,也稱為“段(Segment)”。“8”字型數碼管按段的數量通常可分為七段與八段,后者比前者多了右下方那一個小數點(dp)發光單元。需要注意的是,不同廠家數碼管的引腳分布可能不是完全一致的,對于圖4.1a所示數碼管,左下角引腳號為1,其對應為e段,然后逆時針分別為引腳2,其對應為d段,其他依此類推。

LED數碼管按內部LED發光單元的具體連接方式可分為共陽(Common Anode,CA)與共陰(Common Cathnode,CC)兩類,共陽八段LED數碼管的內部電路如圖4.3所示。

圖4.3 共陽八段LED數碼管內部電路

從圖中可以看到,八個段對應的LED陽極都是連接在一起的,所以才稱其為共陽極,而這個公共陽極引腳也經常會標記為COM。在實際應用時,共陽數碼管的COM引腳應該與高電平(通常是正電源)連接,此時如果將某個LED的陰極設置為低電平“0”,相應的字段就會被點亮,而將某個LED的陰極設置為高電平“1”時,相應的字段就不會被點亮。例如,顯示數字“6”時對應各段的狀態如圖4.4所示。

圖4.4 共陽數碼管的輸入電平相應的顯示狀態

還有一種共陰極類型的LED數碼管,它將所有LED的陰極連接到一起并引出一個公共陰極(COM)。與共陽數碼管恰好相反,在實際應用時,COM引腳應該接低電平(通常是公共地),相應的內部電路如圖4.5所示。

圖4.5 八段LED共陰數碼管內部電路示意

圖4.1中引腳名A(C)就表示“共陽(共陰)”,這也意味著同一型號數碼管的引腳是完全兼容的。為了方便后續使用單片機控制數碼管顯示需要的字符,這里總結了顯示各種字符時各段對應的輸入電平狀態。共陰數碼管的顯示字符與相應的驅動電平信號見表4.1所示。

表4.1 共陰數碼管顯示字符及相應的驅動電平信號

所有段驅動電平的十六進制碼稱為字型碼(注意各段對應字型碼的位順序,低位為段a,高位為段g),將共陰數碼管的字型碼取反就可以直接驅動共陽數碼管。例如,共陽數碼管需要顯示字符“6”時,將共陰數碼管顯示字符“6”所需的字型碼0x7D(0b111_1101,下劃線為位分隔符,無實際意義,當位數比較多時有助于閱讀)全部取反(非邏輯)得到0x02(0b000_0010)即可。

在使用單片機產生控制電平時,一般不使用引腳直接驅動數碼管,因為需要的控制引腳數量比較多,單片機消耗的總電流可能會比較大,容易引起發熱而導致系統不穩定。最常用的方法就是使用三極管間接驅動,共陰數碼管的驅動方案仿真電路如圖4.6所示。

圖4.6 單片機間接驅動共陰數碼管

在硬件電路設計方面,需要特別注意數碼管段引腳與單片機P1控制引腳之間的對應關系。Proteus軟件平臺中一位數碼管引腳定義從左至右依次為a、b、c、d、e、f、g、dp(未使用),我們將P1口的最低位P1.0與段a對應,將P1.6與段g對應,這意味著表4.1中的共陰字型碼可以直接使用。

下面來實現數碼管循環顯示數字0~9的功能,其相應的源代碼如清單4.1所示。

清單4.1 驅動共陰數碼管源代碼

首先定義了一個display_char數組,并且使用表4.1所示共陰數碼管的字型碼進行初始化,數組索引0所在位置保存數字0的字型碼,數組索引1所在位置保存數字1的字型碼,其他依此類推。這樣我們就可以直接通過查表的方式獲得數字0~9對應的字型碼。

接下來發生的事情就很容易預料到了,在main函數中,我們定義了一個變量i保存將要顯示的數字,同時將其初始化為0,表示將要從0開始顯示。然后在while語句中利用變量i從display_char數組中查到數字0對應的字型碼賦給P1口,也就能夠將數碼管顯示數字0。緊接著我們延時約1秒后再對變量i進行累加,變量i每變化一次就能夠使數碼管顯示相應的數字。當變量i累加后的值大于8(也就是當前顯示數字為9)時置0,然后循環執行上述過程即可。

需要注意的是,我們在將字型碼推送到P1口之前將其進行了位取反(運算符“~”),這是為了抵消PNP型三極管本身就是反相邏輯的事實。另外,圖4.6所示電路在仿真時有些顯示數字會出現亂碼,這是由于數碼管的仿真模型導致的,實際器件搭建的電路不會出現這種問題。

下面同樣來看看共陽數碼管的驅動方案,如圖4.7所示。

圖4.7 單片機間接驅動共陽數碼管

圖4.7所示電路的仿真結果完全無效(使用實際元器件搭建的電路是可以正常工作的),總是顯示數字8(圖4.6所示電路的仿真結果雖然有些亂碼,但還是可以看得出顯示數字的變化)。這是因為Proteus軟件平臺中數碼管的顯示行為是由軟件模擬的,它將所有段引腳都定義為輸入(Input),當三極管因基極輸入為低電平而處于截止狀態時,理論上相應的段引腳上出現的是高電平(而使發光單元熄滅),但是LED數碼管仿真器件可不像實際的LED那樣:給陽極施加正電壓就會從陰極出現稍小一些的正電壓。換句話說,此時所有三極管都工作在開集(Open Collector,OC)輸出狀態(三極管的集電極是開路的),它們不具備輸出高電平而讓數碼管熄滅的能力。為了讓其顯示正常,我們需要在每個三極管的集電極與電源之間連接一個上拉電阻(例如1kΩ),代碼可以直接使用清單4.1,但要取消給P1賦值前的取反操作。

可以看到,使用三極管驅動LED數碼管需要的元器件還是有點多,為了進一步簡化電路,也可以使用ULN2003A芯片來驅動,如圖4.8所示。

圖4.8 使用ULN2003A芯片驅動共陽數碼管

ULN2003A內部包含7路反相器,它發揮的功能與圖4.7所示電路中的NPN型三極管完全一樣(即輸入端為高電平時輸出端為低電平,輸入端為低電平時輸出端為高電平),只不過每個反相器都是由高耐壓、大電流的復合管組成,可以用來驅動高達500mA的電流,用來驅動LED數碼管自然也不在話下。

ULN2003A內部每一路反相器的電路結構如圖4.9所示。

圖4.9 ULN2003A內部反相器

由于輸入已經集成了一個2.7kΩ的基極電阻,所以可以省略三極管基極的限流電阻,3kΩ的電阻可以將VT1的部分穿透電流分流到地,防止進一步被VT2放大引起熱失控現象。另外,每一路反相器的輸出都與一個二極管的陽極連接,在驅動諸如繼電器、電動機等感性負載時,二極管的陰極(COM引腳)必須與電源連接,該二極管反相并聯在感性負載兩端,當負載回路斷開時能夠為電感提供續流回路(也因此而稱為續流二極管),以防止電感兩端產生高壓擊穿三極管。很明顯,ULN2003A也是OC輸出結構,所以我們在仿真電路中加入了7個上拉電阻才能使結果正確,這些上拉電阻在實際元器件搭建的電路中也是不需要的。

還有一種“米”字形數碼管,其內部結構與“8”字形數碼管完全一樣,只不過具有更多的發光段而已,在此我們僅給出兩種“米”字形數碼管的常用段定義,如圖4.10所示。

圖4.10 “米”字形數碼管段定義

對于不愿進行代碼的煩瑣編寫但又想體驗數碼管顯示控制的讀者,可以使用更方便的VisualCom軟件平臺,它所包含的顯示仿真器件比Proteus軟件平臺更豐富。先來看看單步運行狀態下的一位共陰數碼管顯示仿真效果,如圖4.11所示。

VisualCom軟件平臺有一個非常方便的功能就是“數據預置”,可以給從器件庫調出的器件預置一個或多個數據或命令,并實時觀察相應的顯示狀態及內部寄存器或內存數據(如果器件有的話,詳見后述)。為了得到圖4.11所示仿真效果,先從“元器件庫”中調入相應的仿真器件,然后用鼠標右鍵單擊該器件,在彈出的快捷菜單中選擇“數據預置”項(或單擊工具欄上“數據預置”按鈕),即可彈出“數據預置”對話框,預置的數據如圖4.12所示。

圖4.11 一位共陰數碼管仿真效果

圖4.12 預置的數據

“預置數據”對話框中有一個表格,可以插入想要的數據行。其中,“類型”欄中可以是數據命令,對于數碼管這類簡單的顯示器件而言沒有意義。“附加”欄是擴展項,僅對特殊的器件有效。“十進制”與“十六進制”欄表示插入的具體數據或命令,兩欄的數據完全一樣,當向“十進制”欄輸入“63”,“十六進制”欄中就會顯示“3F”,反之亦然,這可以方便不同的進制數據輸入的場合。“自定義備注”欄可以為插入的行做注釋。

為了插入數據或命令行,可以選擇左下角的“插入數據”或“插入命令”按鈕,這會在表格的結尾插入行,也可以用鼠標右鍵單擊某行后在彈出的快捷菜單中選擇相應的選項,這可以在點擊的某行上方插入一行。當然,也可以對數據行進行移動、刪除等操作,此處不再贅述,詳情可參考VisualCom軟件平臺的幫助文檔。

該數碼管的段引腳定義與表4.1完全一樣,而且還包含了小數點(dp)與冒號(colon),預置數據與段的對應關系如圖4.13所示。

圖4.13 預置數據與段的對應關系

圖4.13中的預置數據為0b0_0110_1111(0x6F),也就是數字“9”的共陰字型碼。如果還需要同時點亮小數點與冒號,則相應的預置數據應為0b1_1110_1111(0x1EF)。我們在圖4.12中預置了表4.1所示數字0~9的字型碼,單擊“確定”按鈕后返回主窗口,每執行一次“單步運行”就會執行一條預置數據,多次執行“單步仿真”即可觀察到數碼管依次顯示數字0~9,“接口數據”窗口中會顯示當前處理的預置數據。另外,VisualCom軟件平臺也有“米”字形數碼管,有興趣的讀者可自行仿真,此處不再贅述。

注1:在后續討論顯示器件的過程中,如果Proteus軟件平臺并不存在對應的仿真器件,或者驅動源代碼大部分是類似的(例如控制時序完全相同,只是發送的數據有些差別),為節省篇幅,我們都會借助VisualCom軟件平臺進行仿真與分析。

注2:有關開集、熱失控、續流二極管等內容的詳細討論,可參考系列圖書《三極管應用分析精粹》。

主站蜘蛛池模板: 乳山市| 招远市| 泉州市| 股票| 和龙市| 龙井市| 肇州县| 延庆县| 斗六市| 三穗县| 南岸区| 远安县| 大理市| 扶绥县| 朔州市| 出国| 眉山市| 林西县| 剑河县| 刚察县| 金门县| 荃湾区| 长垣县| 丹寨县| 怀仁县| 凤凰县| 奇台县| 阳信县| 连州市| 罗定市| 临泽县| 东辽县| 安陆市| 大悟县| 宜章县| 永川市| 泸溪县| 荔浦县| 长岛县| 开封县| 西丰县|