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

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

QQ登錄

只需一步,快速開始

搜索
查看: 3856|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

在使用單片機(jī)中斷的IE和EX,遇到中斷結(jié)束后無法返回

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
預(yù)先的設(shè)計(jì)想法
P1口接八個(gè)led,開關(guān)k1,k2分別接外部中斷0 P3.2,和外部中斷1 P3.3
程序執(zhí)行的時(shí)候8是流水燈形式。
1)k1按下上下四個(gè)燈是交替閃爍10次
2)k2按下的是8個(gè)燈交替閃爍5次
3)設(shè)置優(yōu)先級(jí)別

遇到的問題
1)在進(jìn)入中斷0的時(shí)候使用。可以正常返回主函數(shù)
IE0 = 0;關(guān)閉外部中斷
在退出的時(shí)候使用
IE0= 1;開啟外部中斷0;
請(qǐng)看代碼
  1. void exter0() interrupt 0
  2. {
  3.         uint tmp1;
  4.         int mun;
  5.         
  6.         IE0 = 0;//關(guān)閉外部中斷0
  7.         tmp1 = 0xf0;
  8.         for(mun=0;mun<10;mun++)
  9.         {
  10. P1=tmp1;
  11.                 tmp1 =_crol_(tmp1,4);
  12.                 delay(500);
  13.         }
  14.         IE0 = 1;//開啟外部中斷0
  15. }
復(fù)制代碼
2)在進(jìn)入中斷0的時(shí)候使用。不能正常返回主函數(shù)
IE1 = 0;關(guān)閉外部中斷
在退出的時(shí)候使用
IE1= 1;開啟外部中斷0
  1. void exter1() interrupt 2
  2. {
  3.         int mun1;
  4.         
  5.         IE1= 0;//關(guān)閉外部中斷1
  6.         for(mun1=0;mun1<5;mun1++)
  7.         {
  8.                 P1 = 0x00;
  9.                 delay(500);
  10.                 P1 = 0xff;
  11.                 delay(500);//這個(gè)延時(shí)必須要有,不然肉眼無法辨別出led燈有亮
  12.         }
  13.         IE1 = 1;//開啟外部中斷1
  14. }
復(fù)制代碼
完整的錯(cuò)誤代碼
  1. #include<reg51.h>
  2. #include<intrins.h> //循環(huán)移位的頭文件
  3. #define uint unsigned int

  4. void delay(int z)
  5. {
  6.         int i,j;
  7.         for(i=0;i<z;i++)
  8.         for(j=0;j<110;j++);
  9. }

  10. /* 中斷函數(shù)的步驟
  11. 1)開啟總中斷EA
  12. 2) 開啟對(duì)應(yīng)的中斷的允許位,外部中斷0,對(duì)應(yīng)EX0=1,外部中斷1,對(duì)應(yīng)EX1=1;
  13. 3)選擇觸發(fā)方式(跳沿觸發(fā)=1,電平觸發(fā)=0),外部中斷0對(duì)應(yīng)的是IT0=0,低電平有效。
  14.          外部中斷1對(duì)應(yīng)的是IT1=1,跳沿觸發(fā),高電平跳變成低電平有效
  15. 4)設(shè)置中斷的優(yōu)先級(jí),如果不設(shè)置則按照系統(tǒng)默認(rèn)的優(yōu)先級(jí)別
  16. */
  17. void main()
  18. {
  19.   uint tmp;
  20.         
  21.    EA = 1;//開啟總中斷
  22.    EX0 = 1;//外部中斷0允許位,置一表示允許
  23.    IT0 = 0;//外部中斷0,選擇電平觸發(fā),低電平有效
  24.    EX1 = 1;//外部中斷1的允許位
  25.    IT1 = 1;//外部中斷1,選擇跳沿觸發(fā),電平由高到低的負(fù)跳變有效
  26.    PX0 = 0;//外部中斷0,優(yōu)先級(jí)別為低
  27.    PX1 = 1;//外部中斷1,優(yōu)先級(jí)別為高
  28.   tmp = 0xfe;
  29.         
  30.   while(1)
  31. {
  32.    P1 = tmp;
  33.   tmp=_crol_(tmp,1);
  34.   delay(500);
  35.   }
  36. }

  37. //外部中斷0
  38. void exter0() interrupt 0
  39. {
  40.         uint tmp1;
  41.         int mun;
  42.         
  43.         IE0 = 0;//關(guān)閉外部中斷0
  44.         tmp1 = 0xf0;
  45.         for(mun=0;mun<10;mun++)
  46.         {
  47.                 P1=tmp1;
  48.                 tmp1 =_crol_(tmp1,4);
  49.                 delay(500);
  50.         }
  51.         IE0 = 1;//開啟外部中斷0
  52. }

  53. //外部中斷1
  54. void exter1() interrupt 2
  55. {
  56.         int mun1;
  57.         
  58.         IE1= 0;//關(guān)閉外部中斷1
  59.         for(mun1=0;mun1<5;mun1++)
  60.         {
  61.                 P1 = 0x00;
  62.                 delay(500);
  63.                 P1 = 0xff;
  64.                 delay(500);//這個(gè)延時(shí)必須要有,不然肉眼無法辨別出led燈有亮
  65.         }
  66.         IE1 = 1;//開啟外部中斷1
  67. }
