正在学习51单片机,我用的C。最近遇到一个问题,我用两个中断进行嵌套,正确设置了IP寄存器。我想请问如何让我优先级高的中断执行完毕后直接返回主程序,而不再返回低优先级的中断。具体用什么指令,最后有实例,谢谢!
还有一个问题,我发现有个中断每次结束后过几秒又会重新执行一次然后程序结束,我把别的中断删掉后还是这样。我调了很久还是不知道问题出在哪里,后来我尝试把该中断的触发方式改为低电平触发就正常了。请问这是什么原因?
追答那你这个是外中断了,但是这也不可思议.
如果你的是下降沿触发,那么,过几秒又执行,说明过几秒后,有下降沿
如果是这种情况,即使你修改成低电平触发,一样会有上述问题,甚至比下降沿结果还糟糕,最好,你能把程序贴出来,不然没办法判断
长了发布出来,截了个图你给看看
从你贴出来的程序看,这段里看不出来什么毛病,最好能有硬件的说明,就是,你的P3.2,P3.3接的到底是什么样的信号?
还有,你为什么要在中断里自延时多达3秒和5秒的时间呢?
还有,如果你能把你程序的意图说明一下最好,我可以给你写和程序,你参考一下.
上面那图有点问题,我改乱了。。。重新发个
你这个依旧还是看不出来啊,不过,最好你的中断函数不要出现return字样,这个return关键字在C51里特别的搞笑,所以,你最好按照标准的ANSIC来写.
还是那个方法:
1 你把硬件的信号说明白
2 把你的意图说明白
return是我我后来调试的时候弄进去的,没什么效果我又删了。我在软件里面RUN步骤结果都是对的,烧到芯片里就老出问题搞不明白了,换成低电平触发又正常了,而且应该不是硬件的问题,他每次出错都很有规律,就是正常运行完后CONTROL信号还要跳变两次,中间间隔的时间还每次都一样。
追答我觉得,还是你硬件的问题,是你的P3.3口上有多次触发,你不是接了个按键吧?或者是人为的用手接导线去拉低P3.3?
如果是这样的话,那就不奇怪.因为你程序里有一个很长的delay1ms(3)的延迟.
我猜测可能是这样一个过程:
你的P3.3口上有连续多次的下降沿,可能每次间隔比较小,比如间隔5个ms,我们称之为IN1,IN2,IN3
当IN1到达的时候,进入外中断1处理函数,但是,此时,你在中断里面进行延时3秒,所以,当IN2到达的时候,不会响应IN2引发的中断,因此,IN2引发的中断被挂起,当IN1彻底执行完毕之后,退出本次中断后,IN2被挂起的中断又来了,所以又执行了3000ms....接着是IN3....
你这样修改一下,看看在下降沿情况下是不是还多次中断:
void t1(void) interrupt 2
{
EX1 = 0; //----进入中断,先把外中断1关闭,不再响应中断
delay.....
EX1 = 1; //---执行完成后,再重新打开外中断1
}
还有一个问题,我发现有个中断每次结束后过几秒又会重新执行一次然后程序结束,我把别的中断删掉后还是这样。我调了很久还是不知道问题出在哪里,后来我尝试把该中断的触发方式改为低电平触发就正常了。请问这是什么原因?
追答查查程序,好像是跑飞了。
看看中断服务程序过程中有没有改了堆栈中的数据,导致退出中断后程序跑飞了。
我没用汇编啊。。。。一般什么错误会导致程序跑飞?
追答“我发现有个中断每次结束后过几秒又会重新执行一次然后程序结束”
你这里的程序结束是什么意思?是从头执行了还是别的?
如果是从头执行了,应该就是程序跑飞了。如果不是,请说明现象。
麻烦看看是什么问题,T1中断每次都很有规律的重复一次
外部中断1外接的信号有没有抖动?
执行完中断后最好再清一下中断标志位。
中断函数内不要加延时,中断的目的就是快速(微秒级)响应,加了延时还要快速干嘛?不要学有些开发板,按键都用中断做,肯定没法防抖。
写单片机的程序要有时间的概念,知道每个外设需要用多少时间处理。
嗯嗯 确实是中断1有抖动,非常感谢您的耐心解答。
还有一个问题,我发现有个中断每次结束后过几秒又会重新执行一次然后程序结束,我把别的中断删掉后还是这样。我调了很久还是不知道问题出在哪里,后来我尝试把该中断的触发方式改为低电平触发就正常了。请问这是什么原因?
追答要么该中断口真有一个下降沿,触发了中断,要么就是干扰信号造成的,估计你的电源不好,纹波较大。
追问嗯 我检查出来了,是有抖动干扰,感谢您的耐心解答!
我设置了一个标致,确实有效果。但是我发现有个中断每次结束后过几秒又会重新执行一次,我把别的中断删掉后还是这样。我调了很久还是不知道问题出在哪里,后来我尝试把该中断的触发方式改为低电平触发就正常了。请问这是什么原因?
51单片机中可以中断嵌套么?如果可以是如何规定的?
在51单片机中,中断嵌套是指在一个中断服务程序正在执行时,如果有另一个优先级更高的中断发生,系统会暂停当前中断的处理,转而响应更高优先级的中断,待其处理完后再返回继续处理之前的中断。这种机制使得单片机能够灵活应对多种中断事件,确保重要任务得到及时响应。51单片机支持多个中断源,如定时器中断...
C语言51单片机中断嵌套问题
对于ARM系列的可以,对于51来说,是不行的,因为51软件指令不允许修改PC寄存器的值
51单片机中断嵌套的问题
1.T0返回中断,会返回到T1(TO中断前如果T1没执行完的话)!2.如果你的程序最后一行是LJMP $的话,就算返回到这里也没有问题,中断只要开启了照常可以相应!JLMP $的意义通常就是等待中断的产生!如果你不想中断后一直等待,那就不用这条指令不就行了!记得加分!
51单片机(c语言)中断嵌套的困惑
“只要堆栈空间足够,中断嵌套的层数一般没有限制”。这话应该是对的。虽然只有两级优先级。但是,同一优先级的不同中断的优先性不同。具体的是:外部中断0、T0、外部中断1、T1、串行中断。五级依次递减。(在同一优先级)如果正在执行T1中断,这时来了个T0中断,那么可以被打断,执行T0中断服务程序时又...
51单片机中断怎样嵌套?
51单片机总共支持5个中断源,分别为外部中断0,定时器0,外部中断1,定时器,串行中断 这5个中断源都可以独立申请中断 当需要同时进行两个中断时,即可自动通过中断嵌套的方式来进行 比如说,当需要用外部中断0来启动和停止定时器计数 由于外部中断0的优先级比定时器0的优先级高 所以当定时器正在计数时...
51单片机中断嵌套问题
描述的比较混乱。如果是在外部中断中循环,然后判断标志位变化后,结束外部中断。那么就必须把T1的中断级别高于外部中断,否则外部中断执行时,不会相同同级或低级的T1中断,自然置不了标志位。
简述8051中断嵌套原则
1 可以将51单片机的中断源分为2类 一种为高级中断 一种为低级中断 2 中断嵌套原则:一个低级中断源的中断服务程序可以被另一个高级中断源的中断所中断,反之不能。3 中断嵌套:就是一个中断源的中断服务程序被另高级一个中断源的中断服务程序所中断,当高级中断服务程序执行完后,返回...
51单片机,如果中断函数比较长,执行到一半又触发了这个中断,程序会停 ...
则该中断函数就会被重新从头开始执行(中断嵌套)。这是因为除串口中断以外的其他中断,在 CPU 响应该中断,程序转入该中断函数前就已经将该中断的中断标志清零了。另外,51的串口中断比较特别,因为需要软件清除串口中断标志,所以只要在未清串口中断标志前,是不会发生上述这样的中断嵌套的。
MCS-51单片机在什么情况才能进行中断嵌套?如何设置
MCS-51单片机 中断, 在低优先级进入中断服务程序时,有高优先级的中断请求 就会进入该中断服务程序的,这就是中断嵌套,就是对时间要求高的 或者 需要及时处理的中断,设置成高优先级就可以了。
51单片机嵌套中断 最好有例子
EA=1;\/\/打开总中断开关 ET0=1;\/\/打开定时器0的开关 TR0=1;启动定时器,从此以后,50mS一到,定时器就让CPU执行下面的语句(这是CPU可能在干别的是,可能什么也没干)if(i==20)\/\/定时为20*50=1000MS=1S {...} } ...void time() interrupt 1\/\/中断函数 { TL0=(65536-50000)%256;...