cpu響應(yīng)某中斷請(qǐng)求后,在中斷返回前,應(yīng)該撤除該中斷請(qǐng)求,否則會(huì)引起另一次中斷而發(fā)生錯(cuò)誤。根據(jù)中斷方式的不同,中斷的撤除可以分為定時(shí)器/計(jì)數(shù)器中斷請(qǐng)求的撤除、外部中斷請(qǐng)求的撤除、串口中斷請(qǐng)求的撤除。
一、定時(shí)器/計(jì)數(shù)器t0/t1中斷的撤除
定時(shí)器/計(jì)數(shù)器t0/t1的外部中斷請(qǐng)求,在cpu響應(yīng)中斷后,由內(nèi)部硬件自動(dòng)清除中斷標(biāo)志tf0和tf1,ie0和ie1,無需采取其它措施。
二、外部中斷請(qǐng)求的撤除
對(duì)于電平觸發(fā)方式的外部中斷請(qǐng)求的撤除,不僅要清除中斷標(biāo)志,還需在中斷響應(yīng)后把中斷請(qǐng)求輸入端從低電平強(qiáng)制改為高電平。撤除中斷請(qǐng)求的電路方案如圖所示。
圖 電平方式外部中斷請(qǐng)求的撤消電路
上圖中,用d觸發(fā)器鎖存外部中斷請(qǐng)求低電平,通過觸發(fā)器輸出端q送int0,所以增加的d觸發(fā)器對(duì)外部中斷請(qǐng)求沒有影響。中斷響應(yīng)后,為了撤銷低電平引起的中斷請(qǐng)求,可利用d觸發(fā)器的直接置位端sd來實(shí)現(xiàn)。at89s52的一根i/o口線p1.0控制sd端。只要在sd端輸入一個(gè)負(fù)脈沖(p1.0初始狀態(tài)為1),即可使d觸發(fā)器置1,從而撤銷了低電平的中斷請(qǐng)求信號(hào),所需負(fù)脈沖可以通過在中斷服務(wù)程序中增加以下兩條指令得到:
setb p1.0 ; p1.0置1
clr p1.0 ; p1.0置0
所以,電平方式下外部中斷請(qǐng)求信號(hào)的撤除,要通過硬件和軟件的配合來解決。
三、 串行口中斷請(qǐng)求的撤除
at89s52進(jìn)入串行口中斷服務(wù)程序后常需要對(duì)它們進(jìn)行檢測,以測定串行口發(fā)生了接收中斷還是發(fā)送中斷。ti和ri是串行口中斷的標(biāo)志位(見scon),中斷系統(tǒng)不能自動(dòng)將它們撤除,為防止cpu再次響應(yīng)這類中斷,只能用軟件的方法,在中斷服務(wù)程序中用如下指令將它們撤除。
clr ti ; 撤除發(fā)送中斷
clr ri ;撤除接收中斷
若采用字節(jié)型指令,則可使用如下指令。
anl scon #0fch ; 撤除發(fā)送和接收中斷