C51編譯器允許用c51創建中斷服務程序,大家僅僅需要關心中斷號和寄存器組的選擇就可以了。編譯器自動產生中斷向量和程序的入棧及出棧代碼。在函數聲明時包括interrupt,將把所聲明的函數定義為一個中斷服務程序。另外,可以用using定義此中斷服務程序所使用的寄存器組。
中斷函數的定義
中斷函數定義的格式為:
函數類型 函數名 interrupt n using n
其中:
Interrupt後麵的n是中斷號。
關鍵字using後麵的n是所選擇的寄存器組,取值範圍是0-3.
定義中斷函數時,using是一個選項,可以省略不用。如果不用則由編譯器選擇一個寄存器組作為絕對寄存器組。
8051的中斷過程通過使用interrupt關鍵字和中斷號來實現,中斷號告訴編譯器中斷程序的入口地址。中斷號對應著IE寄存器中的使能位,換句話說,IE寄存器中的0位對應著外部中斷0,相應的外部中斷0的中斷號是0.
IE寄存器中的使能位與外部中斷對應關係:
中斷號 中斷源
0 外部中斷0
1 定時器0
2 外部中斷1
3 定時器1中斷
4 串行口中斷
5 定時器2中斷
使用中斷函數時要注意的問題:
1. 在設計中斷時,要注意的是哪些功能應該放在中斷程序中,哪些功能應該放在主程序中。一般來說中斷服務程序應該做最少量的工作,這樣做有很多好處。首先係統對中斷的反應麵更寬了,有些係統如果丟失中斷或對中斷反應太慢將產生十分嚴重的後果,這時有充足的時間等待中斷是十分重要的。其次它可使中斷服務程序的結構簡單,不容易出錯。
中斷程序中放入的東西越多,他們之間越容易起衝突。簡化中斷服務程序意味著軟件中將有更多的代碼段,但可把這些都放入主程序中。中斷服務程序的設計對係統的成敗有至關重要的作用,要仔細考慮各中斷之間的關係和每個中斷執行的時間,特別要注意那些對同一個數據進行操作的ISR.
2. 中斷函數不能傳遞參數。
3. 中斷函數沒有返回值。
4. 中斷函數調用其他函數,則要保證使用相同的寄存器組,否則出錯。
5. 中斷函數使用浮點運算要保存浮點寄存器的狀態。