中斷函數(shù)注意如下:
(1)中斷函數(shù)不能進行參數(shù)傳遞,如果中斷函數(shù)中包含任何參數(shù)聲明都將導(dǎo)致編譯出錯。
(2)中斷函數(shù)沒有返回值,如果企圖定義一個返回值將得不到正確的結(jié)果,建議在定義中斷函數(shù)時將其定義為void類型,以明確說明沒有返回值。
(3)在任何情況下都不能直接調(diào)用中斷函數(shù),否則會產(chǎn)生編譯錯誤。因為中斷函數(shù)的返回是由8051單片機的RETI指令完成的,RETI指令影響8051單片機的硬件中斷系統(tǒng)。如果在沒有實際中斷情況下直接調(diào)用中斷函數(shù),RETI指令的操作結(jié)果會產(chǎn)生一個致命的錯誤。
(4)如果在中斷函數(shù)中調(diào)用了其它函數(shù),則被調(diào)用函數(shù)所使用的寄存器必須與中斷函數(shù)相同。否則會產(chǎn)生不正確的結(jié)果。
(5)C51編譯器對中斷函數(shù)編譯時會自動在程序開始和結(jié)束處加上相應(yīng)的內(nèi)容,具體如下:在程序開始處對ACC、B、DPH、DPL和PSW入棧,結(jié)束時出棧。中斷函數(shù)未加using n修飾符的,開始時還要將R0~R1入棧,結(jié)束時出棧。如中斷函數(shù)加using n修飾符,則在開始將PSW入棧后還要修改PSW中的工作寄存器組選擇位。
(6)C51編譯器從絕對地址8m+3處產(chǎn)生一個中斷向量,其中m為中斷號,也即interrupt后面的數(shù)字。該向量包含一個到中斷函數(shù)入口地址的絕對跳轉(zhuǎn)。
void IsrTimer0(void) interrupt [n] n為中斷號,編譯器將n*8+3=中斷(入口)向量地址
也就是說:
中斷號 中斷名 中斷向量地址
0 INT 0(外部中斷0) 0003H
1 TIMER/COUNTER 0(定時/計數(shù)器0) 000BH
2 INT 1(外部中斷1) 0013H
3 TIMER/COUNTER 1(定時/計數(shù)器1) 001BH
4 SERIAL PORT(串口中斷) 0023H
5 TIMER/COUNTER 2(定時/計數(shù)器2) 002BH
外注: 上電復(fù)位 0000H
(7)中斷函數(shù)最好寫在文件的尾部,并且禁止使用extern存儲類型說明。防止其它程序調(diào)用。