復(fù)制代碼

我自己查資料之后發(fā)現(xiàn)IEx(IE0,IE1)是外部中斷0和外部中斷1的標(biāo)志位。外部中斷的中斷允許位是EXx(EX0,EX1)修改。為了測(cè)試,我把外部中斷1的代碼修改如下,但是沒有修改外部中斷0
  1. //外部中斷1
  2. void exter1() interrupt 2
  3. {
  4.         int mun1;
  5.         
  6.         EX1= 0;//關(guān)閉外部中斷1
  7.         for(mun1=0;mun1<5;mun1++)
  8.         {
  9.                 P1 = 0x00;
  10.                 delay(500);
  11.                 P1 = 0xff;
  12.                 delay(500);//這個(gè)延時(shí)必須要有,不然肉眼無法辨別出led燈有亮
  13.         }
  14.         EX1 = 1;//開啟外部中斷1
  15. }
復(fù)制代碼
修改之后外部中斷1和外部中斷0都可以正常放回主函數(shù)。代碼如下

  1. #include<reg51.h>
  2. #include<intrins.h> //循環(huán)移位的頭文件
  3. #define uint unsigned int

  4. void delay(int z)
  5. {
  6.         int i,j;
  7.         for(i=0;i<z;i++)
  8.         for(j=0;j<110;j++);
  9. }

  10. /* 中斷函數(shù)的步驟
  11. 1)開啟總中斷EA
  12. 2) 開啟對(duì)應(yīng)的中斷的允許位,外部中斷0,對(duì)應(yīng)EX0=1,外部中斷1,對(duì)應(yīng)EX1=1;
  13. 3)選擇觸發(fā)方式(跳沿觸發(fā)=1,電平觸發(fā)=0),外部中斷0對(duì)應(yīng)的是IT0=0,低電平有效。
  14.          外部中斷1對(duì)應(yīng)的是IT1=1,跳沿觸發(fā),高電平跳變成低電平有效
  15. 4)設(shè)置中斷的優(yōu)先級(jí),如果不設(shè)置則按照系統(tǒng)默認(rèn)的優(yōu)先級(jí)別
  16. */
  17. void main()
  18. {
  19.         uint tmp;
  20.         
  21.         EA = 1;//開啟總中斷
  22.         EX0 = 1;//外部中斷0允許位,置一表示允許
  23.         IT0 = 0;//外部中斷0,選擇電平觸發(fā),低電平有效
  24.         EX1 = 1;//外部中斷1的允許位
  25.         IT1 = 1;//外部中斷1,選擇跳沿觸發(fā),電平由高到低的負(fù)跳變有效
  26.         PX0 = 0;//外部中斷0,優(yōu)先級(jí)別為低
  27.         PX1 = 1;//外部中斷1,優(yōu)先級(jí)別為高
  28.         tmp = 0xfe;
  29.         
  30.         while(1)
  31.         {
  32.                 P1 = tmp;
  33.                 tmp=_crol_(tmp,1);
  34.                 delay(500);
  35.         }
  36. }

  37. //外部中斷0
  38. void exter0() interrupt 0
  39. {
  40.         uint tmp1;
  41.         int mun;
  42.         
  43.         IE0 = 0;//關(guān)閉外部中斷0
  44.         tmp1 = 0xf0;
  45.         for(mun=0;mun<10;mun++)
  46.         {
  47.                 P1=tmp1;
  48.                 tmp1 =_crol_(tmp1,4);
  49.                 delay(500);
  50.         }
  51.         IE0 = 1;//開啟外部中斷0
  52. }

  53. //外部中斷1
  54. void exter1() interrupt 2
  55. {
  56.         int mun1;
  57.         
  58.         EX1= 0;//關(guān)閉外部中斷1
  59.         for(mun1=0;mun1<5;mun1++)
  60.         {
  61.                 P1 = 0x00;
  62.                 delay(500);
  63.                 P1 = 0xff;
  64.                 delay(500);//這個(gè)延時(shí)必須要有,不然肉眼無法辨別出led燈有亮
  65.         }
  66.         EX1 = 1;//開啟外部中斷1
  67. }

