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