51單片機有兩個外部中斷申請輸入端:INT0 和 INT1。
51單片機的外部中斷,分為低電平觸發(fā)和下降沿觸發(fā)。在單片機內(nèi)部,分別由控制位 IT0 和 IT1 來控制。
復位時,IT0/1 都為 0,即默認為低電平觸發(fā)。
一般來說,外設第一次向單片機申請外部中斷時,單片機使用那種觸發(fā)方式,并無什么差別。
但是,返回主程序后,如果外部申請信號仍然是低電平,就有區(qū)別了。
在采用低電平觸發(fā)時,單片機執(zhí)行了一條主程序的指令后,就會又重新進入中斷程序。
而采用下降沿觸發(fā)時,即使 INT0/1 引腳仍然是低電平,單片機也不會重新進入中斷程序。
如果外設想要申請第二次中斷,必須是先恢復高電平,重新再送來一次下降沿才行。
那么,為了避免僅僅來了一次申請,就產(chǎn)生多次中斷的現(xiàn)象,還是應該采用下降沿觸發(fā)中斷的方式。
如果非要使用低電平觸發(fā)呢,那必須在退出前,反復的檢測中斷輸入端的電平。
只有當外設撤消了中斷申請之后,再退出中斷程序,這才能避免多次的重新中斷。
到底應該采用那種觸發(fā)方式,這個確實是應該根據(jù)外設的特點來選取。
但是在多數(shù)場合,采用下降沿觸發(fā)方式,還是比較適用的。
即在復位后,應該先執(zhí)行:
SETB IT0
SETB IT1
有人在百度知道,提出了一個問題,希望能顯示出低電平觸發(fā)和下降沿觸發(fā)的區(qū)別。
題目的基本內(nèi)容如下。
;單片機匯編程序題:要求一定是匯編
;AT89C51中P3.2接開關1,P3.3接開關2。
;當開關1, 2全都斷開時運行主程序,P1口的8個LED從P1.0~P1.7逐個點亮并反復循環(huán)。
;當開關1閉合時進入中斷服務程序P2口的8個LED閃爍6次。
;開關2起到對開關1觸發(fā)方式進行選擇的作用:
;第一次閉合開關2時開關1為下降沿觸發(fā)且P0.0連接的LED點亮;
;第二次閉合開關2時開關1為低電平觸發(fā)且P0.0連接的LED熄滅。
;求一個用匯編語言編寫的完整程序。
根據(jù)上述題目要求,做而論道畫出了PROTEUS仿真實驗電路如下:
;下列程序,可以滿足要求。
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP X0_INT
ORG 0013H
LJMP X1_INT
;------------------------------------
MAIN:
SETB IT1
MOV SP, #60H
MOV IE, #85H
MOV A, #254
M_LOOP:
MOV P1, A
RL A
CALL DL_500MS
SJMP M_LOOP
;------------------------------------
X0_INT:
PUSH PSW
SETB RS1
MOV R4, #12
SH_6:
XRL P2, #255
CALL DL_500MS
DJNZ R4, SH_6
POP PSW
RETI
;------------------------------------
X1_INT:
CPL IT0
CPL P0.0
RETI
;-------------------------------延時子程序
DL_500MS:
MOV R5, #9 ;1T
DL1: MOV R6, #128 ;1T
DL2: MOV R7, #215 ;1T
NOP ;1T
DL3: DJNZ R7, DL3 ;2T 2 * 215 = 430 T
DJNZ R6, DL2 ;2T [1+1+430+2] * 128 = 55552 T
DJNZ R5, DL1 ;2T [1+55552+2] * 9 = 499995 T
RET ;2T 1 + 499995 + 2 = 499998 T
;------------------------------------
END
;===============================================