復(fù)制代碼

到了這里我就不明白是什么原因啦,難道是中斷優(yōu)先級(jí)的問題嗎,我設(shè)置外部中斷1的優(yōu)先級(jí)別是高的,外部中斷0的優(yōu)先級(jí)別是低的



希望能得到熱心大佬的幫助,謝謝啦






中斷.png (44.29 KB, 下載次數(shù): 48)

中斷.png

Proteus.rar

27.22 KB, 下載次數(shù): 2

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:338671 發(fā)表于 2019-4-21 17:56 | 只看該作者
壓縮包里面的是仿真原理圖
回復(fù)

使用道具 舉報(bào)

板凳
ID:164602 發(fā)表于 2019-4-22 08:18 | 只看該作者
其實(shí)不是你說的那樣。
IEx是外部中斷的觸發(fā)位,即當(dāng)有外部中斷時(shí),這個(gè)位就由單片機(jī)置1,不是由程序置1。
在外部中斷的服務(wù)函數(shù)中,只需要將其置0即可,不需要再置1,置1就相當(dāng)于又產(chǎn)生了新的外部中斷。
所以,你原來的程序,只需要IEx置0,不需要最后的置1操作就好了。
我已經(jīng)試過的,沒問題,可以返回。

另外:由于外部中斷是用按鍵完成的,是按鍵,都是需要消抖的,你沒有消抖的程序,所以可能中斷會(huì)發(fā)生幾次才能返回主函數(shù),我試驗(yàn)時(shí),按下外部中斷1的按鍵最多產(chǎn)生過三次中斷。

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
51danpianji111 + 10 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:424408 發(fā)表于 2019-4-22 11:41 | 只看該作者
對(duì)是硬件中斷響應(yīng)自動(dòng)判斷置位
回復(fù)

使用道具 舉報(bào)

5#
ID:123289 發(fā)表于 2019-4-22 12:16 | 只看該作者
初學(xué)者易犯的錯(cuò):
中斷處理程序執(zhí)行時(shí)間過長!
在此期間其它比此更低級(jí)是中斷都將無法響應(yīng),被執(zhí)行!
回復(fù)

使用道具 舉報(bào)

