Keil C51 中斷服務程式 (ISR) 宣告格式
void Time1(void) interrupt 3
逐詞解析
| 關鍵字 | 含義 |
void | 返回類型:中斷函數無返回值 |
Time1 | 函數名稱:開發者自訂,建議語意化 |
(void) | 參數列表:中斷函數不接受參數 |
interrupt | 關鍵字:告訴編譯器這是中斷服務程式 |
3 | 中斷號:對應硬體中斷向量表項號 |
51 系列常見中斷號對照表
| 中斷號 | 來源 | 向量地址 |
| 0 | 外部中斷 0 (INT0) | 0x0003 |
| 1 | 定時器 0 溢位 (TF0) | 0x000B |
| 2 | 外部中斷 1 (INT1) | 0x0013 |
| 3 | 定時器 1 溢位 (TF1) | 0x001B |
| 4 | 串口中斷 (RI/TI) | 0x0023 |
啟用中斷的完整步驟
void Timer1_Init(void)
{
TMOD |= 0x10; // 定時器1 模式1 (16位)
TH1 = 0xFC; // 1ms @ 11.0592MHz
TL1 = 0x18;
ET1 = 1; // 開啟定時器1中斷
EA = 1; // 開啟總中斷
TR1 = 1; // 啟動定時器1
}
void Timer1_ISR(void) interrupt 3
{
TH1 = 0xFC; TL1 = 0x18; // 重裝初值
// 用戶任務代碼...
}
注意事項
- 中斷函數 不可手動呼叫,由硬體自動觸發。
- ISR 應極短、不阻塞、避免呼叫非重入函數 (如
printf)。
- 共享變數需宣告為
volatile,必要時關中斷保護。