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