51單片機(jī) | 定時器中斷應(yīng)用實(shí)例
設(shè)計要求:
每秒點(diǎn)亮P1.0口的發(fā)光二極管一次,然后熄滅,使發(fā)光二極管形成閃爍效果
實(shí)現(xiàn)思路:
通過定時/計數(shù)器,每秒觸發(fā)一次P1.0取反
涉及到的功能模塊:定時器,中斷,LED操作
定時器裝填:
需要計數(shù)每秒的話,計數(shù)921600時溢出即可,在四種方式定時方式中,最大的計數(shù)范圍是方式2:65536,將921600分解成20份,每份計數(shù)46080時溢出,當(dāng)溢出20次時燈閃爍,每次定時器溢出都要重新裝填
模塊設(shè)計
1、初始化
LED(上拉輸入模式)
定時器(T0,工作方式1,裝填初值,啟動(在中斷初始化后啟動))
中斷(開放中斷,開放T0中斷)
2、while(1)
3、中斷
重置定時器(溢出位復(fù)位,重新裝填計時)
判斷溢出次數(shù)(到達(dá)20次時LED改變狀態(tài),計數(shù)清零。未到達(dá)20次時溢出次數(shù)加一)
實(shí)現(xiàn)代碼:
#include
#include
typedef unsigned char uchar;
sbit LED = P1 ^ 0;
uchar count = 0;
void Interrupt() interrupt 1
{
TH0 = (65536 - 46080) / 256; //觸發(fā)中斷時重新裝填計時
TL0 = (65536 - 46080) % 256;
if (count == 20)
{
LED = ~LED;
count = 0;
}
else ++count;
}
void main(void)
{
LED = 0xff; //初始化LED
TMOD = 0x01; //初始化TMOD,定時器0,方式1
TH0 = (65536 - 46080) / 256; //裝填計數(shù)
TL0 = (65536 - 46080) % 256;
EA = 1; //開放所有中斷
ET0 = 1; //開放定時器0中斷控制位
TR0 = 1; //定時器0開始計時
while(1)
{
_nop_();
}
}