6#
ID:338671 發(fā)表于 2019-4-22 12:21 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2019-4-22 08:18
其實(shí)不是你說的那樣。
IEx是外部中斷的觸發(fā)位,即當(dāng)有外部中斷時(shí),這個(gè)位就由單片機(jī)置1,不是由程序置1。
...

謝謝啦,我理解的按鍵消抖是做出實(shí)物的的時(shí)候才需要的,仿真的時(shí)候是不需要的。
回復(fù)

使用道具 舉報(bào)

7#
ID:462827 發(fā)表于 2019-4-22 13:36 | 只看該作者
你對(duì)中斷理解得不太正確
回復(fù)

使用道具 舉報(bào)

8#
ID:518550 發(fā)表于 2019-4-22 14:01 | 只看該作者
中斷需要的時(shí)間 程序不對(duì)
回復(fù)

使用道具 舉報(bào)

9#
ID:338671 發(fā)表于 2019-4-22 16:19 | 只看該作者
shuaishuaida 發(fā)表于 2019-4-22 14:01
中斷需要的時(shí)間 程序不對(duì)

可不可,詳細(xì)說一下呢
回復(fù)

使用道具 舉報(bào)

10#
ID:155507 發(fā)表于 2019-4-22 17:59 | 只看該作者
通常在中斷子程序中是不調(diào)用延時(shí)子程序的,這樣會(huì)增加中斷處理時(shí)間,如果有其它低級(jí)中斷了,就會(huì)延誤響應(yīng)中斷了。

所以,中斷子程序中不要寫調(diào)用延時(shí)子程序,中斷子程序也不要寫得過長,處理過多的任務(wù),要盡快處理后及時(shí)返回,如果中斷一次有很多任務(wù)需要執(zhí)行完全,可以在中斷子程序中設(shè)置一個(gè)標(biāo)志位,在主程序中查這個(gè)標(biāo)志位,當(dāng)標(biāo)志為1時(shí),就在主程序中完成這些任務(wù),這樣就不會(huì)影響其它中斷源的中斷,也不會(huì)使中斷產(chǎn)生混亂。

如果延時(shí)函數(shù)時(shí)間過長,則下次中斷有可能不會(huì)被觸發(fā),類似按鍵不靈敏,還有可能因?yàn)橹袛嗪椭鞒绦蚨荚谑褂醚訒r(shí)函數(shù),而和此相關(guān)的寄存器的值沒有保存,導(dǎo)致延時(shí)時(shí)間出錯(cuò)。

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
51danpianji111 + 5 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本不卡一区二区 | 欧美国产中文字幕 | 欧美一区永久视频免费观看 | 黄色一级免费观看 | 中文字幕亚洲精品在线观看 | 日韩在线视频观看 | 久久99精品国产麻豆婷婷 | 中文字幕 在线观看 | 51ⅴ精品国产91久久久久久 | 国产成人精品免费视频大全最热 | 欧美三级电影在线播放 | 欧美日韩国产精品 | 亚欧精品 | 一区二区三区在线观看免费视频 | 成人av电影天堂 | 一区中文字幕 | 国产日韩欧美在线观看 | 免费看91 | 一区二区播放 | 91极品尤物在线播放国产 | 色一情一乱一伦一区二区三区 | 黄色毛片视频 | 国产精品三级 | 最新中文字幕一区 | 久久这里只有精品首页 | www久久国产 | 男人天堂手机在线视频 | 成人一区二区三区在线观看 | 欧美日韩一区二区三区不卡视频 | 欧美精品一二三 | 免费成人在线网站 | 中文字幕在线电影观看 | 午夜精品久久久久久久星辰影院 | 欧产日产国产精品v | 久久久久国产精品一区二区 | 青青操91 | 国产精品视频免费看 | 国产精品毛片av | 国产婷婷色一区二区三区 | 欧美理论片在线观看 | 羞羞视频网站免费观看 |