51單片機定時器量程的硬件擴展方式
升個級,精準(zhǔn)性不要了,使定時器工作在模式1,16位定時器:當(dāng)晶振為12MHz時已經(jīng)能定時到65.56ms,略微牛逼不少。如果還要定時更長的數(shù),可能會用軟件方式
本文引用地址:http://cafeforensic.com/article/201611/318668.htm來擴展計數(shù)范圍。軟件方式擴展的大概思路是:在定時器中斷服務(wù)程序中對定時器中斷請求進行計數(shù),當(dāng)中斷請求的次數(shù)達到要求的值時才進行相應(yīng)的處理。例如,某事件的處理周期為1s,但由于受到最大定時時間的限制,無法一次完成定時,此時可以將定時器的定時時間設(shè)為以10ms為一個單位,啟動定時器后的每一次定時器溢出中斷產(chǎn)生10ms的定時,進入中斷服務(wù)程序后,對定時器的中斷次數(shù)進行統(tǒng)計,每100次定時器溢出中斷進行一次事件的處理。
這篇文章的標(biāo)題是硬件擴展,所以軟件擴展的具體實現(xiàn)這里就省略了。以下主要圍繞硬件方式展開。
硬件方式擴展的思路是:
1)T0設(shè)置為16位定時器方式,當(dāng)T0溢出時,執(zhí)行T0的中斷服務(wù)程序。在T0的中斷服務(wù)程序中將P1.0取反。這樣在P1.0將輸出一個方波,其周期為T0定時時間的2倍。設(shè)T0的定時時間為TIME,則由P1.0輸出的方波的周期為2×TIME。
2)T1設(shè)置為16位計數(shù)器方式,將P1.0輸出的方波接到T1的定時器外部輸入端T1(P3.5),作為定時/計數(shù)器1的外部計數(shù)脈沖,其每個周期的下降沿使T1加1。設(shè)計數(shù)器T1的計數(shù)脈沖數(shù)為COUNT,則當(dāng)T1溢出時,總定時時間T為:T = 2×TIME×COUNT。
下面羅列代碼,定時器T0 T1全都工作在模式2
#include#include sbit P1_0 = P1^0;sbit P1_1 = P1^1;#define MakeByte(target, Hi,Lo) do{ target |= (((Hi)<<4)|(Lo)); }while(0); #define SetTH(n,val) do{ TH##n = val; }while(0); #define SetTL(n,val) do{ TL##n = val; }while(0); #define EnableET(n) do{ ET##n = 0x01; IE |= 0x80; }while(0); #define StartTn(n) do{ TR##n = 0x01; }while(0); unsigned char FetchData=0;unsigned int OnePeriod=0;int main(){//T0定時器 方式2 自動裝載 //T1計數(shù)器 方式2 自動裝載 MakeByte(TMOD, 0x06,0x02);//T0 0.2ms中斷一次,P1.0翻轉(zhuǎn)周期0.4msSetTH(0,0x38);SetTL(0,0x38); EnableET(0);EnableET(1);//計滿50次產(chǎn)生中斷//50*0.4ms=20msSetTH(1,0xCE);SetTL(1,0xCE);StartTn(0);StartTn(1);while(1){while(!FetchData); FetchData = 0;}}void IsrT0() interrupt 1{P1_0 = ~P1_0;}void IsrT1() interrupt 3{ //20MS elapsedOnePeriod++;//這個用于軟件定時//每經(jīng)過20Ms,OnePeriod加一,//然后在main函數(shù)里經(jīng)行統(tǒng)計P1_1 = ~P1_1;}
下面上圖:P1.0的輸出接P3.5
最后上仿真結(jié)果:
第一張示波器的時基為2MS,第二張示波器的時基為0.2MS
評論