九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
51單片機T0做精確時鐘
2010-12-03 11:02

51單片機T0做精確時鐘

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

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

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

      第二個方法:計算出一個湊巧的初值,使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。

//22.1184/12*1000*25=46080
void Timer0_Init(void)           //T0初始化函數(shù)

{

TMOD = 0x01;                     //設(shè)置T0工作方式1

TH0 = 0x4c;                       //(65536-46080)/256,設(shè)置初值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í)行也沒有關(guān)系,因為TL0的計數(shù)不受影響。但有一種情況必須要注意,雖然這種情況發(fā)生的可能性不大。如果T0中斷長時間沒有得到響應(yīng),TL0再一次溢出了,這時這種方法的誤差就大了。

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

本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/kulung/archive/2010/11/08/5995161.aspx


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
犧牲半個定時器,得到一個串口
51單片機知識匯總_51單片機基礎(chǔ)知識匯總
單片機編程實例80例大全
單片機按鍵處理方式(一)——典型的按鍵處理方式
1小時c語言入門
機器人教程1:如何利用51單片機輸出PWM波
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服