在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機T0做精確時鐘

            51單片機T0做精確時鐘

            作者: 時間:2016-11-19 來源:網(wǎng)絡 收藏
            T0精確時鐘,為了做到盡量精確,必須減少中斷的次數(shù),所以選擇使用方式1,它最多可以計數(shù)65536次。但是,方式1中斷后需要重新給定時器賦初值,這樣就要耽誤幾個機器周期,很難保證時鐘的精確。

            有兩個方法可以解決這個問題。

            本文引用地址:http://www.biyoush.com/article/201611/318363.htm

            第一個方法:你可以計算出中斷處理時重新給定時器賦初值所用的機器周期數(shù),在你計算出的初值里除去這幾個機器周期,作為補償。這個方法,只是在每次定時器中斷后,都可以按時得到執(zhí)行時很精確,但事實上中斷什么時候執(zhí)行誰都說不準,所以這個方法,只能做到盡量精確。

            第二個方法:計算出一個湊巧的初值,使TL0正好等于0x00,這樣每次中斷溢出后,TL0都從0x00開始計數(shù),即使中斷沒有得到執(zhí)行,TL0也會繼續(xù)計數(shù)。利用這一點,在中斷處理函數(shù)中,只需要對TH0重新賦值,不需要管TL0。以下是示例程序:

            //定時器T0時鐘參數(shù)

            unsigned char T0_S = 0;//秒

            unsigned char T0_M = 0;//分

            unsigned char T0_H = 0;//時

            unsigned char T0_Cycle = 0;//循環(huán)次數(shù)

            //本程序所用晶振22.1184MHz,每次定時25ms,循環(huán)40次正好1s。

            void Timer0_Init(void)//T0初始化函數(shù)

            {

            TMOD = 0x01;//設置T0工作方式1

            TH0= 0x4c;//(65536-46080)/256,設置初值46080,晶振22.1184MHz,

            //每個機器周期0.5425微秒,定時25ms

            TL0= 0x00;//(65536-46080)%256,TL0恰好=0x00

            IE|= 0x82;//開中斷

            TR0= 1 ;//T0開始定時

            }

            //

            void Timer0(void) interrupt 1

            {

            TH0= 0x4c;//重新給TH0賦值

            //TL0= 0x00;//不對TL0賦值,讓其繼續(xù)計數(shù)

            TF0= 0 ;//定時溢出清0

            T0_Cycle ++ ;

            if(T0_Cycle == 40)//循環(huán)40次,每次25ms,定時1s

            {

            T0_Cycle = 0 ;

            T0_S++ ;

            if(T0_S == 60)

            {

            T0_S = 0;

            T0_M++;

            if(T0_M == 60)

            {

            T0_M = 0;

            T0_H++;

            if(T0_H == 24)

            {

            T0_H = 0;

            }

            }

            }

            }

            }

            以上程序即使T0中斷賦初值會耽誤幾個機器周期,中斷沒有得到及時執(zhí)行也沒有關系,因為TL0的計數(shù)不受影響。但有一種情況必須要注意,雖然這種情況發(fā)生的可能性不大。如果T0中斷長時間沒有得到響應,TL0再一次溢出了,這時這種方法的誤差就大了。

            經(jīng)過測試,第二種方法還是比較精確的,時鐘跑了一天快了10s,這個誤差應該是晶振本身的問題,如果是定時器的問題,應該是慢了,不會快了。



            評論


            技術專區(qū)

            關閉