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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11071|回復: 28
打印 上一主題 下一主題
收起左側

C51單片機如何通過外部中斷INT0,跳出主程序中的while死循環?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:888259 發表于 2021-3-5 11:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 17826075805 于 2021-3-6 10:14 編輯

如何通過外部中斷INT0,跳出主程序中的while死循環?1.問題背景
由于項目需要,選擇相應的程序運行后如果不是人為打斷,功能函數內的while循環是一直運行下去的。
2.需求實現
需要通過外部中斷INT0,使程序能夠跳出功能函數內的while死循環。


求助,希望論壇大佬能夠提供一下思路。

捕獲2.PNG (24.84 KB, 下載次數: 137)

功能函數存在死循環

功能函數存在死循環

捕獲.PNG (88.76 KB, 下載次數: 157)

中斷服務中的處理

中斷服務中的處理
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:235200 發表于 2021-3-5 12:36 | 只看該作者
while(1)循環內分類做兩個循環,無中斷在一類循環中,有中中斷在另一類循環中
回復

使用道具 舉報

板凳
ID:888259 發表于 2021-3-5 13:37 | 只看該作者
csmyldl 發表于 2021-3-5 12:36
while(1)循環內分類做兩個循環,無中斷在一類循環中,有中中斷在另一類循環中

有中斷的while循環要怎樣做呢?我的程序中的while循環都是有中斷類循環
回復

使用道具 舉報

地板
ID:888259 發表于 2021-3-5 13:41 | 只看該作者
問題補充:可否利用goto語句在中斷中做跳轉呢?
回復

使用道具 舉報

