1. 程式人生 > >定時器(三)

定時器(三)

前言

前面講了利用定時器3的查詢方式來實現LED1的閃爍,那麼我們怎麼用中斷方式控制呢?今天,我們主要來討論這個話題。

那麼我們想想,應該怎麼讓定時器3產生中斷呢?
無非也就這幾步驟:分頻、開啟溢位中斷、裝數、使能定時器3中斷,使能總中斷、啟動計數。
那麼分頻需要用到哪個暫存器呢?
前章部落格也講過了,需要用到

定時器3的控制暫存器T3CTL

 T3CTL|=0XE0;               //128分頻

接著就是開啟溢位中斷了

定時器3的控制暫存器T3CTL

T3CTL |= 0x08 ;            //開溢位中斷 

然後就是向定時器3放一個數進去

定時器3的控制暫存器T3CTL

T3CTL &= ~0X03;            //自動重灌0x00---0xFF  

然後再開啟定時器3的中斷和總中斷

    T3IE = 1;                  //開Timer3中斷
    EA = 1;                    //開總中斷

最後啟動定時器3

T3CTL |=0X10;              //啟動

因此我們可以將上面的代買封裝成一個函式,方便以後程式碼的使用

void Timer3_interrupt_init()
{
    T3CTL|=0XE0;               //128分頻,
T3CTL |= 0x08 ; //開溢位中斷 T3CTL &= ~0X03; //自動重灌0x00---0xFF T3IE = 1; //開Timer3中斷 EA = 1; //開總中斷 T3CTL |=0X10; //啟動 }

做完上面的還不夠,我們需要寫中斷函式

#pragma vector = T3_VECTOR  //Timer3中斷向量
 __interrupt void T3_ISR(void) 
{ 
    IRCON = 0x00
; //清中斷標誌, 也可由硬體自動完成 if((++count)>254) //254次中斷後LED取反,閃爍一輪(0.5 秒時間) { count = 0; //計數清零 LED1=~LED1; } }

最後我附上主函式的程式碼

void main(void)
{   
    LEDinit();      //呼叫初始化函式
    Timer3_interrupt_init();
    while(1)
    {
    }
}

通過上面的例子,我們很快就能掌握定時器的基本使用,有不懂得童鞋可以在下面留言。下期我們講講DMA。