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