18luck网站

18luck网站電子設計 | 18luck网站Rss 2.0 會員中心 會員注冊
搜索: 您現在的位置: 18luck网站 >> 18luck平台 >> 單片機 >> 正文

單片機數碼管顯示原理

作者:佚名    文章來源:本站原創    點擊數:    更新時間:2018-05-20

  小燈是一種簡單的LED,給我們(men) 視覺效果隻能通過亮和滅來表達簡單信息。而這節課我們(men) 要來學習(xi) 一種表達更加明確的器件,數碼管。

  1、數碼管的基本介紹

  先給大家提供一張原理圖看一下,如圖1所示。

數碼管原理圖 

圖1 數碼管原理圖

  這是比較常見的數碼管的原理圖,我們(men) 板子上一共有6隻數碼管。前邊有了LED小燈的學習(xi) ,數碼管學習(xi) 就會(hui) 輕鬆的多了。從(cong) 圖1能看出來,數碼管共有a,b,c,d,e,f,g,dp這8個(ge) 段,而實際上,這8個(ge) 段每一段都是一個(ge) LED小燈,所以數碼管就是由8個(ge) LED小燈所組成的。我們(men) 看一下數碼管內(nei) 部結構圖。

數碼管結構圖 

圖2 數碼管結構圖

數碼管分為(wei) 共陽數碼管和共陰數碼管,所謂的共陰數碼管就是8隻LED小燈的陰極是接在一起的,也就是陰極是公共端,由陽極來控製小燈是否亮滅。同理,共陽數碼管就是陽極是接到一起的,大家可以仔細研究下圖1。細心的同學也會(hui) 發現,數碼管上邊有2個(ge) com,實際上就是我們(men) 數碼管的公共端。為(wei) 什麽(me) 有2個(ge) ,我個(ge) 人認為(wei) ,一方麵有2個(ge) 可以起到對稱的效果,剛好是10個(ge) 引腳,另外一個(ge) 方麵,公共端通過的電流較大,我們(men) 初中就學過,並聯電路電流之和等於(yu) 總電流,用2個(ge) com可以把公共電流平均到2個(ge) 引腳上去,降低線路承受的電流。

從(cong) 我們(men) 板子的電路圖上能看出來,我們(men) 所用的數碼管是共陽數碼管,如圖所示。

共陽數碼管電路,共陽數碼管驅動電路

圖3 共陽數碼管電路

  他們(men) 的com是接到了正極上,當然了,和LED小燈電路類似,也是由74HC138控製了三極管的導通來控製整個(ge) 數碼管的電流,我們(men) 先來看DS1這個(ge) 數碼管。原理圖上可以看出來,控製DS1的三極管是Q17,控製Q17的引腳是LEDS0,對應到74HC138上邊就是Y0端的輸出。

74HC138控製圖

圖4 74HC138控製圖

  我們(men) 現在的目的是讓LEDS0這個(ge) 引腳輸出低電平,相信大家現在可以獨立根據前邊學到的內(nei) 容把ADDR0,ADDR1,ADDR2,ADDR3,ENLED這4個(ge) 輸入狀態寫(xie) 出來,現在大家不要偷懶,都去根據138的手冊(ce) 去寫(xie) 一下,不需要你記住這些結論,但是遇到就寫(xie) 一次,鍛煉過幾次後,遇到同類芯片自己就知道如何去解決(jue) 問題了。

  數碼管通常是用來顯示數字的,我們(men) 板子上的6個(ge) 數碼管,習(xi) 慣上我們(men) 稱之為(wei) 6位,那控製位選擇的就是74HC138了。而數碼管內(nei) 部的8個(ge) LED小燈我們(men) 稱之為(wei) 數碼管的段,那麽(me) 數碼管的段選擇(即該段的亮滅)是通過P0口控製,經過74HC245驅動。

  2、數碼管的真值表

  數碼管的8個(ge) 段,我們(men) 直接當成8個(ge) LED小燈來控製,那就是a、b、c、d、e、f、g、dp一共8個(ge) LED小燈。我們(men) 通過圖1可以輕而易舉(ju) 的看出來,如果我們(men) 點亮b和c這兩(liang) 個(ge) LED小燈,也就是數碼管的b段和c段,其他的所有的段都熄滅的話,就可以讓數碼管DS1顯示一個(ge) 數字1,那麽(me) 這個(ge) 時候實際上P0的值的二進製就是0b11111001,十六進製就是0xF9。那麽(me) 我們(men) 寫(xie) 一個(ge) 程序進去,看看讓數碼管顯示一下看看。

 

    #include               //包含寄存器的庫文件                   

    sbit  ADDR0 = P1^0;

    sbit  ADDR1 = P1^1;

    sbit  ADDR2 = P1^2;

    sbit  ADDR3 = P1^3;

    sbit  ENLED = P1^4;

    

    void  main()

    {

        unsigned char j = 0;

        unsigned int  i = 0;

        

        ENLED = 0;

        ADDR0 = 0;

        ADDR1 = 0;

         ADDR2 = 0;

        ADDR3 = 1;           //74HC138開啟三極管Q17           

        while(1)             //程序死循環  

        {

             P0 = 0xF9;      //打開數碼管b和c段   

        }

}

  大家把這個(ge) 程序編譯一下,下載到單片機裏會(hui) 發現,最右側(ce) 的數碼管成功顯示1這個(ge) 數字。

  同樣的方法,我們(men) 可以把其他的數字都成功的在數碼管上顯示出來,而數碼管顯示的數字對應給P0的賦值,我們(men) 叫做數碼管的真值表。我們(men) 來列一下我們(men) 這個(ge) 電路圖的數碼管真值表,注意,這個(ge) 真值表裏顯示的數字都不帶小數點。

  表1 數碼管真值表

