8051/8052系列單片機標準向量表:
中斷號 | 描述 | 地址 |
---|---|---|
0 | 外部中斷0 | 0003h |
1 | 定時/計數器0 | 000Bh |
2 | 外部中斷1 | 0013h |
3 | 定時計數器1 | 001Bh |
4 | 串口 | 0023h |
5 | 定時計數器2(8052) | 002Bh |
|
|
unsigned int interruptcnt; unsigned char second; void timer0 (void) interrupt 1 using 2 { if (++interruptcnt == 4000) { second++; interruptcnt = 0; } }interrupt 關鍵詞後跟一個整數,表示中斷號,取值範圍0-31。中斷號必須爲常數,不允許使用操作符表達式。
interrupt關鍵詞影響了該函數的目標代碼:
1)該中斷服務程序被調用時,寄存器ACC、B、DPH、DPL、PSW的內容被壓入堆棧;
2)該函數聲明時,如果沒有使用using關鍵詞指定寄存器組,則在其被調用時,它所使用的所有工作寄存器的內容被壓入堆棧;
3)被壓入堆棧的工作寄存器、特殊寄存器在該退出中斷服務程序前被恢復;
4)該中斷服務程序以RETI指令結束;
下面的程序介紹了interrupt關鍵詞的用法,展示了用於進入、退出中斷服務程序的彙編代碼,using關鍵詞則是爲了指定該中斷服務程序使用與非中斷程序不同的工作寄存器組,須要注意的是,下面的中斷服務程序沒有使用工作寄存器,所以進入函數時切換寄存器組的代碼被優化掉了:
1 extern bit alarm; 2 int alarm_count; 3 4 5 void falarm (void) interrupt 1 using 3 { 6 1 alarm_count *= 2; 7 1 alarm = 1; 8 1 } 下面是對應的彙編代碼: 0000 C0E0 PUSH ACC /* 進入中斷服務程序時,ACC寄存器內容壓棧 */ 0002 C0D0 PUSH PSW /* 進入中斷服務程序時,PSW寄存器內容壓棧 */
0004 E500 R MOV A,alarm_count+01H 0006 25E0 ADD A,ACC 0008 F500 R MOV alarm_count+01H,A 000A E500 R MOV A,alarm_count 000C 33 RLC A 000D F500 R MOV alarm_count,A 000F D200 E SETB alarm 0011 D0D0 POP PSW /* 退出中斷服務程序前,恢復PSW寄存器的內容 */ 0013 D0E0 POP ACC /* 退出中斷服務程序前,恢復ACC寄存器的內容 */ 0015 32 RETI
作爲中斷服務程序的函數必須遵循的規則:
1)中斷服務函數不能有參數;
2)中斷服務函數返回值類型必須爲void類型;
3)不能直接調用或者通過函數指針調用中斷服務函數,中斷服務函數只能由硬件自動調用,我們在程序中調用中斷服務函數,將引起RETI指令的執行,該指令被人爲執行,而其對應的硬件中斷請求並不存在,這將導致單片機硬件中斷系統產生不確定的致命錯誤;
4)Keil Cx51編譯器支持中斷號範圍0-31,具體可用的中斷號須要結合用戶所用的具體芯片手冊;