|
预先的设计想法
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的优先级别是低的
希望能得到热心大佬的帮助,谢谢啦
|
|