數字

0

1

2

3

4

5

6

7

真值表

0xC0

0xF9

0xA4

0xB0

0x99

0x92

0x82

0xF8

數字

8

9

A

B

C

D

E

F

真值表

0x80

0x90

0x88

0x83

0xC6

0xA1

0x86

0x8E

  大家可以把上邊那個(ge) 數碼管顯示1的那個(ge) 程序中的P0的賦值隨便修改成我們(men) 表5-1中的真值表裏的數字試試看,把數碼管顯示的數字顯示出來。

  3、數碼管的靜態顯示

  從(cong) 第三課我們(men) 學習(xi) 74HC138以後,我們(men) 了解到74HC138同時一次隻能讓一個(ge) 輸出口為(wei) 低電平,也就是在一個(ge) 時刻內(nei) ,我們(men) 隻能讓一個(ge) 數碼管顯示,始終選通數碼管並且可以根據我們(men) 的P0總線的信號來改變這個(ge) 數碼管的值,我們(men) 可以理解為(wei) 數碼管的靜態顯示。

  數碼管靜態顯示是對應動態顯示而言的,靜態顯示對於(yu) 一兩(liang) 個(ge) 數碼管還行,多個(ge) 數碼管,靜態顯示實現的意義(yi) 就沒有了。這節課我們(men) 先用一個(ge) 數碼管的靜態顯示來實現一個(ge) 簡單的秒表,為(wei) 下節課的動態顯示打下基礎。

  先來介紹一個(ge) 51單片機的關(guan) 鍵字code。我們(men) 前邊課程定義(yi) 變量的時候,一般用到unsigned char或者unsigned int這兩(liang) 個(ge) 關(guan) 鍵字,這樣定義(yi) 的變量都是放在我們(men) 的單片機的RAM中,我們(men) 在程序中可以隨意去改變這個(ge) 變量的值。但是還有一種常數,我們(men) 在程序中要使用,但是卻不進行對這個(ge) 值的改變,這種值我們(men) 可以加一個(ge) code關(guan) 鍵字修飾一下,修飾完畢後,這個(ge) 值就會(hui) 存儲(chu) 到我們(men) 的程序空間flash中,這樣可以大大節省我們(men) 單片機的RAM的使用量,畢竟我們(men) 的RAM空間比較小,而程序空間是很大的。比如我們(men) 現在要使用的數碼管真值表,我們(men) 來看一下我們(men) 下邊的這個(ge) 程序。

 

#include               //包含寄存器的庫文件                   

sbit  LED = P0^0;

sbit  ADDR0 = P1^0;

sbit  ADDR1 = P1^1;

sbit  ADDR2 = P1^2;

sbit  ADDR3 = P1^3;

sbit  ENLED = P1^4;

unsigned char code LedChar[] = {

0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

    0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e

};                  //用數組來存儲(chu) 數碼管真值表,下一課詳細介紹數組

 

void main()

{

    unsigned char counter = 0;

    unsigned char j = 0;

 

    ENLED = 0; ADDR0 = 0; ADDR1 = 0;

     ADDR2 = 0; ADDR3 = 1; P0 = 0XFF;  //74HC138和P0初始化部分

 

     TMOD = 0x01;                    //設置定時器0為(wei) 模式1

     TH0  = 0xB8;

    TL0  = 0x00;                   //定時值初值

     TR0  = 1;                      //打開定時器0

    while(1)

    {

        if(1 == TF0)                 //判斷定時器0是否溢出

        {

            TF0 = 0;

            TH0 = 0xB8;              //溢出後,重新賦值

            TL0 = 0x00;

            counter++;

            if(50 == counter)      //判斷定時器0溢出是否達到50次

            {

                counter = 0;        //counter清0,重新計數

                P0 = LedChar[j++]; //把數組裏的對應值送給P0

                if(16 == j)         //當顯示到F後,歸0重新開始

                {

                     j = 0;

                }

             }

         }

    }

}

Tags:七段數碼管,數碼管,單片機,數碼管顯示原理  
責任編輯:admin
請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
1分 2分 3分 4分 5分

還可以輸入 200 個字
[ 查看全部 ] 網友評論
關於我們 - 聯係我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁麵
下到頁底
晶體管查詢