8051单片机中断子程序如下,延时子程序是0.2秒的,中断触发时正常,中断返回时要等几十秒的样子,求解答。

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-25
单片机里中断返回和子程序返回的区别是什么?

基本没有区别!都会在返回时恢复压栈的PC指针并继续执行程序。
中断处理程序实际上也可以看做是一个普通的子程序,只是它的调用是预先设定的地址入口,并且它的调用时由中断触发的;而子程序是我们人为地调用的。
但是中断子程序的返回有时要考虑对中断的处理(如开关中断允许、初始化数据-----比如计数器或者定时器的初始值处理等等)。

我懂了,经过我的仿真,当程序第一次进入DELAYTIME时,执行到R0=03,R0=00,R2=F0时,T0中断到了,这时中断程序调用了DELAYTIME,当执行完中断服务程序,这是R0变成了0,返回到之前的延时函数,此时R0=0,R1=0,R2=0,所以你的延时程序就变成了256*256*256=16秒了,所以成了你说的15秒后才执行完。 所以以后写中断程序注意断点的保护,把中断程序里有修改掉的寄存器先压栈保护,结束之前弹出来,这样就没事了。还有你在中断程序结束前没重新开启T0。还有在你的程序最好多点注释,这样看着不吃力。

嘿嘿 你的两个程序都有问题 怎么还能算是完美呢?
第一个程序的问题是:
在中断时,压入一个程序状态字保存 但却恢复了两个数据一个送给了程序状态字一个送给了累加器,即把主程序的断点地址取走了, 很严重的错误啊 中断程序不能正确返回主程序了
PUSH PSW
PUSH ACC ;修改后 加的指令
MOV A,B
RL A
MOV P2,A
ACALL DELAY
MOV B,A
POP PSW
POP ACC
RETI
第二个程序问题:
进入中断服务程序后 执行了CLR EA 关闭了中断 在中断返回前
没有进行开中断 即 没有执行SETB EA
问题也是挺严重的 以后系统中断源 均都不能中断了
应该改为如下:
INT: CLR EA
MOV A,#00H
MOV P2,A
ACALL DELAY
MOV A,#0FFH
MOV P2,A
SETB EA ;修改后 加的指令
RETI

呵呵 满意就选满意回答

一般中断子程序是越短越好, 更不要调用延时子程序,不然下一个中断到来时会影响。
你第二个是关中断了,所以不影响,返回在就快。
不知你这里调用延时是什么用的。

  • 已知8051单片机使用的晶振是12mhz,要求设计一段软件延时程序,延时时间...
    答:51单片机晶振12MHz软件延时1秒程序:DELAY:MOV R7,#500 D1:MOV R6,#250 D2:NOP NOPNOPNOPNOPNOPDJNZ R6,D2 DJNZ R7,D1 .以上程序为何能定时1秒? 请阅附件。
  • 用8051单片机编写一个闹钟程序,先设置时间,然后中断开始计数,如果时间...
    答:DY12MS:MOV R7,#18H;延时12MS子程序 DYMS1:MOV R6,#0FFH DYMS2:DJNZ R6,DYMS2 DJNZ R7,DYMS1 RET EINT0:PUSH ACC PUSH PSW CLR TR1 POP PSW POP ACC SETB EX0 RETI EINT1:ANL TMOD,#0FH;计数器置为方式1,定时器模式,与INT0有关 ORL TMOD,#90H MOV TH1,#3CH;装入时间常数,0.05...
  • 单片机内12微秒和20微秒延时程序,在线等,急急急
    答:_delay_us:DJNZ R7,$;RET 说明:本8051的子程序可以一定程度由调用函数定制延时时间,定时值由调用程序事先保存在R7中。本程序也可以C调用,但需要在函数所在的汇编文件中写公开声明: PUBLIC _delay_us 函数原型是:void delay_us(unsigned char T_count);如果使用的是标准8051内核,DJNZ ...
  • 8051单片机的数字钟汇编程序
    答:ORG 000BH ;定时器T0中断程序入口 LJMP TIME0 ;跳至INTTO执行 ORG 0013H ;外中断1中断程序入口 RETI ;外中断1中断返回 ORG 001BH ;定时器T1中断程序入口 LJMP TIME1 ;跳至TIME1执行 ORG 0023H ;串行中断程序入口地址 RETI ;串行中断程序返回 ;TIME1: RETI ;...
  • 8051单片机跑表问题
    答:CALL DELAY ;调显示延时 CLR TR0 ;停止中断 MAIN3:JB K4,MAIN4 CALL BEEP_BL CALL DELAY ;调显示延时 CALL M_CLR ;计时单元清零 MAIN4:CALL DISP JMP MAIN1 ;; 计时单元清零子程序 ;M_CLR:MOV R0,#Count MOV A,#00H CLR_1:MOV @R0,A ;清零 INC R...
  • 51单片机12HZ的,怎么计算延时时间?
    答:2 * 248 = 496 T DJNZ R1,F (2 + 496 + 1) * 60 = 29940T RET 2 + 29940 + 1 = 29943T 总共是: 29943T。如果是 12MHz,时间就是:29943us。另外,执行这个程序,还需要一条 CALL 指令,应该再加上 2T。--怎么样实现5S的延时?慢慢算呗。
  • 在12MHz的8051上实现DELAY个ms延时的程序,为什么子循环(见下)实现120...
    答:单片机的一i个机器周期包括了12个时钟周期, 因为你的时钟周期为12MHZ, 则单指令的执行时间为1us. 根据指令是单指令, 双指令或者三指令,以及指令执行的次数来计算.
  • 高人帮我解析下这个8051单片机程序
    答:ORL IE,#87H ;开启外部中断0,外部中断1 和 Timer0中断 SETB TR0 ;开启TIMER0 WAIT:LCALL DZSPLAY ;调用显示子程序 LJMP WAIT CLOCK: DJNZ R7,NEXT ;R7自减,不为0则跳转NEXT INC 27H ;R7减到20次 即计时一秒后27H加1 MOV R7,#14H MOV A, 27H ;27H的值载入累加器 CJNE A,#...
  • 8051单片机 用P2_7输入高低电平计数,用P1_0延时输出P2_7的高低电平...
    答:if(P1_0) for(i=0;i<100;i++){P2_7=~P2_7;//此处还可以加延时比如NOP}
  • 单片机延时子程序
    答:MCS-51单片机的一个机器周期=6个状态周期=12个时钟周期。 MCS-51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/12000000)=1μs。 程序分析 例1 50ms 延时子程序: DEL:MOV R7,#200 ① DEL1:...