定時器的幾種工作方式中,除0和前面的1類似都需要初始化計數值,然后開始計數,計數溢出后,需要再次控制計數的初值,但工作模式2不同於此,工作方式2將THx和TLx分開處理,將初值存放在THx中,計數時只處理TLx的8位,所以計數最大值為2^8=256,方式2的另一個特點是,當計數溢出后,不需要控制初值,而是會自動將THx中的值做為計數初值重新開始計數。用工作方式2,實現1s延時程序如下:
查詢方式
#include <reg52.h> sbit LED = P0^2; unsigned int vT = 0; void main() { LED = 0; // 初始亮燈 TMOD = 0x02; // 工作模式2 最大計數值256 TH0 = 0x06; // 從6開始 256-6=250 * 1us = 0.25ms TL0 = 0x06; TR0 = 1; // 啟動定時器0 while(1) { if (TF0 == 1) // 如果定時器計數溢出 { TF0 = 0; vT++; if (vT == 4000) // 0.25ms * 4000 = 1000ms = 1s { LED = !LED; vT = 0; } } } }
中斷方式
#include <reg52.h> sbit LED = P0^2; unsigned int vT = 0; void main() { LED = 0; // 初始亮 TMOD = 0x02; // 模式2 TH0 = 0x06; // 256-6=250 * 1us = 0.25ms TL0 = 0x06; ET0 = 1; // 定時器0中斷開啟 EA = 1; // 總中斷開 TR0 = 1; // 定時器0開啟 while(1); } void MyInterrupt(void) interrupt 1 // 中斷服務程序 { vT++; if (vT == 4000) // 4000*0.25ms=1000ms=1s { LED = !LED; vT = 0; } }
