新聞中心

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

51單片機(jī)定時(shí)器量程的硬件擴(kuò)展方式

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

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

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

來擴(kuò)展計(jì)數(shù)范圍。軟件方式擴(kuò)展的大概思路是:在定時(shí)器中斷服務(wù)程序中對定時(shí)器中斷請求進(jìn)行計(jì)數(shù),當(dāng)中斷請求的次數(shù)達(dá)到要求的值時(shí)才進(jìn)行相應(yīng)的處理。例如,某事件的處理周期為1s,但由于受到最大定時(shí)時(shí)間的限制,無法一次完成定時(shí),此時(shí)可以將定時(shí)器的定時(shí)時(shí)間設(shè)為以10ms為一個(gè)單位,啟動定時(shí)器后的每一次定時(shí)器溢出中斷產(chǎn)生10ms的定時(shí),進(jìn)入中斷服務(wù)程序后,對定時(shí)器的中斷次數(shù)進(jìn)行統(tǒng)計(jì),每100次定時(shí)器溢出中斷進(jìn)行一次事件的處理。

這篇文章的標(biāo)題是硬件擴(kuò)展,所以軟件擴(kuò)展的具體實(shí)現(xiàn)這里就省略了。以下主要圍繞硬件方式展開。

硬件方式擴(kuò)展的思路是:

1)T0設(shè)置為16位定時(shí)器方式,當(dāng)T0溢出時(shí),執(zhí)行T0的中斷服務(wù)程序。在T0的中斷服務(wù)程序中將P1.0取反。這樣在P1.0將輸出一個(gè)方波,其周期為T0定時(shí)時(shí)間的2倍。設(shè)T0的定時(shí)時(shí)間為TIME,則由P1.0輸出的方波的周期為2×TIME。
2)T1設(shè)置為16位計(jì)數(shù)器方式,將P1.0輸出的方波接到T1的定時(shí)器外部輸入端T1(P3.5),作為定時(shí)/計(jì)數(shù)器1的外部計(jì)數(shù)脈沖,其每個(gè)周期的下降沿使T1加1。設(shè)計(jì)數(shù)器T1的計(jì)數(shù)脈沖數(shù)為COUNT,則當(dāng)T1溢出時(shí),總定時(shí)時(shí)間T為:T = 2×TIME×COUNT。
下面羅列代碼,定時(shí)器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定時(shí)器 方式2 自動裝載 //T1計(jì)數(shù)器 方式2 自動裝載 MakeByte(TMOD, 0x06,0x02);//T0 0.2ms中斷一次,P1.0翻轉(zhuǎn)周期0.4msSetTH(0,0x38);SetTL(0,0x38);	    EnableET(0);EnableET(1);//計(jì)滿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++;//這個(gè)用于軟件定時(shí)//每經(jīng)過20Ms,OnePeriod加一,//然后在main函數(shù)里經(jīng)行統(tǒng)計(jì)P1_1 = ~P1_1;}

下面上圖:P1.0的輸出接P3.5

最后上仿真結(jié)果:

第一張示波器的時(shí)基為2MS,第二張示波器的時(shí)基為0.2MS



評論


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

關(guān)閉