找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 17559|回復(fù): 11
收起左側(cè)

如何讓中斷跳出,回到void main()主程序中

  [復(fù)制鏈接]
ID:219864 發(fā)表于 2017-7-24 00:13 | 顯示全部樓層 |閱讀模式
本帖最后由 bogeys 于 2017-7-24 00:19 編輯

程序開(kāi)始,led1 閃爍4下,進(jìn)入中斷,等待高電平觸發(fā) P3.2 。

如果 P3.2 被一個(gè)持續(xù)長(zhǎng)時(shí)高電平觸發(fā),led2 閃爍4下。當(dāng) P3.2 為低電平時(shí),這時(shí)我想回到void main()主程序中,程序重新開(kāi)始。

實(shí)際情況:程序一直在中斷內(nèi)并不跳回主程序,而且可以響應(yīng)按鍵高電平觸發(fā),led2 閃爍。

我想回到void main()主程序中,程序重新開(kāi)始。

如何編寫(xiě)?希望大神不吝賜教! 謝謝。

下面是程序:

#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;//跳變沿出發(fā)方式(下降沿)
        EX0=1;//打開(kāi)INT0的中斷允許。
        EA=1;//打開(kāi)總中斷                 
}

void main()
{
    led2=0;
    led1=0;            
        for(a=0;a<4;a++)
        {
                led1=1;        
                delay(60000);
                led1=0;
                delay(60000);                                                
                }                        
        Int0Init();  //        設(shè)置外部中斷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;
}




評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
zxcvbnm14725836 + 5

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:404239 發(fā)表于 2019-5-3 09:19 來(lái)自觸屏版 | 顯示全部樓層
實(shí)在不行,中斷里面可以用return退出
回復(fù)

使用道具 舉報(bào)

ID:192903 發(fā)表于 2019-5-1 12:00 | 顯示全部樓層
haha,goto  somewhere ,you can have a try
回復(fù)

使用道具 舉報(bào)

ID:451718 發(fā)表于 2018-12-26 17:35 | 顯示全部樓層
從你的程序代碼結(jié)構(gòu)上看,你這不是程序在中斷中沒(méi)有出來(lái),程序已經(jīng)出來(lái)了,只是停留在了最后的while(1)這個(gè)語(yǔ)句上。 另外,從你開(kāi)中斷的語(yǔ)句順序上看,你對(duì)中斷可能真是沒(méi)有理解透徹。 編寫(xiě)程序是個(gè)嚴(yán)謹(jǐn)思維,先開(kāi)總開(kāi)關(guān),再開(kāi)分開(kāi)關(guān)。就像你回家開(kāi)燈一樣。你現(xiàn)在的情況就好比是,回家先把屋子里面照明開(kāi)關(guān)打開(kāi),然后再去打開(kāi)配電箱里面的總閘刀。
回復(fù)

使用道具 舉報(bào)

ID:397297 發(fā)表于 2018-12-26 16:23 | 顯示全部樓層
yzwzfyz 發(fā)表于 2017-7-24 10:55
常規(guī):中斷回到什么地方,是由發(fā)生中斷時(shí)的“程序運(yùn)行地址”決定的,不是你想回哪里就回哪里的。
樓主的題 ...

哈哈,非常規(guī)手段好啊。
回復(fù)

使用道具 舉報(bào)

ID:219864 發(fā)表于 2017-7-24 21:10 | 顯示全部樓層
1324027712 發(fā)表于 2017-7-24 20:24
新人請(qǐng)問(wèn)怎么獲得黑幣

你解決我的問(wèn)題,就能獲得黑幣。
回復(fù)

使用道具 舉報(bào)

ID:222125 發(fā)表于 2017-7-24 20:24 | 顯示全部樓層
新人請(qǐng)問(wèn)怎么獲得黑幣
回復(fù)

使用道具 舉報(bào)

ID:222119 發(fā)表于 2017-7-24 20:10 | 顯示全部樓層
我感覺(jué)這個(gè)沒(méi)問(wèn)題啊,發(fā)生中斷就進(jìn)中斷函數(shù)處理,處理完了直接返回while(1);了
回復(fù)

使用道具 舉報(bào)

ID:7485 發(fā)表于 2017-7-24 18:25 | 顯示全部樓層
如果你的程序是在執(zhí)行main程序中產(chǎn)生了中斷,那么當(dāng)中斷服務(wù)程序執(zhí)行完以后自然就會(huì)回到main中中斷處。

如果是在其他程序執(zhí)行中產(chǎn)生了中斷,執(zhí)行完中斷程序后,想回到main中,就只有在退出中斷程序之前改寫(xiě)“pc”值。這個(gè)在匯編程序中很容易做到,在RETI指令前修改PC,到main的入口再減去“RETI”本身所占1個(gè)字節(jié)就行了。但是c程序就不同了,要看反匯編程序才能確定。一旦計(jì)算有誤,將不能正常運(yùn)行。而且不一定會(huì)報(bào)錯(cuò)。  所以這個(gè)不是初學(xué)者可以隨便用的方法。
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2017-7-24 10:55 | 顯示全部樓層
常規(guī):中斷回到什么地方,是由發(fā)生中斷時(shí)的“程序運(yùn)行地址”決定的,不是你想回哪里就回哪里的。
樓主的題目是個(gè)概念性的錯(cuò)誤。但如果必須達(dá)成,也有辦法,只是要用非常規(guī)手段。鑒于樓主概念尚不明,教你非常規(guī)手段,害大于利,故不作說(shuō)明。
回復(fù)

使用道具 舉報(bào)

ID:130231 發(fā)表于 2017-7-24 06:35 | 顯示全部樓層
將主函數(shù)改成下截圖那樣,試試。注意的是把 while(1); 中  ;   號(hào) 去掉。
12.PNG
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2017-7-24 06:33 | 顯示全部樓層
你的程序main()初始化后進(jìn)入死循環(huán)while(1); 因?yàn)閣hile(1)內(nèi)沒(méi)有具體內(nèi)容可執(zhí)行,在沒(méi)有發(fā)生中斷時(shí)程序永遠(yuǎn)停留在while(1);等待中斷。當(dāng)中斷發(fā)生時(shí)執(zhí)行中斷程序,完成后回到while(1);繼續(xù)等待中斷,只是你感覺(jué)不到。如果你想看到中斷完成后返回主程序,可以改成這樣:
#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;//跳變沿出發(fā)方式(下降沿)
        EX0=1;//打開(kāi)INT0的中斷允許。
        EA=1;//打開(kāi)總中斷                 
}

void main()
{
        led2=0;
        led1=0;
        for(a=0;a<4;a++)
        {
                led1=1;
                delay(60000);
                led1=0;
                delay(60000);
        }
        Int0Init();  //設(shè)置外部中斷0
        while(1)//;
        {
                if(b==1)
                {
                        EA=0;//關(guān)閉總中斷
                        b=0;
                        for(a=0;a<4;a++)
                        {
                                led2=1;
                                delay(60000);
                                led2=0;
                                delay(60000);
                        }
                        EA=1;//打開(kāi)總中斷
                }
        }
}

void Int0() interrupt 0
{
        b=1;
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表