定時器方式0的使用
通過設置TMOD寄存器中的M1M0為00選擇定時方式0,方式0的計數位數是13位,對T0來說,有TL0寄存器的低5位,和TH0的8位組成
那么最多能裝入2^13=8192個數,也就是說,經過8192個計數,寄存器就會溢出,向CPU發出中斷請求。
所以計算公式為
TH0=(8192-X)/32
TL0=(8192-X)2
程序例子:
#include
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar num;
void main()
{
TMOD=0X00; //設置定時器0為工作方式;
TH0=(8192-4607)/32; //裝初值
TL0=(8192-460)2;
EA=1;
ET0=1; //開定時器0;
TR0=1; //啟動定時器0;
while-(1)
{
if(num==200)
{
num=0; //如果到了200次,說明1秒時間到
led1=~led1; //讓發光管狀態反接
}
}
}
void T0_time() interrupt 1
{
TH0=(8192-4607)/32; //重裝初始值
TL0=(8192-4607)2;
num++;
}
定時器方式2的使用
方式2被稱為自動重裝的八位定時器/計數器。
原理:THX被作為常數緩沖器,當TLX計數器溢出時,在溢出標志TFX置1的同時,還自動地將THX中的常數重新裝入TLX中,使TLX從初始值開始重新計數,這樣就避免了認為的軟件重裝初始值帶來的時間誤差,從而提高定時精度。
適用范圍:方式2特別適用于做較精確的脈沖信號發生器,因為其只有8位計數器。
缺點:當定時較長的時間是同時給編寫程序帶來麻煩,同時還會影響精度
公式:
THX=256-N;
TLX=256-N;
程序列子:
#include
#define MOTOR P2^0; //定義電機的輸出口
int PWMcount,PWM;
void main()
{
TMOD=0X02; //設置定時器0的工作模式2
TH0=156; //轉載初始值
TL0=156;
EA=0;
ET0=1; //開啟內部定時器中斷0;
TR0=1; //啟動定時器中斷0;
PWM=50; //以50的PWM輸出
while(1){;}
}
void PWM_output() interrupt 1
{
PWM_count++;
if(PWM_count MOTOR=1;
else MOTOR=0;
if(PWM_count==100) PWM_count=0;
}