实现内容与基本原理解释
**实现结果:**触发INT0口并使用中断函数来使得八个LED循环两次流水灯后全部熄灭
**原理解释:**首先将单片机开启全局允许中断指令,再对INT0开启允许中断接口,之后只需要将INT0引脚变成低电平就可以触发中断函数了
重要变量
- IT=0 电平触发;IT=1 跳沿触发
- EX=0 禁止外部中断;EX=1 允许外部中断
- EA=0 禁止全局中断;EA=1 开放全局中断
- PX=0 为该引脚设置低优先级中断;PX=1 为该引脚设置高优先级中断
这里不详细讲中断函数,仅提供代码实现方法,具体内容查看《SC中断函数》
无优先级的单个按钮外部中断
如开头所述实现方法,如下图布置8个LED,然后布设一个开关来控制INT0口的外部中断
中断函数编写
- 中断函数格式为:void name(void) interrupt a using b{}
其中name为自定义名字,可以随便取;
a表示欲操作的工作寄存器区;
b表示工作寄存区a下属的工作寄存器 - 中断函数没有返回值!没有形参!且不可以被任何函数调用!
- 只要我们编写了中断函数后,函数即生效而无需调用,所以我们只需要在函数体里面写入操作即可
- 函数体内为我们要实现的代码,流水灯循环两次然后全部灯熄灭,代码和之前文章内一致可以去看看
void int0(void) interrupt 0 using 1{
uchar j,k;
for(j=0;j<2;j++){
P0=0xfe;
for(k=0;k<8;k++){
P0=_crol_(P0,1);
delay(22);
}
}
P0=0xff;
}
主函数编写
- P0=0xff 首先让所有的灯灭掉(二进制为11111111)
- EA=1 打开单片机全局可中断开关
- IT0=1 选择INT0口为跳沿触发方式
- EX0=1 让INT0允许外部中断
void main(){
P0=0xff;
EA=1;
IT0=1;
EX0=1;
while(1);
}
完整代码
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint k){
uchar i,j;
while(k--){
for(i=0;i<255;i++);
for(j=0;j<255;j++);
}
}
void int0(void) interrupt 0 using 1{
uchar j,k;
for(j=0;j<2;j++){
P0=0xfe;
for(k=0;k<8;k++){
P0=_crol_(P0,1);
delay(22);
}
}
P0=0xff;
}
void main(){
P0=0xff;
EA=1;
IT0=1;
EX0=1;
while(1);
}