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