51微控制器工作於方式0的定時器模式
阿新 • • 發佈:2019-02-01
51微控制器的 模式0(13位定時器/計數器)
第一步:通過設定TMOD中的M1/M0位設定,即可完成模式選擇
“00”為模式0(13位定時/計數模式)
“01”為模式1(16位定時/計數模式)
“10”為模式2(8位'自動重灌初'值定時/計數模式)
“11”為模式3(分割為 2個8位計數模式)
第二步:開啟總中斷(EA)、開T0中斷(ET0)、啟動T0(TR0)
因為暫存器在復位後初始值都為“0”,預設屬於關閉的狀態,所以我們在使用T0中斷功能時,
需要將這些位置“1”才可啟動定T0。
第三步:根據時鐘計算並裝載合適的初值
在T0模式中,因為它只使用了TL0的低5位和TH0的8位空間,剩餘3位不使用。
當TL0的低5位計數滿並溢位後(通俗點說就是超過低5位的計算的能力後就會向高位進位,與
十進位制加法同理),會向TH0位進位,同樣當TH0也計滿並溢位,TF0置位,此時就會中斷函式就
會向CPU傳送中斷請求,以發生中斷。
初值計算:由上面可以T0的最大計算能力為:
2的13次方=8192
由於最低位只有5位,當5位計數滿(2的5次方=32)後發生溢位並進位,所有裝初值
時要對TL0進行求模和餘。
示例程式如下:
#include"reg52.h" #define uint unsigned int //巨集定義 #define uchar unsigned char sbit LED=P2^0; uchar i=0; void main() { TMOD=0xf0; //設定T0為工作方式0 TH0=(8192-5000)/32; //5000us延時 TL0=(8192-5000)%32; /*Timer0工作在模式0下時為13位定時/計數器, TL0只使用前5位,故對32進行求餘/模 */ EA=1; //開總中斷 ET0=1; //開定時器0中斷 TR0=1; //啟動定時器0 while(1); //程式停止,等待中斷請求 } /******T0中斷函式*******/ void Timer0()interrupt 1 { TH0=(8192-5000)/32; TL0=(8192-5000)%32; i++; while(i>=200) { i=0; LED=~LED; } }
結束。