前言
前面我們已經介紹了如何控制51 單片機的IO 口輸出高低電平,本教程我們通過另外一個實驗來講述51 單片機IO 口的輸出。通過單片機的IO 口控制板載數(shù)碼管顯示??梢詤⒖记懊娴膶嶒炚鹿?jié)內容。
一、數(shù)碼管介紹
1.數(shù)碼管簡介
數(shù)碼管是一種半導體發(fā)光器件,其基本單元是發(fā)光二極管。數(shù)碼管也稱LED數(shù)碼管,不同行業(yè)人士對數(shù)碼管的稱呼不一樣,其實都是同樣的產品。數(shù)碼管按段數(shù)可分為七段數(shù)碼管和八段數(shù)碼管,八段數(shù)碼管比七段數(shù)碼管多一個發(fā)光二極管單元,也就是多一個小數(shù)點(DP),這個小數(shù)點可以更精確的表示數(shù)碼管想要顯示的內容;按能顯示多少個(8)可分為1 位、2 位、3 位、4 位、5 位、6 位、7 位等數(shù)碼管。按發(fā)光二極管單元連接方式可分為共陽極數(shù)碼管和共陰極數(shù)碼管。
共陽數(shù)碼管是指將所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數(shù)碼管,共陽數(shù)碼管在應用時應將公共極COM 接到+5V,當某一字段發(fā)光二極管的陰極為低電平時,相應字段就點亮,當某一字段的陰極為高電平時,相應字段就不亮。
共陰數(shù)碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管,共陰數(shù)碼管在應用時應將公共極COM 接到地線GND 上,當某一字段發(fā)光二極管的陽極為高電平時,相應字段就點亮,當某一字段的陽極為低電平時,相應字段就不亮。
2.數(shù)碼管顯示原理
不管將幾位數(shù)碼管連在一起,數(shù)碼管的顯示原理都是一樣的,都是靠點亮內部的發(fā)光二極管來發(fā)光,下面我們就來講解一個數(shù)碼管是如何亮起來的。數(shù)碼管內部電路如下圖所示:
從上圖可看出,一位數(shù)碼管的引腳是10 個,顯示一個8 字需要7 個小段,另外還有一個小數(shù)點,所以其內部一共有8 個小的發(fā)光二極管,最后還有一個公共端,多數(shù)生產商為了封裝統(tǒng)一,單位數(shù)碼管都封裝10 個引腳,其中第3 和第8 引腳是連接在一起的。而它們的公共端又可分為共陽極和共陰極,圖中間為共陽極內部原理圖,右圖為共陰極內部原理圖。
對共陰極數(shù)碼來說,其8 個發(fā)光二極管的陰極在數(shù)碼管內部全部連接在一起,所以稱“共陰”,而它們的陽極是獨立的,通常在設計電路時一般把陰極接地。當我們給數(shù)碼管的任意一個陽極加一個高電平時,對應的這個發(fā)光二極管就點亮了。如果想要顯示出一個8 字,并且把右下角的小數(shù)點也點亮的話,可以給8個陽極全部送高電平,如果想讓它顯示出一個0 字,那么我們可以除了給第“g,dp” 這兩位送低電平外,其余引腳全部都送高電平,這樣它就顯示出0 字了。
如果使用共陰數(shù)碼管,需要注意增加單片機IO 口驅動電流,因為共陰數(shù)碼管是要靠單片機IO 口輸出電流來點亮的,但單片機I/O 口難以輸出穩(wěn)定的、如此大的電流,所以數(shù)碼管與單片機連接時需要加驅動電路,可以用上拉電阻的方法或使用專門的數(shù)碼管驅動芯片,比如74HC573、74HC245 等,其輸出電流較大,電路接口簡單。
共陽極數(shù)碼管其內部8 個發(fā)光二極管的所有陽極全部連接在一起,電路連接時,公共端接高電平,因此我們要點亮哪個發(fā)光管二極管就需要給陰極送低電平,此時顯示數(shù)字的編碼與共陰極編碼是相反的關系,數(shù)碼管內部發(fā)光二極管點亮時,也需要5mA 以上的電流,而且電流不可過大,否則會燒壞發(fā)光二極管。因此不僅要防止數(shù)碼管電流過大,同時要防止流經數(shù)碼管的電流集中到單片機時電流不能過大,否則會損壞主芯片。
一般共陽極數(shù)碼管更為常用,為什么呢?這是因為數(shù)碼管的非公共端往往接在IC 芯片的I/O 上,而IC 芯片的驅動能力往往是比較小的,如果采用共陰極數(shù)碼管,它的驅動端在非公共端, 就有可能受限于IC 芯片輸出電流不夠而顯示昏暗,要外加上拉電阻或者是增加三極管加大驅動能力。但是IC 芯片的灌電流,即輸入電流范圍比較大。所以使用共陽極數(shù)碼管的好處是:將驅動數(shù)碼管的工作交到公共端(一般接驅動電源),加大驅動電源的功率自然要比加大IC 芯片I/O口的驅動電流簡單許多。另一方面,這樣也能減輕主芯片的負擔。
我們開發(fā)板上使用了一個共陽數(shù)碼管作為靜態(tài)數(shù)碼管顯示,本章實驗也是在該數(shù)碼管上實現(xiàn)單個的靜態(tài)顯示。如果要讓共陰數(shù)碼管顯示數(shù)字0,即對應的段ABCDEF 要點亮即給它高電平,其他的段熄滅即給它低電平。其他的數(shù)字顯示方式一樣,這里就不多說。下面給出共陰和共陽數(shù)碼管的0-F 段碼數(shù)據(jù)表,如下所示:
①共陰數(shù)碼管碼表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,
0 1 2 3 4 5
0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c,
6 7 8 9 A B
0x39, 0x5e, 0x79, 0x71, 0x00,
C D E F 無顯示
②共陽數(shù)碼管碼表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92,
0 1 2 3 4 5
0x82, 0xF8, 0x80, 0x90, 0x88, 0x83,
6 7 8 9 A B
0xC6, 0xA1, 0x86, 0x8E, 0xFF,
C D E F 無顯示
從上述共陽和共陰碼表中不難發(fā)現(xiàn),它們的數(shù)據(jù)正好是相互取反的值。比如共陰數(shù)碼管數(shù)字0 段碼:0x3f,其二進制是:0011 1111,取反后為:1100 0000,轉換成16 進制即為0XC0。其他段碼依此類推。該段碼數(shù)據(jù)由來,是將a 段作為最低位,b 段作為次低位,其他按順序類推,dp 段為最高位,共8 位,正好和51 單片機的一組端口數(shù)一樣,因此可以直接使用某一組端口控制數(shù)碼管的段選數(shù)據(jù)口,比如P0 口。
3.數(shù)碼管靜態(tài)顯示原理
LED 數(shù)碼管顯示器工作方式有兩種:靜態(tài)顯示方式和動態(tài)顯示方式。靜態(tài)顯示的特點是每個數(shù)碼管的段選必須接一個8 位數(shù)據(jù)線來保持顯示的字形碼。當送入一次字形碼后,顯示字形可一直保持,直到送入新字形碼為止。這種方法的優(yōu)點是占用CPU 時間少,顯示便于監(jiān)測和控制。缺點是硬件電路比較復雜,成本較高,比如使用4 個靜態(tài)數(shù)碼管,那么就得32 個IO 來控制,這對51 單片機來說是無法承受的,正因為如此才會有后面章節(jié)動態(tài)數(shù)碼實驗的講解。
動態(tài)顯示的特點是將所有數(shù)碼管的段選線并聯(lián)在一起,由位選線控制是哪一位數(shù)碼管有效。選亮數(shù)碼管采用動態(tài)掃描顯示。所謂動態(tài)掃描顯示即輪流向各位數(shù)碼管送出字形碼和相應的位選,利用發(fā)光管的余輝和人眼視覺暫留作用,使人的感覺好像各位數(shù)碼管同時都在顯示。動態(tài)顯示的亮度比靜態(tài)顯示要差一些,所以在選擇限流電阻時應略小于靜態(tài)顯示電路中的。
本章實驗主要介紹靜態(tài)數(shù)碼管的控制,有關動態(tài)數(shù)碼管控制將在下一章節(jié)介紹。有關靜態(tài)數(shù)碼管的詳細介紹,大家可以在百度上查找了解。
二、硬件設計
開發(fā)板上的靜態(tài)數(shù)碼管模塊電路如下圖所示:
上圖電路是靜態(tài)數(shù)碼管電路,模塊獨立,使用的是1 個共陽數(shù)碼管組成,即8 位數(shù)碼管的段選數(shù)據(jù)a-dp 全部一起引出,數(shù)碼管的位選即公共端直接接VCC,根據(jù)共陽數(shù)碼管顯示特點可知,只要保證數(shù)碼管a-dp 段輸入電平為低電平即可點亮。由于使用的是共陽數(shù)碼管,公共極接VCC,所以在數(shù)碼管控制端可加一個限流電阻,阻值為470 歐(471)。本實驗使用P0 口連接J8 端子。
二、軟件設計
我們所要實現(xiàn)的功能是:控制靜態(tài)數(shù)碼管顯示數(shù)字0,即讓P0 端口輸出數(shù)字0 的段碼0x3f(共陰)。
#include "reg52.h"
typedef unsigned int u16; //對系統(tǒng)默認數(shù)據(jù)類型進行重定義
typedef unsigned char u8;
#define SMG_A_DP_PORT P0 //使用宏定義數(shù)碼管段碼口
//共陰極數(shù)碼管顯示0~F的段碼數(shù)據(jù)
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
void main()
{
SMG_A_DP_PORT=~gsmg_code[0];//將數(shù)組第1個數(shù)據(jù)賦值給數(shù)碼管段選口
while(1){
}
}
main.c 文件內代碼非常少也很簡單,首先將51 單片機的頭文件包含進來,然后定義一個全局數(shù)組變量gsmg_code 存放共陰數(shù)碼管0-F 段碼數(shù)據(jù)。主函數(shù)功能也很簡單,首先將數(shù)組的第1 個數(shù)據(jù)賦值給SMG_A_DP_PORT,因為數(shù)組內定義的是共陰數(shù)碼管段碼,數(shù)組角標為0 存儲的就是第一個數(shù)據(jù)0X3F,然后按位取反變?yōu)?XC0,即共陽數(shù)碼管段碼0 的數(shù)據(jù)。然后進入while 循環(huán),單片機此時一直在while 內循環(huán)操作。當然該條語句也可以放在while 循環(huán)語句內,同樣會讓靜態(tài)數(shù)碼管顯示0。
數(shù)碼管依次顯示源碼如下:
#include< reg52.h >
typedef unsigned int u16;
typedef unsigned char u8;
#define SMG_A_DP_PORT P0
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay_10us(u16 time_us){
while(time_us--);
}
void main()
{
u16 i;
while(1)
{
for(i=1;i< 17;i++){
SMG_A_DP_PORT=~gsmg_code[i];
delay_10us(50000);
delay_10us(50000);
}
}
}
評論