标题: 如何让中断跳出,回到void main()主程序中 [打印本页]

作者: bogeys    时间: 2017-7-24 00:13
标题: 如何让中断跳出,回到void main()主程序中
本帖最后由 bogeys 于 2017-7-24 00:19 编辑

程序开始,led1 闪烁4下,进入中断,等待高电平触发 P3.2 。

如果 P3.2 被一个持续长时高电平触发,led2 闪烁4下。当 P3.2 为低电平时,这时我想回到void main()主程序中,程序重新开始。

实际情况:程序一直在中断内并不跳回主程序,而且可以响应按键高电平触发,led2 闪烁。

我想回到void main()主程序中,程序重新开始。

如何编写?希望大神不吝赐教! 谢谢。

下面是程序:

#include "reg52.h"
unsigned char a;
typedef unsigned int u16;
typedef unsigned char u8;
sbit led1=P0^0;
sbit led2=P1^0;
void delay(u16 i)

{
        while(i--);        
}

void Int0Init()
{
        IT0=1;//跳变沿出发方式(下降沿)
        EX0=1;//打开INT0的中断允许。
        EA=1;//打开总中断                 
}

void main()
{
    led2=0;
    led1=0;            
        for(a=0;a<4;a++)
        {
                led1=1;        
                delay(60000);
                led1=0;
                delay(60000);                                                
                }                        
        Int0Init();  //        设置外部中断0
        while(1);        
}

void Int0()        interrupt 0        
{
   if(P3^2==1)        
   {                        
                for(a=0;a<4;a++)
        {
                led2=1;        
                delay(60000);
                led2=0;
                delay(60000);                                                
                }                                                        
        }
   else
   return;
}





作者: wulin    时间: 2017-7-24 06:33
你的程序main()初始化后进入死循环while(1); 因为while(1)内没有具体内容可执行,在没有发生中断时程序永远停留在while(1);等待中断。当中断发生时执行中断程序,完成后回到while(1);继续等待中断,只是你感觉不到。如果你想看到中断完成后返回主程序,可以改成这样:
#include "reg52.h"
unsigned char a;
typedef unsigned int u16;
typedef unsigned char u8;
sbit led1=P0^0;
sbit led2=P1^0;
bit b=0;

void delay(u16 i)
{
        while(i--);        
}

void Int0Init()
{
        IT0=1;//跳变沿出发方式(下降沿)
        EX0=1;//打开INT0的中断允许。
        EA=1;//打开总中断                 
}

void main()
{
        led2=0;
        led1=0;
        for(a=0;a<4;a++)
        {
                led1=1;
                delay(60000);
                led1=0;
                delay(60000);
        }
        Int0Init();  //设置外部中断0
        while(1)//;
        {
                if(b==1)
                {
                        EA=0;//关闭总中断
                        b=0;
                        for(a=0;a<4;a++)
                        {
                                led2=1;
                                delay(60000);
                                led2=0;
                                delay(60000);
                        }
                        EA=1;//打开总中断
                }
        }
}

void Int0() interrupt 0
{
        b=1;
}

作者: zqy181818    时间: 2017-7-24 06:35
将主函数改成下截图那样,试试。注意的是把 while(1); 中  ;   号 去掉。

12.PNG (5.92 KB, 下载次数: 102)

12.PNG

作者: yzwzfyz    时间: 2017-7-24 10:55
常规:中断回到什么地方,是由发生中断时的“程序运行地址”决定的,不是你想回哪里就回哪里的。
楼主的题目是个概念性的错误。但如果必须达成,也有办法,只是要用非常规手段。鉴于楼主概念尚不明,教你非常规手段,害大于利,故不作说明。

作者: ahshmj    时间: 2017-7-24 18:25
如果你的程序是在执行main程序中产生了中断,那么当中断服务程序执行完以后自然就会回到main中中断处。

如果是在其他程序执行中产生了中断,执行完中断程序后,想回到main中,就只有在退出中断程序之前改写“pc”值。这个在汇编程序中很容易做到,在RETI指令前修改PC,到main的入口再减去“RETI”本身所占1个字节就行了。但是c程序就不同了,要看反汇编程序才能确定。一旦计算有误,将不能正常运行。而且不一定会报错。  所以这个不是初学者可以随便用的方法。
作者: 1209476296    时间: 2017-7-24 20:10
我感觉这个没问题啊,发生中断就进中断函数处理,处理完了直接返回while(1);了
作者: 1324027712    时间: 2017-7-24 20:24
新人请问怎么获得黑币
作者: bogeys    时间: 2017-7-24 21:10
1324027712 发表于 2017-7-24 20:24
新人请问怎么获得黑币

你解决我的问题,就能获得黑币。
作者: 春花你大爷    时间: 2018-12-26 16:23
yzwzfyz 发表于 2017-7-24 10:55
常规:中断回到什么地方,是由发生中断时的“程序运行地址”决定的,不是你想回哪里就回哪里的。
楼主的题 ...

哈哈,非常规手段好啊。

作者: robinsonlin    时间: 2018-12-26 17:35
从你的程序代码结构上看,你这不是程序在中断中没有出来,程序已经出来了,只是停留在了最后的while(1)这个语句上。 另外,从你开中断的语句顺序上看,你对中断可能真是没有理解透彻。 编写程序是个严谨思维,先开总开关,再开分开关。就像你回家开灯一样。你现在的情况就好比是,回家先把屋子里面照明开关打开,然后再去打开配电箱里面的总闸刀。
作者: kaisonchen    时间: 2019-5-1 12:00
haha,goto  somewhere ,you can have a try
作者: 13425472500    时间: 2019-5-3 09:19
实在不行,中断里面可以用return退出




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1