pic單片機之中斷程序(附實例)

什麼是中斷程序呢?

形象的生活比喻就比如你現在這在看我的文章,突然你的朋友喊你一起去烤地瓜,這時候你就中斷了看文章和朋友烤地瓜去了,烤完地瓜之後你又回來看文章。烤地瓜這件事就好比中斷程序,他中斷了你看文章這件事。在程序方面來說 當CPU在執行一個程序的時候,突然產生了中斷事件CPU就去執行中斷程序了,當執行完成後CPU又回來執行原先的程序。

中斷事件

什麼是中斷事件,就是引起中斷的事件。對於單片機來說這些事件是多種多樣的。比如 說一個按鍵按下,一定的時間到了,一串數據發送完畢,或接收完一個數據。

講到中斷不得不講講和中斷相對的 查詢。其實不管是按鍵按下 還是 時間到,還是數據發送完畢,這些事實上都可以用查詢的方式辦到。比如 你是經理 如果你想知道屬下任務完成了沒有 一種方式就是去詢問屬下,任務完成沒有。早上沒完成,下午在問。下午沒完成第二天再問。。。。一直到完成為止 這種方式就相當於查詢的方式,另一種就是然屬下完成任務好直接彙報,在下屬執行任務的期間你無需去打撓下屬,當下屬任務完成後就第一時間向你彙報,這種方式就好像中斷。

查詢方式:缺點就是可能會大量浪費CPU的時間,不斷去查詢。如果事情不多還好,可是一旦事情多了會明顯感到運行速度變慢。

中斷方式:可以用在對時間和響應速度有要求的場合。

具體有哪些事件會引起中斷 可以看

pic單片機之中斷程序(附實例)

1,中斷控制寄存器INTCON

2,外設中斷允許寄存器 PIEX 注 : X可以是1 2 3 4.。。。不同型號的單片機數目不同

3,外設中斷標誌寄存器 PIRX 注: X可以是1 2 3 4.。。。不同型號的單片機數目不同

INTCON 中斷控制寄存器講解:

1開啟或關閉 全體的中斷功能(GIE)

2開啟或關閉全體外設的中斷功能(PEIE)外設就是在外設中斷允許/標誌寄存器裡面所寫的設備。

3開啟一些中斷事件。

PIEX 與 PIRX 是相互對應的如:當把PIE1的TMR1IE設置為1 定時器timr1將開啟中斷。等到TMR1定時器溢出後,則會在PIR1的TMRIF將為1,並且執行中斷程序。

實例講解:

我們把上一講的《PIC單片機之定時器》中的實例修改成中斷方式 實現 每隔 50MS亮起LED,每隔50MS滅掉LED。

/*開發環境MPLAB X IDE 芯片型號PIC16LF1823*/

#include

__CONFIG(FOSC_INTOSCWDTE_OFFPWRTE_ONMCLRE_OFFCP_ONCPD_OFFBOREN_ON

CLKOUTEN_OFFIESO_ONFCMEN_ON);//這個要放到上一行去

__CONFIG(PLLEN_OFFLVP_OFF) ;

#define LED LATA5

void init_fosc(void)

{

OSCCON= 0x68;

}

void init_gpio(void)

{

PORTA = 0;

LATA = 0;

ANSELA = 0;

TRISAbits.TRISA5=0;

}

void init_timer0(void)

{

OPTION_REG=0x87;

}

void interrupt isr(void)//中斷程序,interrupt是個關鍵字說明該函數,是中斷函數。

{

LED = ~LED;//改變LED的狀態

INTCONbits.TMR0IF=0;//清零中斷標誌位 如果在離開中斷程序前沒有清零,程序將不停的中斷。

TMR0=61;//給TMR0付初始值61 ,開始下一個50ms計時做準備。

//中斷函數結束 返回主函數。哪裡來回 回那裡去,也就是回到主函數的while(1);處

}

int main(int argc, char** argv)

{

init_fosc();

init_gpio();

init_timer0();

INTCONbits.GIE=1; //開啟總中斷

INTCONbits.TMR0IF=0;//清零TMR0溢出中斷標誌位

INTCONbits.TMR0IE=1;//開啟TMR0溢出中斷

TMR0=61;

while(1);//主函數 在此什麼都沒做一直在死循環。但等到50ms時間到了TMR0將會溢出,程序就會跳到void interrupt isr(void)處執行。

}

我幫大家理清下中斷初始設置大致的步驟

1 ,開啟總中斷,開啟外設中斷。INTCONbits.GIE=1; INTCONbits.PEIE=1;其實即使沒用到外設開啟也無妨。

2 ,清楚相應中斷的標誌位。如INTCONbits.TMR0IF=0;

3 ,開啟相應中斷。如INTCONbits.TMR0IE=1;

中斷函數/程序 中要注意的就是 清零相應的中斷標誌位 如INTCONbits.TMR0IF=0; 否則單片機會認為中斷未被執行 則一直中斷。

pic單片機之中斷程序(附實例)

pic單片機之中斷程序(附實例)


分享到:


相關文章: