㈠ 單片機使用C語言時,中斷子程序在主程序中是怎樣被調用的各位helpme!
中斷是硬體入口的無須主程序調用,不同的單片機入口地址不同但地址固定,應該在頭文件有定義。發生中斷時硬體把當前地址入棧然後跳到中斷地址去那裡通常只是跳轉指令,c編譯時會把它指向中斷子程序。返回時會返回到中斷處繼續執行。
㈡ 單片機C語言中,中斷子程序後面為什麼要加interrupt這個單詞
void
functionName()
interrupt
1
//using
2
類型固定為void即無返回值
中斷函數名functionName只要是合法標識,不與已有的函數重名即可,且函數固定無參數
interrupt為關鍵字,表明當前是一個中斷函數,不需要被主函數直接或間接調用,也會編譯連接進程序中,一般的非中斷函數如果未被主函數直接或間接調用,也不被中斷函數直接或間接調用,則不會鏈接進程序最終代碼
interrupt後的數字表明是中斷號幾,單片機中
51系列的有0
1
2
3
4
等幾個中斷,
52系列的中斷可能到了7或8
中斷號與中斷事件是綁定的,不能隨便設置,對應的中斷向量會指向這個函數入口地址
可選的using
N
表示中斷中使用第幾個寄存器組
㈢ MSP430單片機中,如何設置中斷子程序,可以使系統從LPM4 模式進入活動模式。
在主函數中進入休眠模式並打開總中斷,然後在中斷程序裡面執行想要的操作就可以了。
一般XT2IN的頻率為高頻,按實際應用時的要求來選用;XIN為低頻,可以是32 768Hz。XIN的用途主要是在低功耗時使系統保持「活著」。MSP430共有5種省電方式,即LPM0~4。
系統在LPMO-3方式下可以被喚醒,LPM4則不能。大多數應用場合都希望MSP430平時進入睡眠狀態,降低功耗,而後定時或被外界中斷喚醒,執行相應的程序後再次進入睡眠狀態,再次被喚醒,其中因為LPM3是滿足要求且功耗最低的一種方式,所以它被使用得最多。
(3)單片機中斷子程序擴展閱讀:
MSP430系列單片機是一個16位的單片機,採用了精簡指令集(RISC)結構,具有豐富的定址方式(7 種源操作數定址、4 種目的操作數定址)、簡潔的 27 條內核指令以及大量的模擬指令;大量的寄存器以及片內數據存儲器都可參加多種運算;還有高效的查表處理指令。這些特點保證了可編制出高效率的源程序。
㈣ 單片機里中斷返回和子程序返回的區別是什麼
基本沒有區別!都會在返回時恢復壓棧的PC指針並繼續執行程序。
中斷處理程序實際上也可以看做是一個普通的子程序,只是它的調用是預先設定的地址入口,並且它的調用時由中斷觸發的;而子程序是我們人為地調用的。
但是中斷子程序的返回有時要考慮對中斷的處理(如開關中斷允許、初始化數據-----比如計數器或者定時器的初始值處理等等)。
㈤ 單片機C51問題:在中斷子程序中產生中斷會怎麼樣,如下描述:
當出現以下任一情況,中斷響應受阻,也就是不會進入中斷程序
1)同級或高級的中斷服務正在進行;
2)當前的機器周期還不是當前指令的最後一個周期,指令執行完之前,不會響應任何中斷請求;
3)正在執行RETI或對IE、IP進行讀寫操作,至少要執行一條其它指令才會響應;
在每個機器周期的s5p2期間,cpu對中斷源依次采樣,若遇到上述情況,會把中斷請求鎖存在各自的中斷標志位中,等下一個機器周期再按順序查詢。也就是同級中斷不會被打斷,在這里TI已經被清零,這個中斷退出後不會再響應了
還有點小問題,中斷程序一開始應該執行一個if(RI)條件判斷,要不然可能會讀入垃圾數據
㈥ 單片機中斷與調用子程序有什麼不同之處
在單片機里區別是不大。不過在其它處理器上就大了。比如arm,中斷會直接改變運行模式,使用不同的寄存器集。單片機區別不大的原因是他只有一個工作模式。
不過,中斷最主要的特點是有中斷線觸發的,而子程序是程序觸發的。你不可能知道什麼地方轉到中斷處理。在編程思錄上完全是兩回事,盡管代碼上差不多。
㈦ 單片機程序中,中斷服務子程序與其他普通程序有什麼不同
這兩類型的子程序區別在於如下幾點:
中斷服務子程序有5個中斷源
中斷服務子程序不需要在主程序中被調用,而是滿足條件自動觸發
從指令上看中斷用RETI,子程序用RET
在調用普通子程序時有可能被優先順序高的中斷子程序打斷
兩者入口地址不同,中斷有固定入口地址
㈧ 51單片機外部中斷子程序為什麼會執行兩次
你的外部中斷應該是屬於下降沿觸發,當有一個下降沿到來時外部中斷請求標志IE0或IE1(外部中斷0或外部中斷1請求中斷標志,下面簡稱為IEx)就會置1,當進入中斷程序後IEx由硬體歸零。也就是說單片機當檢測到IEx為1的時候就會進入到外部中斷程序。x0dx0a現在來分析一下為什麼你的程序會執行兩次中斷。x0dx0a當單片機外部中斷引腳第一次接收到一個下降沿時,IEx被置1,進入中斷程序,隨即IEx被硬體清零。然而由於你用杜邦線接觸P3.2口存在抖動(你感覺不到),外部中斷引腳再次接受到一個下降沿,IEx又被置1,單片機又要響應中斷,但此時由於上一個中斷程序未執行完,單片機將等待外部中斷程序執行完(你可以理解為有兩個中斷事件,但這兩個事件優先順序相同,所有按順序響應)。在這個過程中,你的接觸仍然會產生很多下降沿,但因為IEx只有響應了中斷事件後才會清零,因此IEx一直為1。當第一次的中斷程序執行結束後,單片機檢測到IEx又是1,馬上又再次進入中斷。因為你的接觸時間遠遠小於你的中斷程序執行時間,因此在第二次執行中斷程序前已不存在下降沿,所以進入第二次中斷程序後,IEx就被清零了,這樣執行完第二次中斷程序後就不會再次進入中斷了。x0dx0a說了那麼多希望你能明白吧。不明白可以翻查相關單片機外部中斷相關資料。
㈨ 單片機中斷程序
結構很規矩,這個程序。
首先單片機上電復位,運行死循環前面的程序(,你這里就是init_timer(); // 應該叫初始化定時器,才合適,讓定時器按照你需要的定時長度工作,或叫產生中斷 )
接下來單片機主程序就是一直在死循環了。我們的主要任務一般在這里處理。
中斷,就是在處理一些特殊任務,比如按鍵,或定時處理的程序,或外部一個不知道什麼時間發生的任務,或通信任務等等。你在主循環的時候,無論在什麼時候,中斷請求來了(可以理解為需要處理比較緊急任務,優先處理的任務),就會暫停主循環,進入對應中斷服務程序。運行完,在回主循環的暫停地方,繼續執行死循環的任務。
定時器中斷,就是每過一定時間,運行一下中斷服務程序。常用來計時和產生脈沖信號。
初始化定時器,就是給定時器的寄存器,設置工作模式,時鍾源,溢出的計數值。設置好了,定時器就能根據每個時鍾源的頻率,進行計數,直至溢出,然後產生一個中斷請求。如果不餓能自動載入計數初值的定時器,在中斷處理函數(服務函數)必須手動載入初值。