定時器對於每個MCU來說都是非常重要的功能,實現精確的定時器,測頻率,產生PWM都是靠的定時器,定時器的位元決定了定時器的精度,目前就我們所遇到有8位的定時器,16位的定時器,32位的定時器。功能一個比一個強。位元越高PWM的精度就越高,變化就越細膩,便於控制。51的定時就AT89X51來說有兩個定時器T0和T1,52單片機又增加了一個T2。每個定時器都有4中工作模式,第一種:13位的定時器,第二種是16位的定時器,第三種:8位的自動重載。第四種就是T0分離的兩個8位定時器。而T1停止工作。
要想熟練的運用這些東西不是靠的死記硬背,東西是死的人是活的。學習這類東西其實調試和看標頭檔,研究標頭檔和調試的視窗,你就可以迅速的掌握一款單片機。在看資料手冊,你就會很容易的理解他們。
這張圖已經把很多東西說明清楚了,定時器的振蕩頻率是晶振的12分頻,意思就是說我們平時有的12MHz的晶振時,定時的每個計數都是1us.而且可以看出16位的定時器實際是由兩個8位的定時組成的。最後溢出置位TF1.至於那個外部中斷就是測方波的脈寬的了。
#include<reg52.h>void t0_init(void){TMOD |= 0x01; //定時的工作模式和定時或者計數TH0 = -50000>>8;TL0 = -50000%255; //將一個數分配到兩個8位寄存器中ET0 = 1; //開啟定時器0的局部中斷使能}void main(void){ t0_init(); EA = 1; //使能全域中斷 TR0= 1; //定時器開始計數 for(;;) //等待定時器溢出中斷。這個是定時器中斷的方法,是硬體的,我們可以用查詢的方式,就是軟體來做的。判斷TF0的情況, { PCON = 0x01; //停止CPU的活動,節能。降低功耗。 }}void t0_overflow_isr(void) interrupt 1 //中斷服務程式{ TH0 = -50000>>8; TL0 = -50000&255;//51的定時器功能弱,不能自己重裝,必須軟體手動重裝,。然每次都是從0開始計數到0xffff P1 ^= 0x01;//每次取反P1.0口。}
值得注意的是51的定時器就是一個一直向上加的定時器,直到溢出,而其它的單片機定時就有很多的模式,設定一個值進行比較,或者溢出了不管一直在計數等到第二次又觸發,或者是減的,等等,千萬不要以為單片機就只有一個定時器溢出。多想想,不定期更新中。