• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

51中断的问题:谢谢先!51中断的问题:谢谢先!大家看看!!大家看看!!

我想到一个问题:就是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没有一点的反应.不转向中断入口.

请问,这样我要如何来处理????
全部回复(12)
正序查看
倒序查看
xsw810810
LV.4
2
2007-06-21 17: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
0
回复
whatcall
LV.5
3
2007-06-21 19:00
@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
回复
maychang
LV.6
4
2007-06-22 00:22
RETI指令与RET指令不一样.RET指令仅仅是将堆栈中的返回地址弹出到程序计数器和修改栈针.RETI指令除了完成RET指令的工作外,还要清中断挂号寄存器,使得再次发生中断请求时可以响应请求,执行中断程序.你的这段程序不能清中断挂号寄存器(事实上51单片机也没有访问中断挂号寄存器的指令).
0
回复
110919645
LV.2
5
2007-06-22 06:03
@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
回复
xsw810810
LV.4
6
2007-06-22 09:46
@maychang
RETI指令与RET指令不一样.RET指令仅仅是将堆栈中的返回地址弹出到程序计数器和修改栈针.RETI指令除了完成RET指令的工作外,还要清中断挂号寄存器,使得再次发生中断请求时可以响应请求,执行中断程序.你的这段程序不能清中断挂号寄存器(事实上51单片机也没有访问中断挂号寄存器的指令).
maychang  
你好!那就是说中断之后我一定要RETI返回.不然下次就不会再发生中断了是不是???
0
回复
xsw810810
LV.4
7
2007-06-22 14:02
@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没有一点反应了.是不是程序有什么问题.还望说说!!!
0
回复
maychang
LV.6
8
2007-06-24 12:04
@xsw810810
maychang  你好!那就是说中断之后我一定要RETI返回.不然下次就不会再发生中断了是不是???
就是.中断之后一定要RETI返回.不然下次中断无法执行.
0
回复
xsw810810
LV.4
9
2007-07-31 09:30
@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
回复
maychang
LV.6
10
2007-08-06 02:58
@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
回复
xsw810810
LV.4
11
2007-08-09 14:49
@maychang
这个程序显然不能执行到外中断1.外中断0未退出,而外中断0和外中断1同一优先级,外中断0不退出外中断1是不会得到响应的.
谢谢了啊1!!!
0
回复
tang7273
LV.1
12
2007-08-11 19:46
@xsw810810
高人指点一二啊!!!
如果你的功底不好的话,建议你使用C语言写程序比较的好,关键就是快啊,一开始上手用汇编可能搞搞就没有信心了,怎么搞都搞不定啊!
0
回复
110919645
LV.2
13
2007-12-20 19:26
@xsw810810
高人指点一二啊!!!
123
0
回复