新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機定時器量程的硬件擴展方式

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

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

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

        本文引用地址:http://www.104case.com/article/201611/318668.htm

        來擴展計數范圍。軟件方式擴展的大概思路是:在定時器中斷服務程序中對定時器中斷請求進行計數,當中斷請求的次數達到要求的值時才進行相應的處理。例如,某事件的處理周期為1s,但由于受到最大定時時間的限制,無法一次完成定時,此時可以將定時器的定時時間設為以10ms為一個單位,啟動定時器后的每一次定時器溢出中斷產生10ms的定時,進入中斷服務程序后,對定時器的中斷次數進行統計,每100次定時器溢出中斷進行一次事件的處理。

        這篇文章的標題是硬件擴展,所以軟件擴展的具體實現這里就省略了。以下主要圍繞硬件方式展開。

        硬件方式擴展的思路是:

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

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

        最后上仿真結果:

        第一張示波器的時基為2MS,第二張示波器的時基為0.2MS



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 崇阳县| 河池市| 九台市| 麻江县| 兖州市| 志丹县| 多伦县| 崇左市| 盘山县| 沾化县| 巩留县| 青冈县| 大方县| 贵阳市| 高台县| 丰镇市| 大同市| 清苑县| 东至县| 汝城县| 漳州市| 邮箱| 平山县| 四川省| 乐陵市| 泰兴市| 洛浦县| 六枝特区| 来宾市| 铜陵市| 荃湾区| 汶上县| 寻甸| 集贤县| 六盘水市| 宝山区| 济源市| 江达县| 积石山| 平泉县| 东海县|