5#
ID:716656 發表于 2021-3-5 14:35 | 只看該作者
需求2:功能函數跳出用break就行,如果用中斷,就在中斷函數里給變量賦值,在功能函數里加if(變量==y){變量=x;break;} 這樣就解決了。       需求1:打斷主函數while(1)運行……這我就不會了還能這樣么?確實沒有見過。。。。主要不知道打斷了要干什么?程序復位么?

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:888259 發表于 2021-3-5 14:42 | 只看該作者
壓著我頭發啦 發表于 2021-3-5 14:35
需求2:功能函數跳出用break就行,如果用中斷,就在中斷函數里給變量賦值,在功能函數里加if(變量==y){變 ...

是需求1的意思,類似于程序復位,好比正在播放歌曲,這個時候按下退出按鍵,正在播放的歌曲就退出了。并不是復位。
回復

使用道具 舉報

7#
ID:304608 發表于 2021-3-5 14:44 | 只看該作者
有兩種思路:
1.設置一個全局變量(flag), 在中斷過響應中改變flag的值,然后在while輪詢,監測到flag改變后break就跳出來了。
2.使用goto語句, 簡單粗暴,不推薦使用,破壞程序完整性。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:888259 發表于 2021-3-5 14:48 | 只看該作者
profile5 發表于 2021-3-5 14:44
有兩種思路:
1.設置一個全局變量(flag), 在中斷過響應中改變flag的值,然后在while輪詢,監測到flag改變 ...

goto語句只能用在函數內部,不能跳轉到函數的外部
采用中斷輪詢響應flag也要等待一次while循環完成后程序運行到判斷flag的地方才行。這樣做響應速度太慢了。而且會影響到while循環內部的延時。
回復

使用道具 舉報

9#
ID:879348 發表于 2021-3-5 15:45 | 只看該作者
感覺你中斷的概念都沒搞清楚
回復

使用道具 舉報

10#
ID:304608 發表于 2021-3-5 15:58 | 只看該作者
17826075805 發表于 2021-3-5 14:48
goto語句只能用在函數內部,不能跳轉到函數的外部
采用中斷輪詢響應flag也要等待一次while循環完成后程 ...

思路要開闊,

你可以把while中的內容切片成無數個小的執行單元,比如傳送一首歌數據,你可以在while中每ms調用一次數據傳遞函數啊,這樣監測到flag的變化也僅僅需要1ms的時間哇,

咳。。咳, 要不,換芯片,上操作系統吧。。
回復

使用道具 舉報

11#
ID:883031 發表于 2021-3-5 16:05 | 只看該作者
goto指令
回復

使用道具 舉報

12#
ID:822755 發表于 2021-3-5 22:26 | 只看該作者
實在需要這樣,可以使用push, pop來修改中斷返回地址。
但是,實際上,可以更合理設計程序結構來避免這樣操作。
回復

使用道具 舉報

13#
ID:858964 發表于 2021-3-5 23:50 | 只看該作者
本帖最后由 Kxuan163 于 2021-3-6 00:00 編輯


#include<reg51.h>   

int flag;  //定義全局變量


// 外中斷INT0的中斷服務程序:
void int0(void) interrupt 0 using 0  //INT0的中斷號為0
{
  flag = 0;        //使循環條件不成立
  ;
}

void main(void)   //主程序
  {
   EA=1;   / /開中斷
   EX0=1;  //允許使用INT0外中斷
   IT0=1;  //選擇負跳變來觸發外中斷

   flag =1; //首先使循環條件成立
   while(flag==1)  //無限循環
    {
           // 循環體的語句

         ;
     }

}


// 以上程序,我用Keil 編譯通過。
回復

使用道具 舉報

14#
ID:213173 發表于 2021-3-6 08:38 | 只看該作者
17826075805 發表于 2021-3-5 14:42
是需求1的意思,類似于程序復位,好比正在播放歌曲,這個時候按下退出按鍵,正在播放的歌曲就退出了。并 ...

如果按樓主的思路設計程序構架,可以采用軟復位的方式輕松實現。
1.主函數設兩個互不關聯的while死循環,其它子函數當然都可以調用。main初始化時讀取EEPROM保存的分支信息確定運行哪個循環。
2.外部中斷INT0函數中,判斷正在運行中的是哪個死循環,改寫EEPROM,啟動軟復位。
3.重啟,讀EEPROM,進入另一個死循環。
4.掉電后再上電,運行的是掉電前的循環。
回復

使用道具 舉報

15#
ID:888259 發表于 2021-3-6 08:59 | 只看該作者
Kxuan163 發表于 2021-3-5 23:50
#include   

int flag;  //定義全局變量

我開始也是這樣做的,只是while循環內部的所要做的工作很多,并且有3h的大延遲,如果中斷錯過while開始時的flag判斷,那么必須要等到下次while循環后程序才能停止。
回復

使用道具 舉報

16#
ID:888259 發表于 2021-3-6 09:04 | 只看該作者
KongQuan 發表于 2021-3-5 22:26
實在需要這樣,可以使用push, pop來修改中斷返回地址。
但是,實際上,可以更合理設計程序結構來避免這樣 ...

實際上我的需求是這樣的,項目需要進入一種電源模式,然后通過控制繼電器陣列通斷。這個電源模式的切換是周期性的,閉合2.5h,斷開0.5小時,一直循環運行下去。現在要做的就是通過外部中斷可以隨時跳出這個循環。
回復

使用道具 舉報

17#
ID:888259 發表于 2021-3-6 09:07 | 只看該作者
wulin 發表于 2021-3-6 08:38
如果按樓主的思路設計程序構架,可以采用軟復位的方式輕松實現。
1.主函數設兩個互不關聯的while死循環 ...

我的硬件電路暫時沒上E^2PROOM
回復

使用道具 舉報

18#
ID:888259 發表于 2021-3-6 09:14 | 只看該作者
本帖最后由 17826075805 于 2021-3-6 09:18 編輯
wufa1986 發表于 2021-3-5 15:45
感覺你中斷的概念都沒搞清楚

所謂中斷,就是在主程序運行過程中停下來去處理中斷服務,中斷服務結束后,重新返回程序入口接著主函數繼續執行。更為底層的操作,就是中斷觸發時,將當前主程序的下一條程序地址通過PC壓入棧中(現場保護),然后將中斷服務函數地址(中斷向量地址)放入PC,CPU在PC中取指令,主程序跳轉到中斷服務函數入口執行中斷,當中斷服務函數執行完畢后,PC再將棧中的程序入口地址取出棧,CPU在PC中取指令,程序跳轉到中斷前的主函數斷點處繼續執行主程序(現場恢復)。
回復

使用道具 舉報

19#
ID:888259 發表于 2021-3-6 09:34 | 只看該作者
profile5 發表于 2021-3-5 15:58
思路要開闊,

你可以把while中的內容切片成無數個小的執行單元,比如傳送一首歌數據,你可以在w ...

還是想嘗試去搞一下,實在不行,我也打算換芯片,上操作系統了
回復

使用道具 舉報

20#
ID:213173 發表于 2021-3-6 09:42 | 只看該作者
17826075805 發表于 2021-3-6 09:07
我的硬件電路暫時沒上E^2PROOM

上面所述只是按你的思路設想的構架。其實不論多少個分支,每個分支運行多長時間,都可以在一個主循環內處理。關鍵在于解決問題的思路和設計程序的構架。難道你一個分支就有上萬條代碼?
回復

使用道具 舉報

21#
ID:888259 發表于 2021-3-6 09:48 | 只看該作者
我這邊想通過替換棧中中斷產生所保存的主程序入口地址來實現。通俗一點的講就是趁單片機處理中斷服務的時候(趁它不注意),偷偷把它當時存放的東西調包,當它回過神來,拿著那個東西就走了。也就是實現了利用外部中斷來跳出死循環的功能,現在重點問題是要找到外部中斷產生時,主函數程序入口地址被保存在棧中的哪個位置。然后如何通過匯編指令做程序的跳轉。
回復

使用道具 舉報

22#
ID:888259 發表于 2021-3-6 10:57 | 只看該作者

goto不能再函數間跳轉,只能在函數內部跳轉
回復

使用道具 舉報

23#
ID:888259 發表于 2021-3-6 11:40 | 只看該作者
wulin 發表于 2021-3-6 09:42
上面所述只是按你的思路設想的構架。其實不論多少個分支,每個分支運行多長時間,都可以在一個主循環內處 ...

我上傳的部分代碼截圖,方便看下?
回復

使用道具 舉報

24#
ID:858964 發表于 2021-3-6 17:11 | 只看該作者
17826075805 發表于 2021-3-6 09:07
我的硬件電路暫時沒上E^2PROOM

你的硬件電路用的51單片機型號是什么,可否用有EEPROM的兼容型號芯片代替?
回復

使用道具 舉報

25#
ID:517951 發表于 2021-3-7 19:50 | 只看該作者
解決思路:設置一個全局變量(flag), 在中斷過響應中改變flag的值,然后在while(flag==1);輪詢,監測到flag=0改變后break就跳出來了。
回復

使用道具 舉報

26#
ID:822755 發表于 2021-3-7 21:41 | 只看該作者
Jinbw 發表于 2021-3-6 09:04
實際上我的需求是這樣的,項目需要進入一種電源模式,然后通過控制繼電器陣列通斷。這個電源模式的切換是 ...

這個解決起來很簡單, 把2.5h, 0.5h用計時來做。
大概就是開啟定時器中斷, 中斷中做志。在循環中檢查定時標志,不停累加計時就行。同時以檢查外部中斷,隨時都可以中止循環,不存在在2.5h中,無法檢查標志的問題。
回復

使用道具 舉報

27#
ID:888259 發表于 2021-3-8 11:38 | 只看該作者
KongQuan 發表于 2021-3-7 21:41
這個解決起來很簡單, 把2.5h, 0.5h用計時來做。
大概就是開啟定時器中斷, 中斷中做志。在循環中檢查定 ...

好的,我試一下
回復

使用道具 舉報

28#
ID:885009 發表于 2021-3-8 12:06 | 只看該作者
設置一個全局變量 = 1
while(全局變量)
{
}
在中斷中使 全局變量 = 0
功能想稍微有用點的可以
設置一個 二進制 全局變量 = 1
while(全局變量 )
{
}
while(~全局變量)
{
}
在中斷中使 全局變量 = ~全局變量
回復

使用道具 舉報

29#
ID:63132 發表于 2021-5-14 16:15 來自觸屏版 | 只看該作者
把按鍵值作為while的判斷條件
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av网站免费观看 | 麻豆av电影网 | 蜜桃视频在线观看免费视频网站www | 欧美一级久久 | 黄色网页在线 | 精品免费视频一区二区 | 亚洲国产成人av好男人在线观看 | 日韩欧美三级在线 | 久久久久国产精品人 | 97国产一区二区精品久久呦 | 中文精品视频 | 亚洲视频免费一区 | 黄色成人在线观看 | 做a视频 | 粉嫩国产精品一区二区在线观看 | 欧美一级在线免费 | 日本黄色免费大片 | 亚洲精品在线播放 | 日本a视频 | av黄色免费在线观看 | 亚洲国产精品一区二区久久 | 国产在线一区二区三区 | 成人在线中文字幕 | 一级片网址 | 精品91久久久 | 日韩在线观看网站 | 干干干日日日 | 欧美一级欧美三级在线观看 | 久久精品这里精品 | 中文二区| 91精品国产91久久久久久密臀 | 中国黄色在线视频 | 国产二区三区 | 国产成人影院 | 亚洲成人一区二区 | 欧美激情视频网站 | 国产一区二区av | 天天综合天天 | 性高湖久久久久久久久3小时 | av天天看 | 日韩精彩视频 |