通過前面的定時器理論了解到,使用一個定時器,要經(jīng)過下面四步:
1、設(shè)置定時器/計數(shù)器的工作模式TMOD(常用的是模式1:TMOD=0x01);
2、裝入預(yù)置數(shù)到THx和TLx中(THx=TLx=MAX(8192/65536/256)-計數(shù)次數(shù));
3、如果工作在中斷方式,則需要開定時器/計數(shù)器的中斷TCON中的標(biāo)志位:TF0/TF1=0/1;
4、啟動定時器/計數(shù)器:TR0/TR1=1;
//1、設(shè)置定時器/計數(shù)器的工作模式TMOD(常用的是模式1:TMOD=0x01);
//2、裝入預(yù)置數(shù)到THx和TLx中(THx=TLx=MAX(8192/65536/256)-計數(shù)次數(shù));
//3、如果工作在中斷方式,則需要開定時器/計數(shù)器的中斷TCON中的標(biāo)志位:TF0/TF1=0/1;
//4、啟動定時器/計數(shù)器:TR0/TR1=1;
// 內(nèi)容:通過定時讓LED燈閃爍
#include
sbit LED=P0^2; //定義LED端口
//定時器初始化子程序
void Init_Timer0(void)
{
TMOD = 0x01; //使用模式1,16位定時器
TH0=0x00; //給定初值,這里使用定時器最大值從0開始計數(shù)一直到65535溢出
TL0=0x00;
EA=1; //總中斷打開 89C52必需要有
ET0=1; //定時器中斷打開
TR0=1; //使用定時器0
}
main()//主程序
{
Init_Timer0();
while(1);
}
//定時器中斷子程序
//interrupt和using都是C51的關(guān)鍵字。C51中斷過程通過使用interrupt關(guān)鍵字和中斷號(0到31)來實現(xiàn)。
//using關(guān)鍵字用來指定中斷服務(wù)程序使用的寄存器組。
//用法是:using后跟一個0到3的數(shù),對應(yīng)著4組工作寄存器。
void Timer0_isr(void) interrupt 1 using 1
{
TH0=0x00; //重新賦值
TL0=0x00;
LED=~LED; //指示燈反相,可以看到閃爍
}
65536 * 1us = 65.536ms,也就是說上面的程序每經(jīng)過65.536ms改變P0^2的狀態(tài)。
那么如何實現(xiàn)1s的精確定時呢,在工作方式1下,我們將計數(shù)初什設(shè)置為0x3CB0(15536),當(dāng)計數(shù)到上限65536時,經(jīng)過了50000個脈沖,即 50000 * 1us = 50ms,如果經(jīng)過這樣的計時20次,就正好達到了1s,為驗證是否正確,可將上面的代碼修改如下:
//1、設(shè)置定時器/計數(shù)器的工作模式TMOD(常用的是模式1:TMOD=0x01);
//2、裝入預(yù)置數(shù)到THx和TLx中(THx=TLx=MAX(8192/65536/256)-計數(shù)次數(shù));
//3、如果工作在中斷方式,則需要開定時器/計數(shù)器的中斷TCON中的標(biāo)志位:TF0/TF1=0/1;
//4、啟動定時器/計數(shù)器:TR0/TR1=1;
// 內(nèi)容:通過定時讓LED燈閃爍
#include
sbit LED=P0^2; //定義LED端口
unsigned int tm=0;
//定時器初始化子程序
void Init_Timer0(void)
{
TMOD = 0x01; //使用模式1,16位定時器
TH0=0x3C; //給定初值,這里使用定時器最大值從0開始計數(shù)一直到65535溢出
TL0=0xB0;
EA=1; //總中斷打開 89C52必需要有
ET0=1; //定時器中斷打開
TR0=1; //使用定時器0
}
main()//主程序
{
Init_Timer0();
while(1);
}
//定時器中斷子程序
//interrupt和using都是C51的關(guān)鍵字。C51中斷過程通過使用interrupt關(guān)鍵字和中斷號(0到31)來實現(xiàn)。
//using關(guān)鍵字用來指定中斷服務(wù)程序使用的寄存器組。
//用法是:using后跟一個0到3的數(shù),對應(yīng)著4組工作寄存器。
void Timer0_isr(void) interrupt 1 using 1
{
TH0=0x3C; //重新賦值 3CB0 = 15536
TL0=0xB0;
tm = tm + 1;
if (tm == 20) // 20次達到1s
{
tm = 0;
LED=~LED; //指示燈反相,可以看到閃爍
}
}
編譯下載到單片機后,測試和預(yù)期一致,LED亮滅的狀態(tài)分別持續(xù)1s。





