衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

定時器和數碼管解析(下)

jf_78858299 ? 來源:硬件攻城獅 ? 作者:硬件攻城獅 ? 2023-04-21 14:40 ? 次閱讀

1.2.3 定時器程序應用

了解了定時器相關的寄存器,那么我們下面就來做一個定時器的程序,鞏固一下我們學到的內容。我們這節課的程序先使用定時器0,在使用定時器的時候,需要以下幾個步驟:

第一步:設置特殊功能寄存器TMOD,配置好工作模式;

第二步:設置計數寄存器TH0和TL0的初值;

第三步:設置TCON,通過打開TR0位來讓定時器開始計數。

第四步:判斷TCON寄存器的TF0位,監測定時器溢出情況。

寫程序之前,我們要先來學會計算如何用定時器定時時間。我們的晶振是11.0592M,時鐘周期就是1/11059200,機器周期就是12/11059200,我們假如要定時20ms,就是0.02秒,要經過x個機器周期得到0.02秒,我們來算一下x*12/11059200=0.02,得到x= 18432。那么我們現在16位的定時器溢出值是65536,我們可以這樣,先給TH0和TL0一個初值,讓他們經過18432個機器周期后剛好溢出,溢出后我們可以通過檢測TF0位得知,就剛好是0.02秒。這個初值y = 65536 - 18432 = 47104,轉成16進制就是0xB800,那么就是TH0 = 0xB8,TL0 = 0x00。

那0.02秒我們已經定時出來了,細心的同學會發現,我們如果初值直接給一個0x0000,一直到65536溢出,定時器定時值最大也就是71ms左右,那么我們想定時更長時間怎么辦呢?用你小學學過的邏輯,倍數關系就可以解決此問題。

那好了,我們下面就用程序來實現以下這個功能。

#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;

void main()

{

unsigned char counter = 0;

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

ADDR2 = 1; ADDR3 = 1; LED = 1;  //74HC138和LED燈初始化部分

TMOD = 0x01;   //設置定時器0為模式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,重新計數

             LED = !LED;   //LED取反操作,0-->1,1-->0

        }                 

    }                       

}

}

程序都有注釋,不難理解,這里要解釋一個地方,就是兩次if判斷,細心的同學會發現,if(1 == TF0)這句,我把1寫前邊,這個地方我推薦新手按照我這樣來寫,因為如果我們寫if(TF0 == 1),作為新手來說,不小心丟掉一個’=’號后,寫成if(TF0 = 1),這樣實際上在語法上是可以通過的,我們用的Keil4還會出一個警告說明一下,Keil以前的版本以及一些其他軟件,可能根本不會出任何錯誤或者警告提示,但是這樣產生的Hex文件下載單片機里邊,程序就錯了,大家可以改改試試看。

本程序實現的結果是我們板子上最右邊的小燈點亮持續一秒,熄滅持續一秒,也就是以0.5HZ的頻率進行閃爍。

1.3 數碼管學習

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

1.3.1 數碼管的基本介紹

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

圖片

圖5-2 數碼管原理圖

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

圖片

圖5-3 數碼管結構圖

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

從我們板子的電路圖上能看出來,我們所用的數碼管是共陽數碼管,如圖5-3所示。

圖片

圖5-4 共陽數碼管電路

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

圖片

圖5-5 74HC138控制圖

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

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

1.3.2 數碼管的真值表

數碼管的8個段,我們直接當成8個LED小燈來控制,那就是a、b、c、d、e、f、g、dp一共8個LED小燈。我們通過圖5-1可以輕而易舉的看出來,如果我們點亮b和c這兩個LED小燈,也就是數碼管的b段和c段,其他的所有的段都熄滅的話,就可以讓數碼管DS1顯示一個數字1,那么這個時候實際上P0的值的二進制就是0b11111001,十六進制就是0xF9。也有可以自動生成數碼管段位碼的軟件可以從http://www.51hei.com/mcudown/ 下載文件名是"數碼管段位設碼程序.rar",那么我們寫一個程序進去,看看讓數碼管顯示一下看看。

#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段   

    }

}

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

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

表5-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

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

1.3.3 數碼管的靜態顯示

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

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

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

#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

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

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為模式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;

            }

         }

     }

}

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5363

    瀏覽量

    121164
  • 定時器
    +關注

    關注

    23

    文章

    3255

    瀏覽量

    115371
  • 程序
    +關注

    關注

    117

    文章

    3795

    瀏覽量

    81411
