我想到一個問題:就是CPU有響應一個中斷后我不用RETI返回.用下面的:
MOV R0,SP
MOV DPH,@R0
DEC SP
MOV R0,SP
MOV DPL,@R0
DEC SP
CLR A
JMP @A+DPTR
這一斷替代RETI.是可以返回到程序的中斷處繼續運行,但卻不再響應下一次的中斷了,TFx為1沒有一點的反應.不轉向中斷入口.
請問,這樣我要如何來處理????
51中斷的問題:謝謝先!51中斷的問題:謝謝先!大家看看!!大家看看!!
全部回復(12)
正序查看
倒序查看
如下面這個程序,響應EXT1后,我不要在繼續EXT0,直接回主程序,但T0卻再也不會中斷入口了!!
ORG 0000H
LJMP START
ORG 0003H ;外中斷0:0003H
SETB F0
JMP EXT0
ORG 000BH ;定時器0:000BH
;jmp TIM0
ORG 0013H ;外中斷1:0013H
JMP EXT1
ORG 001BH ;定時器1:001BH
;jmp TIM1
ORG 0023H ;串 口 :0023H
START:
MOV SP,#70H ;SP指針指向70H
MOV IE,#10001111B ;EA置1,開所有中斷.
MOV IP,#00000100B ;08H,T1高優先.
SETB P1.0
NOP
NOP
NOP
SJMP $
EXT0:
CPL P1.0
NOP
NOP
NOP
NOP
RETI
EXT1: CPL P1.1
JNB F0,EXT1_1
POP 7CH
POP 7DH
CLR F0
EXT1_1 : RETI
END
ORG 0000H
LJMP START
ORG 0003H ;外中斷0:0003H
SETB F0
JMP EXT0
ORG 000BH ;定時器0:000BH
;jmp TIM0
ORG 0013H ;外中斷1:0013H
JMP EXT1
ORG 001BH ;定時器1:001BH
;jmp TIM1
ORG 0023H ;串 口 :0023H
START:
MOV SP,#70H ;SP指針指向70H
MOV IE,#10001111B ;EA置1,開所有中斷.
MOV IP,#00000100B ;08H,T1高優先.
SETB P1.0
NOP
NOP
NOP
SJMP $
EXT0:
CPL P1.0
NOP
NOP
NOP
NOP
RETI
EXT1: CPL P1.1
JNB F0,EXT1_1
POP 7CH
POP 7DH
CLR F0
EXT1_1 : RETI
END
0
回復
@xsw810810
如下面這個程序,響應EXT1后,我不要在繼續EXT0,直接回主程序,但T0卻再也不會中斷入口了!! ORG0000H LJMPSTART ORG0003H ;外中斷0:0003H SETBF0 JMPEXT0 ORG000BH ;定時器0:000BH ;jmpTIM0 ORG0013H ;外中斷1:0013H JMPEXT1 ORG001BH ;定時器1:001BH ;jmpTIM1 ORG0023H ;串 口:0023H START: MOVSP,#70H ;SP指針指向70H MOVIE,#10001111B ;EA置1,開所有中斷. MOVIP,#00000100B ;08H,T1高優先. SETBP1.0 NOP NOP NOP SJMP$ EXT0: CPLP1.0 NOP NOP NOP NOP RETI EXT1: CPLP1.1 JNBF0,EXT1_1 POP7CH POP7DH CLRF0EXT1_1:RETI END
我想是不是你的那段代碼并不能完全代替RETI的功能,中斷的某些硬件標志未被清除?
0
回復
@xsw810810
如下面這個程序,響應EXT1后,我不要在繼續EXT0,直接回主程序,但T0卻再也不會中斷入口了!! ORG0000H LJMPSTART ORG0003H ;外中斷0:0003H SETBF0 JMPEXT0 ORG000BH ;定時器0:000BH ;jmpTIM0 ORG0013H ;外中斷1:0013H JMPEXT1 ORG001BH ;定時器1:001BH ;jmpTIM1 ORG0023H ;串 口:0023H START: MOVSP,#70H ;SP指針指向70H MOVIE,#10001111B ;EA置1,開所有中斷. MOVIP,#00000100B ;08H,T1高優先. SETBP1.0 NOP NOP NOP SJMP$ EXT0: CPLP1.0 NOP NOP NOP NOP RETI EXT1: CPLP1.1 JNBF0,EXT1_1 POP7CH POP7DH CLRF0EXT1_1:RETI END
各位大哥51我也不太懂誰愿意教我請發郵件:yongshengdianzi@126.com
0
回復
@maychang
RETI指令與RET指令不一樣.RET指令僅僅是將堆棧中的返回地址彈出到程序計數器和修改棧針.RETI指令除了完成RET指令的工作外,還要清中斷掛號寄存器,使得再次發生中斷請求時可以響應請求,執行中斷程序.你的這段程序不能清中斷掛號寄存器(事實上51單片機也沒有訪問中斷掛號寄存器的指令).
您看看這個程序:
ORG 0000H
LJMP START
ORG 0003H ;外中斷0:0003H
JMP EXT0
ORG 000BH ;定時器0:000BH
;jmp TIM0
ORG 0013H ;外中斷1:0013H
JMP EXT1
ORG 001BH ;定時器1:001BH
;jmp TIM1
ORG 0023H ;串 口 :0023H
START:
MOV SP,#70H ;SP指針指向70H
SETB EA
SETB EX0 ;開外中斷0
MOV IP,#00000100B ;08H,T1高優先.
SETB P1.0
SJMP $
EXT0:
CLR EX0 ;關外中斷0
SETB EX1 ;開外中斷1
CPL P1.0
MOV R7,#100
D1: MOV R6,#20
D2: MOV R5,#248
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
jmp ext0
EXT1:
CLR EX1 ;關外中斷1
CLR IE0
POP 7CH
POP 7DH
SETB EX0 ;開外中斷0
RETI
END
START開INT 0中斷.也就是說INT0是起動鍵.INT1是暫停鍵,返回SJMP $處一直循環.等待INT0再觸發!
這是我在一本書上看到的,但就是仿不了.第一次INT0是可以起動.但暫停之后再INT0沒有一點反應了.是不是程序有什么問題.還望說說!!!
ORG 0000H
LJMP START
ORG 0003H ;外中斷0:0003H
JMP EXT0
ORG 000BH ;定時器0:000BH
;jmp TIM0
ORG 0013H ;外中斷1:0013H
JMP EXT1
ORG 001BH ;定時器1:001BH
;jmp TIM1
ORG 0023H ;串 口 :0023H
START:
MOV SP,#70H ;SP指針指向70H
SETB EA
SETB EX0 ;開外中斷0
MOV IP,#00000100B ;08H,T1高優先.
SETB P1.0
SJMP $
EXT0:
CLR EX0 ;關外中斷0
SETB EX1 ;開外中斷1
CPL P1.0
MOV R7,#100
D1: MOV R6,#20
D2: MOV R5,#248
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
jmp ext0
EXT1:
CLR EX1 ;關外中斷1
CLR IE0
POP 7CH
POP 7DH
SETB EX0 ;開外中斷0
RETI
END
START開INT 0中斷.也就是說INT0是起動鍵.INT1是暫停鍵,返回SJMP $處一直循環.等待INT0再觸發!
這是我在一本書上看到的,但就是仿不了.第一次INT0是可以起動.但暫停之后再INT0沒有一點反應了.是不是程序有什么問題.還望說說!!!
0
回復
@xsw810810
您看看這個程序: ORG0000H LJMPSTART ORG0003H ;外中斷0:0003H JMPEXT0 ORG000BH ;定時器0:000BH ;jmpTIM0 ORG0013H ;外中斷1:0013H JMPEXT1 ORG001BH ;定時器1:001BH ;jmpTIM1 ORG0023H ;串 口:0023H START: MOVSP,#70H ;SP指針指向70H SETBEA SETBEX0 ;開外中斷0 MOVIP,#00000100B ;08H,T1高優先. SETBP1.0 SJMP$ EXT0: CLREX0 ;關外中斷0 SETBEX1 ;開外中斷1 CPLP1.0 MOVR7,#100D1: MOVR6,#20D2: MOVR5,#248 DJNZR5,$ DJNZR6,D2 DJNZR7,D1 jmpext0 EXT1: CLREX1 ;關外中斷1 CLRIE0 POP7CH POP7DH SETBEX0 ;開外中斷0 RETI END START開INT0中斷.也就是說INT0是起動鍵.INT1是暫停鍵,返回SJMP$處一直循環.等待INT0再觸發!這是我在一本書上看到的,但就是仿不了.第一次INT0是可以起動.但暫停之后再INT0沒有一點反應了.是不是程序有什么問題.還望說說!!!
高人指點一二啊!!!
0
回復
@xsw810810
您看看這個程序: ORG0000H LJMPSTART ORG0003H ;外中斷0:0003H JMPEXT0 ORG000BH ;定時器0:000BH ;jmpTIM0 ORG0013H ;外中斷1:0013H JMPEXT1 ORG001BH ;定時器1:001BH ;jmpTIM1 ORG0023H ;串 口:0023H START: MOVSP,#70H ;SP指針指向70H SETBEA SETBEX0 ;開外中斷0 MOVIP,#00000100B ;08H,T1高優先. SETBP1.0 SJMP$ EXT0: CLREX0 ;關外中斷0 SETBEX1 ;開外中斷1 CPLP1.0 MOVR7,#100D1: MOVR6,#20D2: MOVR5,#248 DJNZR5,$ DJNZR6,D2 DJNZR7,D1 jmpext0 EXT1: CLREX1 ;關外中斷1 CLRIE0 POP7CH POP7DH SETBEX0 ;開外中斷0 RETI END START開INT0中斷.也就是說INT0是起動鍵.INT1是暫停鍵,返回SJMP$處一直循環.等待INT0再觸發!這是我在一本書上看到的,但就是仿不了.第一次INT0是可以起動.但暫停之后再INT0沒有一點反應了.是不是程序有什么問題.還望說說!!!
這個程序顯然不能執行到外中斷1.
外中斷0未退出,而外中斷0和外中斷1同一優先級,外中斷0不退出外中斷1是不會得到響應的.
外中斷0未退出,而外中斷0和外中斷1同一優先級,外中斷0不退出外中斷1是不會得到響應的.
0
回復