|
預先的設計想法
P1口接八個led,開關k1,k2分別接外部中斷0 P3.2,和外部中斷1 P3.3
程序執行的時候8是流水燈形式。
1)k1按下上下四個燈是交替閃爍10次
2)k2按下的是8個燈交替閃爍5次
3)設置優先級別
遇到的問題
1)在進入中斷0的時候使用。可以正常返回主函數
IE0 = 0;關閉外部中斷
在退出的時候使用
IE0= 1;開啟外部中斷0;
請看代碼- void exter0() interrupt 0
- {
- uint tmp1;
- int mun;
-
- IE0 = 0;//關閉外部中斷0
- tmp1 = 0xf0;
- for(mun=0;mun<10;mun++)
- {
- P1=tmp1;
- tmp1 =_crol_(tmp1,4);
- delay(500);
- }
- IE0 = 1;//開啟外部中斷0
- }
復制代碼 2)在進入中斷0的時候使用。不能正常返回主函數
IE1 = 0;關閉外部中斷
在退出的時候使用
IE1= 1;開啟外部中斷0
- void exter1() interrupt 2
- {
- int mun1;
-
- IE1= 0;//關閉外部中斷1
- for(mun1=0;mun1<5;mun1++)
- {
- P1 = 0x00;
- delay(500);
- P1 = 0xff;
- delay(500);//這個延時必須要有,不然肉眼無法辨別出led燈有亮
- }
- IE1 = 1;//開啟外部中斷1
- }
復制代碼 完整的錯誤代碼
- #include<reg51.h>
- #include<intrins.h> //循環移位的頭文件
- #define uint unsigned int
- void delay(int z)
- {
- int i,j;
- for(i=0;i<z;i++)
- for(j=0;j<110;j++);
- }
- /* 中斷函數的步驟
- 1)開啟總中斷EA
- 2) 開啟對應的中斷的允許位,外部中斷0,對應EX0=1,外部中斷1,對應EX1=1;
- 3)選擇觸發方式(跳沿觸發=1,電平觸發=0),外部中斷0對應的是IT0=0,低電平有效。
- 外部中斷1對應的是IT1=1,跳沿觸發,高電平跳變成低電平有效
- 4)設置中斷的優先級,如果不設置則按照系統默認的優先級別
- */
- void main()
- {
- uint tmp;
-
- EA = 1;//開啟總中斷
- EX0 = 1;//外部中斷0允許位,置一表示允許
- IT0 = 0;//外部中斷0,選擇電平觸發,低電平有效
- EX1 = 1;//外部中斷1的允許位
- IT1 = 1;//外部中斷1,選擇跳沿觸發,電平由高到低的負跳變有效
- PX0 = 0;//外部中斷0,優先級別為低
- PX1 = 1;//外部中斷1,優先級別為高
- tmp = 0xfe;
-
- while(1)
- {
- P1 = tmp;
- tmp=_crol_(tmp,1);
- delay(500);
- }
- }
- //外部中斷0
- void exter0() interrupt 0
- {
- uint tmp1;
- int mun;
-
- IE0 = 0;//關閉外部中斷0
- tmp1 = 0xf0;
- for(mun=0;mun<10;mun++)
- {
- P1=tmp1;
- tmp1 =_crol_(tmp1,4);
- delay(500);
- }
- IE0 = 1;//開啟外部中斷0
- }
- //外部中斷1
- void exter1() interrupt 2
- {
- int mun1;
-
- IE1= 0;//關閉外部中斷1
- for(mun1=0;mun1<5;mun1++)
- {
- P1 = 0x00;
- delay(500);
- P1 = 0xff;
- delay(500);//這個延時必須要有,不然肉眼無法辨別出led燈有亮
- }
- IE1 = 1;//開啟外部中斷1
- }
復制代碼
我自己查資料之后發現IEx(IE0,IE1)是外部中斷0和外部中斷1的標志位。外部中斷的中斷允許位是EXx(EX0,EX1)修改。為了測試,我把外部中斷1的代碼修改如下,但是沒有修改外部中斷0
- //外部中斷1
- void exter1() interrupt 2
- {
- int mun1;
-
- EX1= 0;//關閉外部中斷1
- for(mun1=0;mun1<5;mun1++)
- {
- P1 = 0x00;
- delay(500);
- P1 = 0xff;
- delay(500);//這個延時必須要有,不然肉眼無法辨別出led燈有亮
- }
- EX1 = 1;//開啟外部中斷1
- }
復制代碼 修改之后外部中斷1和外部中斷0都可以正常放回主函數。代碼如下
- #include<reg51.h>
- #include<intrins.h> //循環移位的頭文件
- #define uint unsigned int
- void delay(int z)
- {
- int i,j;
- for(i=0;i<z;i++)
- for(j=0;j<110;j++);
- }
- /* 中斷函數的步驟
- 1)開啟總中斷EA
- 2) 開啟對應的中斷的允許位,外部中斷0,對應EX0=1,外部中斷1,對應EX1=1;
- 3)選擇觸發方式(跳沿觸發=1,電平觸發=0),外部中斷0對應的是IT0=0,低電平有效。
- 外部中斷1對應的是IT1=1,跳沿觸發,高電平跳變成低電平有效
- 4)設置中斷的優先級,如果不設置則按照系統默認的優先級別
- */
- void main()
- {
- uint tmp;
-
- EA = 1;//開啟總中斷
- EX0 = 1;//外部中斷0允許位,置一表示允許
- IT0 = 0;//外部中斷0,選擇電平觸發,低電平有效
- EX1 = 1;//外部中斷1的允許位
- IT1 = 1;//外部中斷1,選擇跳沿觸發,電平由高到低的負跳變有效
- PX0 = 0;//外部中斷0,優先級別為低
- PX1 = 1;//外部中斷1,優先級別為高
- tmp = 0xfe;
-
- while(1)
- {
- P1 = tmp;
- tmp=_crol_(tmp,1);
- delay(500);
- }
- }
- //外部中斷0
- void exter0() interrupt 0
- {
- uint tmp1;
- int mun;
-
- IE0 = 0;//關閉外部中斷0
- tmp1 = 0xf0;
- for(mun=0;mun<10;mun++)
- {
- P1=tmp1;
- tmp1 =_crol_(tmp1,4);
- delay(500);
- }
- IE0 = 1;//開啟外部中斷0
- }
- //外部中斷1
- void exter1() interrupt 2
- {
- int mun1;
-
- EX1= 0;//關閉外部中斷1
- for(mun1=0;mun1<5;mun1++)
- {
- P1 = 0x00;
- delay(500);
- P1 = 0xff;
- delay(500);//這個延時必須要有,不然肉眼無法辨別出led燈有亮
- }
- EX1 = 1;//開啟外部中斷1
- }
復制代碼
到了這里我就不明白是什么原因啦,難道是中斷優先級的問題嗎,我設置外部中斷1的優先級別是高的,外部中斷0的優先級別是低的
希望能得到熱心大佬的幫助,謝謝啦
|
-
中斷.png
(44.29 KB, 下載次數: 48)
下載附件
2019-4-21 17:31 上傳
-
-
Proteus.rar
2019-4-21 17:33 上傳
點擊文件名下載附件
27.22 KB, 下載次數: 2
|