中斷服務子程式怎麼寫 - 使用stc12c5a60s2雙串列埠微控制器時串列埠2的中斷服務子程式怎麼寫呢

來源:趣味經驗館 1.09W
1.使用stc12c5a60s2雙串列埠微控制器時 串列埠2的中斷服務子程式怎麼寫呢

摘錄一段我寫的程式供參考:;------------------相關暫存器定義------------------------AUXR EQU 8EH ;輔助暫存器AUXR1 EQU 0A2H ;輔助暫存器1CLK_DIV EQU 97H ;時鐘分頻器S2CON EQU 9AH ;串列埠2控制暫存器S2BUF EQU 9BH ;串列埠2資料緩衝區BRT EQU 9CH ;波特率暫存器IE2 EQU 0AFH ;中斷控制暫存器2;-----------------序列初始化程式-------------------------UART_INIT: ORL PCON,#80H ;使能波特率倍速位SMOD MOV SCON,#50H ;8位資料,可變波特率 MOV S2CON,#50H ;8位資料,可變波特率 MOV BRT,#0FAH ;[email protected] ORL AUXR,#14H ;獨立波特率發生器時鐘為Fosc,即1T ORL IE2,#01H ;允許串列埠2中斷 ANL AUXR,#03FH ;定時器12時鐘為Fosc,即12T ANL AUXR,#0FEH ;串列埠1選擇定時器1為波特率發生器 MOV TMOD,#21H ;設定定時器1為8位自動重灌方式,0為16位定時器 MOV TL1,#0FFH ;[email protected] MOV TH1,#0FFH ;設定定時器重灌值 MOV SERGET,#0 ;接收RS232 Pointer is 0 MOV SERPUT,#0 ;取值RS232 Pointer is 0 MOV RXGET,#0 ;接收RS485 Pointer is 0 MOV RXPUT,#0 ;取值RS485 Pointer is 0 CLR P4.4 ;485處於接收狀態 ORL IPH,#10H ; SETB PS ;串列埠1中斷優先順序11為最高 CLR ET1 ;禁止定時器1中斷 SETB TR1 ;啟動定時器1 CLR BUSY RET;-----------------序列通訊2中斷服務程式-------------------------SER2INT: PUSH ACC PUSH PSW MOV A,S2CON JNB ACC.0,SER2INT1 ;S2RI ANL S2CON,#NOT S2RI MOV A,S2BUF MOV B,A MOV R0,#RXRAM MOV A,RXPUT ANL A,#0FH ORL A,R0 MOV R0,A MOV A,B MOV @R0,A LCALL SENDRXDAT INC RXPUT SJMP SERINT2 SER2INT1: MOV A,S2CON JNB ACC.1,SERINT2 ;S2TI ANL S2CON,#NOT S2TI CLR BUSYSERINT2: POP PSW POP ACC RETI;-----------------序列通訊1中斷服務程式-------------------------SER1INT: PUSH ACC PUSH PSW PUSH DPL PUSH DPH SETB RS0 CLR RS1 JBC RI,SERTIRI1 ;是接收中斷,清除此標誌,轉接收 CLR TI ;是傳送中斷,清除此標誌,中斷返回 SJMP SERENDSERTIRI1: MOV A,SBUF ;接收(讀入)資料 MOV B,ASERTIRI2: MOV R0,#SERRAM MOV A,SERPUT ANL A,#1FH ORL A,R0 MOV R0,A MOV A,B MOV @R0,A INC SERPUT MOV DLY03,A SETB SERBITSEREND: POP DPH POP DPL POP PSW POP ACC RETI。

中斷服務子程式怎麼寫 使用stc12c5a60s2雙串列埠微控制器時串列埠2的中斷服務子程式怎麼寫呢
2.中斷服務子程式應至少包括哪些內容

1、中斷請求:中斷事件一旦發生或者中斷條件一旦構成,中斷源提交“申請報告”,與請求CPU暫時放下目前的工作而轉為中斷源作為專項服務

2、中斷遮蔽:雖然中斷源提交了“申請報告”,但是,是否得到CPU的響應,還要取決於“申請報告”是否能夠通過2道或者3道“關卡”(中斷遮蔽)送達CPU(相應的中斷遮蔽位等於1,為關卡放行;反之相應的中斷遮蔽位等於0,為關卡禁止通行);

3、中斷響應:如果一路放行,則CPU響應中斷後,將被打斷的工作斷點記錄下來(把斷點地址保護到堆疊),掛起“不再受理其他申請報告牌”(清除全域性中斷標誌位GIE=0),跳轉到中斷服務子程式

4、保護現場:在處理新任務時可能破壞原有的工作現場,所以需要對工作現場和工作環境進行適當保護;

5、調查中斷源:檢查“申請報告”是由哪個中斷源提交的,以便作出有針對性的服務;

6、中斷處理:開始對查明的中斷源進行有針對性的中斷服務;

7、清除標誌:在處理完畢相應的任務之後,需要進行撤消登記(清除中斷標誌),以避免造成重複響應;

8、恢復現場:恢復前面曾經被保護起來的工作現場,以便繼續執行被中斷的工作;

9、中斷返回:將被打斷的工作斷點找回來(從堆疊中恢復斷點地址),並摘下“不再受理其他申請報告牌”(GIE=1),繼續執行原先被打斷的工作。

3.中斷服務子程式和普通子程式有什麼區別

區別:

1、程式是否提前安排好:中斷服務程式是隨機的,而普通子程式是預先安排好的。

