新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 51單片機定時器量程的硬件擴展方式

51單片機定時器量程的硬件擴展方式

作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
51單片機工作模式2自動裝載定時值,按教科書的描述定時能力顯得相對精準(zhǔn),但是此時的為8位定時器:當(dāng)晶振為12MHz時,只能定時0.256ms。

升個級,精準(zhǔn)性不要了,使定時器工作在模式1,16位定時器:當(dāng)晶振為12MHz時已經(jīng)能定時到65.56ms,略微牛逼不少。如果還要定時更長的數(shù),可能會用軟件方式

本文引用地址:http://butianyuan.cn/article/201611/318668.htm

來擴展計數(shù)范圍。軟件方式擴展的大概思路是:在定時器中斷服務(wù)程序中對定時器中斷請求進行計數(shù),當(dāng)中斷請求的次數(shù)達(dá)到要求的值時才進行相應(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



評論


技術(shù)專區(qū)

關(guān)閉