久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17399|回復: 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, 下載次數: 102)

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩午夜影院 | 成人免费在线播放 | 欧美一级在线免费观看 | 麻豆91av| 天天舔天天 | 国产一二三区电影 | 欧美福利视频一区 | 国产精品欧美精品日韩精品 | 视频一区在线观看 | 四虎永久影院 | 日韩性生活网 | 亚洲一区二区三区在线播放 | 欧美成人猛片aaaaaaa | 亚洲综合热 | 天天色天天色 | 国产美女高潮 | 久久99精品久久久97夜夜嗨 | 日本免费一区二区三区四区 | 翔田千里一区二区 | 欧美激情a∨在线视频播放 成人免费共享视频 | 人干人操| 羞羞视频在线观看网站 | 国产精品乱码一区二区三区 | 亚洲精品日韩在线 | 久久天天综合 | 久久久久亚洲精品 | 性色av网站| 久久久久久成人 | 国产精品欧美日韩 | 日韩精品成人在线 | 久久99精品久久久久久噜噜 | 久久久亚洲一区 | 黄色网址在线播放 | 欧美乱大交xxxxx另类电影 | 黄色成人av | 亚洲午夜视频在线观看 | 国产精品一区三区 | www成人啪啪18| 精品久久久久久 | 三级成人在线 | 午夜精品91 |