問:我應(yīng)該如何為一個PIC單片機編寫中斷服務(wù)程序?
答:僅僅是用一個'interrupt'關(guān)鍵詞聲明一個函數(shù)就好了。編譯器會把它放到合適的位置,并且會注意所有的寄存器保護和恢復(fù)。
#include
/*
-
Interrupt demo for PIC; wait for button press on RB0/INT,
-
turn on a relay on another port bit for a period of time.
-
For simplicity here, literal constants are used, usually these
-
should be calculated with compile-time arithmetic.
*/
static bit RELAY @ (unsigned)&PORTB*8+7;// 使用這個位來驅(qū)動一個繼電器
static unsigned int relay_timer; //繼電器驅(qū)動器的定時值
void
main(void)
{
RELAY = 1; // 確保繼電器在使能前是關(guān)閉的
TRISB = 0x3F; // Port B的第7、6位是輸出
T0CS = 0; // 定時器是以指令周期累加
T0IE = 1; // 使能TMR0溢出中斷
INTEDG = 0; // INT中斷是下降沿觸發(fā)
INTE = 1; // 使能INT中斷
GIE = 1; // 全局中斷使能
for(;;)
CLRWDT(); // 閑時喂一下狗
}
static void interrupt
isr(void) // 這里是中斷服務(wù)函數(shù)
// isr是函數(shù)名,并不重要,可任意命名
{
if(T0IF) { //如果是定時器0中斷
TMR0 -= 250; //重載定時器,每250uS中斷一次
T0IF = 0; //清中斷標志位
if(relay_timer != 0) //繼電器定時到了嗎?
relay_timer--; //定時值減一
if(relay_timer == 0) //如果定時時間到了
RELAY = 1; //關(guān)閉繼電器
PORTB ^= 0x40;//翻轉(zhuǎn)一個端口來指示程序還是在正常工作的
}
if(INTF) { //有沒有一個按鍵按下?
RELAY = 0; //打開繼電器
relay_timer = 4000;//啟動定時器-4000個時間片=約1秒鐘
INTF = 0; //清中斷標志位
}
}
(譯者注:建議在if條件中,同時檢查中斷標志位和中斷使能位,如:if(T0IF && T0IE)。)
-
單片機
+關(guān)注
關(guān)注
6067文章
44976瀏覽量
650180 -
編譯器
+關(guān)注
關(guān)注
1文章
1661瀏覽量
50192
發(fā)布評論請先 登錄
PIC單片機程序設(shè)計基礎(chǔ)格式
PIC單片機循環(huán)程序實例
51單片機有幾個中斷?單片機的中斷號對應(yīng)的中斷類型說明

PIC單片機定時器的外設(shè)中斷的使用程序免費下載

用C語言編寫PIC單片機適用程序

PIC單片機 按鍵檢測識別

評論