2、結束程式不同:中斷服務子程式以RETI結束,而一般子程式以RET結束。

3、結束動作不同:中斷服務子程式RETI除將斷點彈回PC動作外,還要清除對應的中斷優先標誌位,以便新的中斷請求能被響應。一般子程式則無此項操作。

擴充套件資料:

當中央處理器正在處理內部資料時,外界發生了緊急情況,要求CPU暫停當前的工作轉去處理這個緊急事件。處理完畢後,再回到原來被中斷的地址,繼續原來的工作,這樣的過程稱為中斷。

實現這一功能的部件稱為中斷系統,申請CPU中斷的請求源稱為中斷源,微控制器的中斷系統一般允許多箇中斷源,當多箇中斷源同時向CPU請求中斷時,就存在一箇中斷優先權的問題。通常根據中斷源的優先級別,優先處理最緊急事件的中斷請求源,即最先響應級別最高的中斷請求。

中斷處理過程:

(1)保護被中斷程序現場。為了在中斷處理結束後能夠使程序準確地返回到中斷點,系統必須儲存當前處理機程式狀態字PSW和程式計數器PC等的值。

(2)分析中斷原因,轉去執行相應的中斷處理程式。在多箇中斷請求同時發生時,處理優先順序最高的中斷源發出的中斷請求。

(3)恢復被中斷程序的現場,CPU繼續執行原來被中斷的程序。

參考資料來源:百度百科-中斷服務程式

4.中斷服務子程式與普通子程式有哪些異同之處

一、主體不同

1、中斷服務子程式:是一種服務,是通過執行事先編好的某個特定的程式來完成的。

2、普通子程式:是一個大型程式中的某部份程式碼,由一個或多個語句塊組成。

二、功能不同

1、中斷服務子程式:外界發生了緊急情況,要求CPU暫停當前的工作轉去處理這個緊急事件。處理完畢後,再回到原來被中斷的地址,繼續原來的工作。

2、普通子程式:負責完成某項特定任務,而且相較於其他程式碼,具備相對的獨立性。

三、特點不同

1、中斷服務子程式:為了在中斷處理結束後能夠使程序準確地返回到中斷點,系統必須儲存當前處理機程式狀態字PSW和程式計數器PC等的值。

2、普通子程式:常被使用在彙編語言層級上。子程式的主體是一個程式碼區塊,當被呼叫時就會進入執行。

參考資料來源:百度百科-子程式

參考資料來源:百度百科-中斷服務程式

5.c語言中中斷服務子程式與其他子程式的區別

中斷是微控制器的一個重要功能,中斷子程式專為執行中斷功能,它是在發生中斷後,自動執行的,不需要主程式呼叫;普通子函式要主程式呼叫才能執行。

彙編裡的區別:

普通子函式用RET返回;中斷子程式用RETI返回,RETI返回時要清除中斷標誌的;

普通子函式呼叫時直接進入函式入口地址,中斷函式在中斷髮生時先進中斷入口

03H、08H、13H、18H、23H後隨即寫一個跳轉指令,再跳轉到相應語句。

C語言區別:

普通子函式用的是C語言裡的主函式呼叫子函式的方法,子函式可以有引數,有返回值;中斷函式沒有引數,沒有返回值;

中斷函式的寫法也不一樣,以80c51為例:

void INT0() interrupt 0 using 1

{

}

interrupt 0不是是外部中斷0引發的中斷,必須寫; using 1

表示在中斷函式裡用第一組暫存器R0-R7.這個可以省略。

6.呼叫中斷服務程式和呼叫子程式有何分別

1. 子程式呼叫一定是程式設計師在編寫程式時事先安排好的,是可知的,而中斷是由中斷源根據自身的需要產生的,是不可預見的(用指令INT引起的中斷除外)。

2. 子程式呼叫是用CALL指令來實現的,但沒有呼叫中斷的指令,只有發出中斷請求的事件(指令INT是發出內部中斷訊號,而不要理解為呼叫中斷服務程式);

3. 子程式的返回指令是RET,而中斷服務程式的返回指令是IRET/IRETD。

4. 在通常情況下,子程式是由應用程式開發者編寫的,而中斷服務程式是由系統軟體設計者編寫的。

7.怎樣寫中斷服務程式

方法1. 用關鍵詞interrupt和中斷向量編號定義中斷函式

這種方式最簡單也最直觀。缺點是程式的可移植性稍差。範例如下:

void interrupt 17 sci1_Recv_ISR(void){

。.}關鍵詞interrupt告訴編譯器此函式為中斷服務函式,數字17告訴聯結器該中斷向量的偏移位置(以復位向量偏移為0計)。某一箇中斷響應對應的向量入口編號可以在該晶片的DataSheet中查到。

方法2. 用關鍵詞interrupt定義中斷函式,中斷向量入口由prm檔案指定,仍以上面的中斷服務函式為例,這時函式的定義方式為

void interrupt sci1_Recv_ISR(void){

。..}然後在專案對應的prm檔案中新增一行向量位置定義:

VECTOR 17 sci1_Recv_ISR //指定的中斷服務向量入口

方法3. 用#pragma TRAP_PROC定義中斷函式,中斷向量入口由prm檔案指定。此型別的函式編譯器在將C程式碼編譯成彙編指令時會在程式碼前後增加必要的現場保護和恢復彙編程式碼,同時函式的最後返回用匯編指令RTI而不是針對普通函式的RTS。例如

熱門標籤