找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15858|回复: 11
打印 上一主题 下一主题
收起左侧

如何让中断跳出,回到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;
}




评分

参与人数 1黑币 +5 收起 理由
zxcvbnm14725836 + 5

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 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;
}
回复

使用道具 举报

板凳
ID:130231 发表于 2017-7-24 06:35 | 只看该作者
将主函数改成下截图那样,试试。注意的是把 while(1); 中  ;   号 去掉。

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

12.PNG
回复

使用道具 举报

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

使用道具 举报

5#
ID:7485 发表于 2017-7-24 18:25 | 只看该作者
如果你的程序是在执行main程序中产生了中断,那么当中断服务程序执行完以后自然就会回到main中中断处。

如果是在其他程序执行中产生了中断,执行完中断程序后,想回到main中,就只有在退出中断程序之前改写“pc”值。这个在汇编程序中很容易做到,在RETI指令前修改PC,到main的入口再减去“RETI”本身所占1个字节就行了。但是c程序就不同了,要看反汇编程序才能确定。一旦计算有误,将不能正常运行。而且不一定会报错。  所以这个不是初学者可以随便用的方法。
回复

使用道具 举报

6#
ID:222119 发表于 2017-7-24 20:10 | 只看该作者
我感觉这个没问题啊,发生中断就进中断函数处理,处理完了直接返回while(1);了
回复

使用道具 举报

7#
ID:222125 发表于 2017-7-24 20:24 | 只看该作者
新人请问怎么获得黑币
回复

使用道具 举报

8#
ID:219864 发表于 2017-7-24 21:10 | 只看该作者
1324027712 发表于 2017-7-24 20:24
新人请问怎么获得黑币

你解决我的问题,就能获得黑币。
回复

使用道具 举报

9#
ID:397297 发表于 2018-12-26 16:23 | 只看该作者
yzwzfyz 发表于 2017-7-24 10:55
常规:中断回到什么地方,是由发生中断时的“程序运行地址”决定的,不是你想回哪里就回哪里的。
楼主的题 ...

哈哈,非常规手段好啊。
回复

使用道具 举报

10#
ID:451718 发表于 2018-12-26 17:35 | 只看该作者
从你的程序代码结构上看,你这不是程序在中断中没有出来,程序已经出来了,只是停留在了最后的while(1)这个语句上。 另外,从你开中断的语句顺序上看,你对中断可能真是没有理解透彻。 编写程序是个严谨思维,先开总开关,再开分开关。就像你回家开灯一样。你现在的情况就好比是,回家先把屋子里面照明开关打开,然后再去打开配电箱里面的总闸刀。
回复

使用道具 举报

11#
ID:192903 发表于 2019-5-1 12:00 | 只看该作者
haha,goto  somewhere ,you can have a try
回复

使用道具 举报

12#
ID:404239 发表于 2019-5-3 09:19 来自手机 | 只看该作者
实在不行,中断里面可以用return退出
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表