51单片机,有关中断问题,为什么进入不了第二个中断,而是一直执行第一个有房 第二个中断的程序而已

51单片机中断返回跑飞了,怎么回事?
51单片机中断返回有问题。返回到程序开始的地方。数据全部再次初始化. 怎么回事??ORG  00000H     LJMP  star org  000BH                       ljmp  INIT0star:     .........INIT0:      PUSH ACC  ;现场保护      PUSH PSW      CLR EA      djnz  yanchi,com3            ;yanchi      mov yanchi,#50h      djnz moden,com3      mov moden,#03h    COM3:      MOV TL0,#3cH  ;重新装如初值      MOV TH0,#0b0H
     SETB EA      SETB ET0      SETB TR0   ;启动定时器0      POP PSW      POP ACC      RETI         ;中断返回
09-02-09 &
有可能没有正确的返回,你最好加看门狗电路,或者单片机带看门狗的,最好的保护还是硬件看门狗。
请登录后再发表评论!
中断保护现场,是为了你中断子程序执行完以后能够返回到你程序中中断点,即产生中断的地方,使程序能够继续向下执行!!!! 如过你说的不用保护现场的话,那么程序执行完以后就不能够回到现场,那么你的程序将不知道要跳转到那里去了,也就是飞鸟,呵呵…… 你说的中断嵌套,也是一样的,两者都要保护现场,不然你也不能够回到现场,程序也会飞的!!!! 而我们保护现场的数据都是放在堆栈中的,因此,你的中断次数也不能够超过堆栈的级数,那样数据也会丢失!!!! 说白了,中断它不同于子程序,子程序是固定好了的,返回的位置也固定了;而中断我们不能够预知它在那里发生中断,因此要保护现场,使中断子程序执行完后返回到中断的地方!!! 呵呵……说的太多了!!! 我知道你说的意思了,但是你要知道,中断现场保护是在中断子程序中进行的,因此当你高一级的中断发生的时候(他们不可能共用一个中断子程序,如果是同一中断,那也不可能,因为51中断中你进入中断子程序后要将禁止该中断再次中断,好象似的,嘿嘿……你可以试试),在高一级的中断子程序中也有现场保护,你的问题就是没有把现场保护放对地方!!!!!============================================================它们是把现场保护在同一堆栈中,我跟你打个比方吧,假如说堆栈的地址是80H,低一级的中断要保护的是1,2,3;高一级要保护的现场是4,5,6,那么在低一级的中断发生的时候,现场保护1,2,3将压如堆栈,(顺序书上应该有,这里是个比喻),那我先压入1,堆栈地址加1,压入2,堆栈地址再加1,如果这个时候高一级的中断发生,那么现在就应该跳到高一级中断的子程序,堆栈地址就是82H了,在将4,5,6分别压入堆栈,这样堆栈的地址就是85H,当高一级的中断子程序结束后,返回现场,堆栈的数据要从85H开始弹出,这样现场返回的就是6,5,4,这个时候程序就会跳到中断之前的地方,即底一级的中断那里,将要继续将3保护到堆栈中,在执行低一级的中断子程序.(其中,你要在中断保护现场完了后将中断标志清0啊,不然它始终会中断的,不可能去执行程序去了...)这样讲解你应该知道它们的过程了吧,呵呵!!!!!!
请登录后再发表评论!
会不会是其它原因 比如说复位芯片的问题不要只盯着程序看
请登录后再发表评论!您的举报已经提交成功,我们将尽快处理,谢谢!
下载我的共享资料“单片机高级教程:应用与设计.pdf”阅读。答案:C;E;A;C(初值计算公式m=2^16-(6x10^6x2x10^-3)/12);D
很明显是程序问题,找一个一定对的程序分析一下……
大家还关注
(window.slotbydup=window.slotbydup || []).push({
id: '2081942',
container: s,
size: '1000,60',
display: 'inlay-fix'51单片机外部中断子程序为什么会执行两次呢(我只触发一次) 下面是我的程序代码_百度知道
51单片机外部中断子程序为什么会执行两次呢(我只触发一次) 下面是我的程序代码
为什么中断子程序会执行两次呢;/x&delay(500);sbit beep = P2^3;return 0.2口(接触一下就离开) 然后蜂鸣器响了十次;蜂鸣器端口void delay(unsigned int);for(x=z;}一开始 我用杜邦线一端连在单片机的GND口 另一端触发一次P3;delay(500);0;0;beep = 1;IT1 = 1;y&}EX1 = 1#include &a++){beep = 0;for(a=0;}void delay(unsigned int z){5;y--);x--)for(y=110;a&unsigned char main(){EA = 1;i++;EX1 = 0;}void inter1() interrupt 2{&#47,y;while(1);EX1 = 1;unsigned int i=0.h&reg52
提问者采纳
现在来分析一下为什么你的程序会执行两次中断,下面简称为IEx)就会置1,但这两个事件优先级相同,单片机将等待外部中断程序执行完(你可以理解为有两个中断事件,外部中断引脚再次接受到一个下降沿,因此在第二次执行中断程序前已不存在下降沿。不明白可以翻查相关单片机外部中断相关资料。当单片机外部中断引脚第一次接收到一个下降沿时,IEx被置1,当进入中断程序后IEx由硬件归零,随即IEx被硬件清零,马上又再次进入中断,但此时由于上一个中断程序未执行完,单片机检测到IEx又是1。因为你的接触时间远远小于你的中断程序执行时间,所有按顺序响应),因此IEx一直为1。也就是说单片机当检测到IEx为1的时候就会进入到外部中断程序。说了那么多希望你能明白吧,你的接触仍然会产生很多下降沿.2口存在抖动(你感觉不到),进入中断程序。在这个过程中,单片机又要响应中断,这样执行完第二次中断程序后就不会再次进入中断了。然而由于你用杜邦线接触P3,当有一个下降沿到来时外部中断请求标志IE0或IE1(外部中断0或外部中断1请求中断标志,但因为IEx只有响应了中断事件后才会清零,IEx就被清零了。当第一次的中断程序执行结束后,所以进入第二次中断程序后你的外部中断应该是属于下降沿触发,IEx又被置1
提问者评价
其他类似问题
beep = 0;delay(500),它不响;delay(500)一次中断、下降的边沿时刻。楼主的程序;电压低电平,人,就听出来断续的声音;变化的时间间隔,单片机常用的都是《无源》的蜂鸣器,电压变化的很快,蜂鸣器响了十次;beep = 1。电压高电平,它不响,将听到连续的长声。如果,它只是在电压变化的时候响,它才响一声,长达几百毫秒?一般,这不是很正常吗,循环五次;只是在电压上升
为您推荐:
其他1条回答
第二次再进,会触发多次中断,不过你只收到并处理了两次。按键抖动,第一次进中断后,其实是很多次的先去找找按键处理的文章,所以只有两次,也不要长时间的禁止中断,不应该在中断处理中延时,延时期间可以多收一个中断。一般来说,按键已经放开,搞清楚按键去抖
51单片机的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 单片机中断执行过程 的文章

 

随机推荐