微控制器中斷中 void time0() interrupt 1 using 1中的interrupt 1 和 using 1各代表什麼意思
阿新 • • 發佈:2019-02-04
定義中斷服務函式 函式型別 函式名 (形式引數) interrupt n [using n] 中斷號 中斷源 中斷向量 0 外部中斷0 0003H 1 定時器/計數器0 000BH 2 外部中斷1 0013H 3 定時器/計數器1 001BH 4 序列口 0023H interrupt 關鍵字是不可缺少的,由它告訴編譯器該函式是中斷服務函式,並由後面的 n 指明所使用的中斷號。n 的取值範圍為0-31,但具體的中斷號要取決於晶片的型號,像 AT89C51 實際上就使用0-4 號中斷。每個中斷號都對應一箇中斷向量,具體地址為8n+3, 中斷源響應後處理器會跳轉到中斷向量所處的地址執行程式,編譯器會在這地址上產生一個 無條件跳轉語句,轉到中斷服務函式所在的地址執行程式。
樓上qmt已經大致給你介紹清楚了中斷函式的定義,值得提出的是,中斷函式型別void,說明中斷函式是不能有返回值的,這點要明確,所以不要企圖讓中斷函式給你個返回值。還有,函式名後面括弧內是沒有引數的。。。這點也需要注意,中斷函式不能傳遞引數。 interrupt 後面的點是中斷號。重點我給你解釋下using。 這是C51編譯器擴充套件的關鍵字。用來選擇80c51微控制器中不同的暫存器組,你也知道R0-R7總共有4組,那麼using 後面的數字也就是0-3範圍裡的一個數了。如果不需要using的話,編譯器會自動選擇一組暫存器作為絕對暫存器訪問的。 using對程式碼是有一定的影響的。 給你說個簡單的例子,你可以想下, 如果定義 void time0() interrupt 1 using 1 假設,我們又在中斷裡呼叫了一個delay();這個delay是起延時作用。 那麼,我們就需要確保我們使用的暫存器組是同一組,否則,就會出現混亂。 這樣說你能明白麼? 所以,我建議你,不必要時不要使用using。不過,你可以試下這個關鍵字。 祝你學習順利。 LX efenwu: 簡單來說,51有4組通用暫存器,R0~R7,我們在使用的時候,從來就沒有指明用的是哪個R0,編譯器就會自動選一組通用暫存器作為絕對地址訪問。在c語言中,我們寫一個函式,例如延時函式,裡面用的變數,反彙編之後就是在使用R0-R7,那麼你能確定你使用的是哪一組暫存器嗎? 所以說,使用using能選擇使用的暫存器組,但同時在“切換”時要特別小心。你在中斷程式裡呼叫別的程式就會出現暫存器組切換問題。。 其實using還有其他的注意地方,因為使用麻煩,我從來不用這個關鍵字。這也就是我為什麼不推薦樓主用using。編譯器會自己選擇一組嘛。 所以只要這樣定義一箇中斷函式就行了: void FuncName() interrupt lvl 其中lvl就是中斷的優先順序序號。 要是還有什麼地方不明白的地方,請指出來,共同學習嘛。