51單片機(jī)中斷的響應(yīng)及撤銷
中斷服務(wù)程序完成后,一定要執(zhí)行一條RETI指令,執(zhí)行這條指令后,CPU將會(huì)把堆棧中保存著的地址取出,送回PC,那么程序就會(huì)從主程序的中斷處繼續(xù)往下執(zhí)行了。
說(shuō)明 CPU所做的保護(hù)工作是很有限的,只保護(hù)了一個(gè)地址(主程序中斷處的地址),而其他的所有東西都不保護(hù),所以如果你在主程序中用到了如A、DPTR、PSW等,在中斷程序中要用它們,還要保證回到主程序后這里面的數(shù)據(jù)還是沒(méi)執(zhí)行中斷以前的數(shù)據(jù),就得自己保護(hù)起來(lái)。
CPU會(huì)在機(jī)器周期的S5P2階段讀入中斷標(biāo)志,并在下一個(gè)機(jī)器周期中檢查,如果中斷條件成立時(shí),系統(tǒng)會(huì)自行產(chǎn)生一個(gè)LCALL到相對(duì)應(yīng)的中斷服務(wù)例程中,可是如果有下面3種情況時(shí),系統(tǒng)是不會(huì)對(duì)中斷要求信號(hào)有反應(yīng)的:
a有相等或更高級(jí)的中斷正在執(zhí)行中,這與處理突發(fā)事件的狀況相同,既然已經(jīng)在處理突發(fā)情況,當(dāng)然就不再接受其他中斷條件,除非接下來(lái)的中斷情形的優(yōu)先權(quán)比較高。
由此得到一個(gè)觀念:所有的中斷程序都應(yīng)該盡量簡(jiǎn)捷,一處理完中斷事項(xiàng)后立即回主程序,才不會(huì)占用過(guò)多時(shí)間,進(jìn)而影響系統(tǒng)的性能。
b目前的機(jī)器周期不是該指令的最后一個(gè)周期,由于80c51在指令執(zhí)行時(shí),分別有1個(gè)、2個(gè)和4個(gè)機(jī)器周期之分,也就是說(shuō),必須完全執(zhí)行完此指令后,系統(tǒng)對(duì)中斷信號(hào)才會(huì)有所反應(yīng)。比方說(shuō),當(dāng)系統(tǒng)正在執(zhí)行MUL AB指令(需花4個(gè)機(jī)器周期)時(shí),中斷信號(hào)必須出現(xiàn)在第4個(gè)機(jī)器周期上才算有效。這也就意味著,中斷信號(hào)必須持續(xù)足夠長(zhǎng)的時(shí)間,以便80c51的CPU有時(shí)間去反應(yīng)。
c若正在執(zhí)行的指令為RETI或者是關(guān)于中斷設(shè)置IE、IP的指令時(shí),對(duì)正好出現(xiàn)的中斷信號(hào)不反應(yīng),因?yàn)樯鲜龅那闆r剛好是某個(gè)中斷服務(wù)程序的結(jié)束,或是允許/禁止某個(gè)中斷的指令,當(dāng)然是等到這些指令執(zhí)行完畢后,才會(huì)對(duì)中斷信號(hào)有所反應(yīng),這些指令最多占用兩個(gè)機(jī)器周期的時(shí)間,所以這時(shí)的中斷信號(hào)必須保持有兩個(gè)機(jī)器周期以上的時(shí)間,才能被80c51接受。
中斷的撤除
中斷響應(yīng)后,TCON或SCON中的中斷請(qǐng)求標(biāo)志應(yīng)及時(shí)清除。否則就意味著中斷請(qǐng)求仍然存在,弄不好就會(huì)造成中斷的重復(fù)查詢和響應(yīng),因此就存在一個(gè)中斷請(qǐng)求的撤除問(wèn)題。
1 定時(shí)器中斷請(qǐng)求的撤除
定時(shí)中斷響應(yīng)后,硬件自動(dòng)把標(biāo)志位TF0(或TF1)清0,因此定時(shí)中斷的中斷請(qǐng)求是自動(dòng)撤除的,不需要用戶干預(yù)。
2 串行中斷軟件撤除
對(duì)于串行中斷,CPU響應(yīng)中斷后,沒(méi)有用硬件清除它們的中斷標(biāo)志RI、TI,必須在中斷服務(wù)程序中用軟件清除,以撤除其中斷請(qǐng)求。
3 外中斷請(qǐng)求的撤除
外部中斷的撤除包括中斷標(biāo)志位IE0(或IE1)的清0和外中斷請(qǐng)求信號(hào)的撤除。其中IE0(或IE1)清“0”是在中斷響應(yīng)后由硬件電路自動(dòng)完成的。剩下的只是外中斷引腳請(qǐng)求信號(hào)的撤除了。下面對(duì)脈沖和電平兩種觸發(fā)方式分別進(jìn)行討論。
a對(duì)于脈沖方式的中斷請(qǐng)求,由于脈沖信號(hào)過(guò)后就消失了,也可以說(shuō)中斷請(qǐng)求信號(hào)是自動(dòng)撤除的。
b對(duì)于電平方式的外部中斷,中斷標(biāo)志的撤除是自動(dòng)的,但中斷請(qǐng)求信號(hào)的低電平可能繼續(xù)存在,在以后機(jī)器周期采樣時(shí),又會(huì)把已清0的IE0或IE1標(biāo)志位重新置1.為此,要徹底解決電平方式外中斷的撤除,除了標(biāo)志位清0之外,必要時(shí)還需在中斷響應(yīng)后把中斷請(qǐng)求信號(hào)引腳從低電平強(qiáng)制改變?yōu)楦唠娖?,為此,可在系統(tǒng)中增加如圖所示電路
外中斷請(qǐng)求標(biāo)志撤除電路
從圖可以看出,外部中斷0請(qǐng)求信號(hào)在D觸發(fā)器(可選用74LS74)的時(shí)鐘輸入端。當(dāng)外部設(shè)備有中斷請(qǐng)求信號(hào)(為低電平)出現(xiàn)時(shí),Q端輸出為低電平,/INT0有效,向CPU發(fā)出中斷請(qǐng)求信號(hào)。CPU響應(yīng)中斷后,在中斷服務(wù)程序中由軟件安排1個(gè)低電平中斷應(yīng)答信號(hào),從P1.0送至D觸發(fā)器的/SD(置位端,低電平有效),使D觸發(fā)器的Q端輸出為高電平,從而撤除了低電平的外中斷0請(qǐng)求信號(hào)。/SD端所需的低電平可通過(guò)在中斷服務(wù)程序中增加一下指令的得到:
ANL P1,#0FEH ;使P1.0輸出為低電平,D觸發(fā)器置位
在中斷服務(wù)程序中還要加上撤除外中斷0標(biāo)志指令,即
CLR IE0 ;清外中斷標(biāo)志,以便下次可再次中斷
可見(jiàn),電平方式外部中斷請(qǐng)求信號(hào)的撤除是通過(guò)軟、硬件相結(jié)合的方法實(shí)現(xiàn)的。
評(píng)論