定時器:單條指令時間(us) = 1/單片機頻率*單條指令時鐘週期 ide
TH0和TL0共16位,最多隻能表示65535,因此要設定一個Base值,再利用循環多計數幾回函數
好比0.002s:0.02 = (1/11.0592M * 12)*指令個數,指令個數 = 0.02(1/11.0592M * 12) = 0.018432it
由於頻率用的是M,因此結果0.018432*1000000 = 18432class
使用16位寄存器的狀況下,TH0和TL初始值:65536 - 18432 = 47104 = 0xB8 00軟件
編寫定時器延時函數:
循環
#include sbit LED = P0^0; void Delay(unsigned int sec) { unsigned int second_base; unsigned int conter; //計數次數 second_base = 2; //Base,2ms*100 = 2s conter = sec*100 / second_base; //轉換成秒 TL0 = 0x00; //16位計數器低8位,設置 TH0 = 0xB8; //高8位 while (conter) { if (1 == TF0) //當高8位溢的時候,TF0標誌位被置1 { TF0 = 0; //軟件清0TF位,並給定時器賦基值 TL0 = 0xE0; TH0 = 0xB1; conter = conter - 1; } } } void main() { TR0 = 1; //定時器0啓動控制位,1表明計時器0啓動 TMOD = 0x01; //指定計數器爲16位模式 LED = 0; while(1) { Delay(2); //延時2S LED = ~LED; } }
8位:255硬件
16位:65535定時器
SFR地址:若是頭文件沒有定義TH0,須要自已定義TH0=0x8Cdi
TH0:高8位。文件
TL0:低8位,若是是16位,則TL0溢出後,TH0+1
定時器0打開:TR0 = 1;
TF0:溢出後,硬件自動置1,經過軟件或硬件清0
GATE:爲1時,定時器開始計時,能夠用來計測脈衝寬度,C/T:爲1時使用定時器
定時器經常使用兩種模式:
TMOD M1/M0模式爲10時,自動重裝:TL0溢出後,TL0重裝TH0的值,而且TF0置1
TMOD M1/M0模式爲01時,16位定時器:TL0溢出後,TH0加1