收藏 人收藏

    評論

    相關推薦

    基于單片機的綜合應用程序數碼管【C語言】定時器控制數碼管

    基于單片機的綜合應用程序數碼管【C語言】定時器控制數碼管
    發表于 01-06 13:44 ?27次下載

    LESSON3_數碼管靜態顯示及定時器和中斷應用

    LESSON3_數碼管靜態顯示及定時器和中斷應用
    發表于 02-18 18:21 ?0次下載

    LESSON3_數碼管靜態顯示及定時器和中斷應用

    數碼管靜態顯示及定時器和中斷應用 可以給初學者學習使用 如果有需要可以下載。
    發表于 03-14 10:40 ?1次下載

    LESSON3_數碼管靜態顯示及定時器和中斷應用

    LESSON3_數碼管靜態顯示及定時器和中斷應用。
    發表于 04-29 16:50 ?5次下載

    定時器掃描數碼管(不閃爍)

    定時器掃描數碼管(不閃爍) C51單片機源碼,KEIL源文件,C語言編寫
    發表于 06-20 16:36 ?7次下載

    LESSON3_數碼管靜態顯示及定時器和中斷應用

    數碼管是如何顯示出字符的 數碼管靜態顯示與動態顯示原理 中斷概念 單片機的定時器應用
    發表于 07-01 17:17 ?1次下載

    基于8051的Proteus仿真-定時器控制數碼管顯示

    基于8051的Proteus仿真-定時器控制數碼管顯示
    發表于 09-01 23:33 ?19次下載

    基于SOPC的定時器控制數碼管顯示

    運行在DE1上,通過程序的控制使數碼管顯示,從而實現時鐘的功能,實驗結果表明,基于SOPC的系統環境,可以利用定時器控制數碼管顯示。此外,還可以根據不同的用戶需求實現不同的功能,方便
    發表于 11-13 17:07 ?12次下載
    基于SOPC的<b class='flag-5'>定時器</b>控制<b class='flag-5'>數碼管</b>顯示

    定時器1秒計數,數碼管顯示0-999程序代碼【下載】

    定時器1秒計數,數碼管顯示0-999
    發表于 12-20 14:23 ?18次下載

    數碼管顯示的原理靜態顯示及中斷概念單片機的定時器應用視頻教程

    本文檔的主要內容詳細介紹的是數碼管顯示的原理靜態顯示及中斷概念單片機的定時器應用視頻教程包括了:1.數碼管是如何顯示出字符的,2.數碼管靜態顯示與動態顯示原理,3.中斷概念,4.單片機
    發表于 03-26 14:35 ?15次下載
    <b class='flag-5'>數碼管</b>顯示的原理靜態顯示及中斷概念單片機的<b class='flag-5'>定時器</b>應用視頻教程

    定時器控制數碼管動態顯示的仿真電路圖免費下載

    本文檔的主要內容詳細介紹的是定時器控制數碼管動態顯示的仿真電路圖免費下載
    發表于 01-07 11:41 ?12次下載
    <b class='flag-5'>定時器</b>控制<b class='flag-5'>數碼管</b>動態顯示的仿真電路圖免費下載

    使用定時器控制數碼管顯示的程序和工程文件免費下載

    本文檔的主要內容詳細介紹的是使用定時器控制數碼管顯示的程序和工程文件免費下載。
    發表于 06-10 16:54 ?5次下載
    使用<b class='flag-5'>定時器</b>控制<b class='flag-5'>數碼管</b>動<b class='flag-5'>管</b>顯示的程序和工程文件免費下載

    使用定時器控制數碼管動態顯示的程序和工程文件免費下載

    本文檔的主要內容詳細介紹的是使用定時器控制數碼管動態顯示的程序和工程文件免費下載。
    發表于 06-10 16:54 ?19次下載
    使用<b class='flag-5'>定時器</b>控制<b class='flag-5'>數碼管</b>動態顯示的程序和工程文件免費下載

    STM32+Proteus仿真實現滴答定時器計時和數碼管實時顯示功能

    STM32+Proteus仿真實現滴答定時器計時和數碼管實時顯示功能
    發表于 11-24 21:06 ?73次下載
    STM32+Proteus仿真實現滴答<b class='flag-5'>定時器</b>計時<b class='flag-5'>和數碼管</b>實時顯示功能

    使用定時器和數碼管實現簡易秒計時

    從今天開始,我們利用上前幾天學習的定時器和數碼管,一起設計一個簡單的秒計時
    的頭像 發表于 11-02 10:50 ?1890次閱讀
    使用<b class='flag-5'>定時器</b><b class='flag-5'>和數碼管</b>實現簡易秒計時<b class='flag-5'>器</b>
    百家乐官网高手长胜攻略| 易赢百家乐官网软件| 太阳百家乐游戏| 路冲铺面能做生意吗| 百家乐官网平台网| 六合彩| 百家乐网络赌城| 百家乐对打反水| 百家乐官网微笑玩法| 三门县| 新葡京娱乐城开户| 威尼斯人娱乐城信誉好吗| 博网百家乐现金网| 澳门百家乐官网娱乐网| 百家乐官网的必赢方法| 博发| 大发888赌场的微博| 新利百家乐的玩法技巧和规则| 百家乐存在千术吗| 百家乐官网五湖四海娱乐| 百家乐官网投注怎么样| 百家乐官网现金网平台| 鸿博| 大发888手机注册送钱| 威尼斯人娱乐城上不了| 百家乐娱乐备用网址| 3U百家乐娱乐城| 七胜百家乐官网赌场娱乐网规则| 太阳城百家乐官网杀猪吗| 徐州市| 皇冠网热门小说| bet365信誉好吗| 大发888娱乐网下| 网上百家乐必赢玩| 最好的百家乐娱乐场| 南昌县| 日博bet365| 大发888合营商| 大发888娱乐城官方网站lm0| 百家乐技巧看| 百家乐网络赌城|