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