新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 第9課 定時器

        第9課 定時器

        作者: 時間:2016-12-01 來源:網絡 收藏
        3、定時器工作方式及賦初值
        通過對上面TMOD寄存器的介紹,我們知道,通過設置M0M1可能選擇定時器的工作方式。這里可能有的人對選擇定時器工作方式及賦初值是什么意思不明白,其實也很好理解,前面我們不是把加1計數器比作裝水的水桶嗎,而51單片機有4種工作方式就相當于有4種不同大小的裝水的水桶,所以我們必須通過TMOD這個寄存器選擇哪使用哪一個水桶(也就是選擇哪一種工作方式);至于為什么要賦初值前面我實際已經有講到過,計數器從全是裝0到全部裝1的整個時間是固定的,而我們實際用使用需要不同的定時間,所以我們必須先在計數器內先裝一些數,然后在這個基本上進行加1計數,就可以得到我們想要的定時時間。
        定時器總共有四種工作方式,而因為定時器工作方式1比較常用,所以這里僅對定時器0工作方式1進行介紹,并介紹如何賦初值。
        方式1的計數位數是16位,由TL0作為低8位、TH0作為高8位,組成了16位加1計數器 ,其邏輯結構圖如圖3所示。
        圖3 定時器0工作方式1邏輯結構圖
        當GATE=0,TR0=1時,TL0便在機器周期的作用下開始自動加1,當加了256次后自動向前進一位,直到TH0也計滿,然后溢出,置標志寄存器TF0=1,如果此時設置了中斷允許,CPU便作進入中斷函數內進行中斷程序的處理。注意,此時若TR0=1一直打開的話,計數器滿后會全部自動清零,然后重新重復以上過程,直到TR0=0時結束。
        接下來講解如何計算定時器的初值問題。定時器一旦啟動,它便在原來的數值基礎上開始加1計數,若在程序開始時,我們沒有設置TH0和TL0,它們的默認值都是0,假設時鐘頻率為12MHZ,12個時鐘周期為一個機器周期,那么此時的機器周期就是1us,計滿TH0和TL0就需要2X16-1,再來一個脈沖,計數器就溢出,隨即向CPU申請中斷。因此溢出一次的時間為65536us,約等于65.5ms,如果我們要定時50ms,此時就需要向TH0t和TL0里面先賦初值,在這個初值的基礎上計50000個數后,定時器溢出,此時剛好就是50ms中斷一次,如需要定時1S時,在寫程序時當產生20次50ms的定時器中斷后便認定是1s,這樣便可以精確制定定時時間了。要定時50ms,即要計50000個數,TH0和TL0中應該裝的總數是65536-50000=15536,把15536對256求模:15536/256裝入TH0中,把15536對256求余:15536%256裝入TL0中就可以了。
        以上就是定時器賦初值的計算方法,總結后可以得出以下結論:當用定時器的方式1時,設機器周期為t ,定時器產生一次中斷的時間為T,那么需要計數的個數N=T/t,裝放THX和TLX中的數分別為:
        THX=(65536-N)/256 ,TLX=(65536-N)%256
        要計算機器周期t,就需要知道系統的時鐘頻率,也就是單片機外接晶振的頻率,實驗板上的時鐘頻率為11.0592MHZ,那么機器周期為12X(1/11059200)=1.09us,若T=50ms.那么N=50000/1.09=45873,如果晶振為12MHX的話,用同樣的方法算出來N=50000.
        4程序舉例
        下面我們舉一個例子,用單片機的定時器0、工作方式1和中斷技術實現讓L1以間隔1s的時間閃爍。
        這里我們先總結一下,在使用定時器主要對定時器作相應的初始化,其步驟為:
        (1)對TMOD賦值
        選擇計數或者定時
        確定T0或T1的工作方式。
        (2)計算初值,并將其寫入TH0、TL0或TH1、TL1。
        (3)使TR0或TR1置位,啟動定時/計數器定時或計數。
        (4)需使用中斷方式時,則對IE等賦值,開放中斷
        下面我們給出相關程序。
        例1:1357燈以間隔1s的時間閃爍。
        #include//頭文件,主要用來聲明,特殊功能寄存器的地址
        #define uint unsigned int//宏定義
        #define uchar unsigned char//宏定義
        sbit D1=P1^0;//位聲明
        uchar time;//定義變量time為無符號字符型
        void main()//主函數
        {
        TMOD=0x01;//設置定時器0為工作方式1
        TH0=(65535-50000)/256;//定時50ms賦初值15535
        TL0=(65535-50000)%256;
        EA=1;//開總中斷
        ET0=1;//開定時器0中斷
        TR0=1;//啟動定時器0
        //上面6行為定時器和中斷初始化程序 
        while(1);//停在這里等待中斷產生
        }
        void tim1() interrupt 1//中斷子函數,功能為500ms燈滅一次
        {
        time++;//進入一次中斷time自加1
        if(time==10)//如果自加到10,相當于500ms
        {
        D1=~D1;//燈亮滅交替
        time=0;//time清零
        }
        }
        程序下載到51hei實驗板上的現象如圖4所示:
        圖4 L1燈以間隔1s的時間閃爍
        上一頁 1 2 下一頁

        關鍵詞: 定時器單片

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 德保县| 海伦市| 福泉市| 文安县| 搜索| 罗定市| 淮安市| 同德县| 宝坻区| 盐亭县| 沐川县| 澄城县| 云林县| 保定市| 大连市| 德清县| 二连浩特市| 延津县| 松原市| 玉田县| 葵青区| 东乡族自治县| 房山区| 晋州市| 茶陵县| 泰宁县| 乌拉特前旗| 屏南县| 本溪市| 璧山县| 洪洞县| 佛冈县| 盘山县| 化州市| 沙雅县| 探索| 多伦县| 鄱阳县| 桃源县| 新乡县| 潍坊市|