我想到一个问题:就是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
回复
提示