KeilC51单片机外部中断原理解释

实现内容与基本原理解释


**实现结果:**触发INT0口并使用中断函数来使得八个LED循环两次流水灯后全部熄灭

**原理解释:**首先将单片机开启全局允许中断指令,再对INT0开启允许中断接口,之后只需要将INT0引脚变成低电平就可以触发中断函数了

重要变量

  1. IT=0 电平触发;IT=1 跳沿触发
  2. EX=0 禁止外部中断;EX=1 允许外部中断
  3. EA=0 禁止全局中断;EA=1 开放全局中断
  4. PX=0 为该引脚设置低优先级中断;PX=1 为该引脚设置高优先级中断

这里不详细讲中断函数,仅提供代码实现方法,具体内容查看《SC中断函数》



无优先级的单个按钮外部中断


如开头所述实现方法,如下图布置8个LED,然后布设一个开关来控制INT0口的外部中断

请添加图片描述


中断函数编写

  1. 中断函数格式为:void name(void) interrupt a using b{}
    其中name为自定义名字,可以随便取;
    a表示欲操作的工作寄存器区;
    b表示工作寄存区a下属的工作寄存器
  2. 中断函数没有返回值!没有形参!且不可以被任何函数调用!
  3. 只要我们编写了中断函数后,函数即生效而无需调用,所以我们只需要在函数体里面写入操作即可
  4. 函数体内为我们要实现的代码,流水灯循环两次然后全部灯熄灭,代码和之前文章内一致可以去看看
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;
}

主函数编写

  1. P0=0xff 首先让所有的灯灭掉(二进制为11111111)
  2. EA=1 打开单片机全局可中断开关
  3. IT0=1 选择INT0口为跳沿触发方式
  4. 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);
}


有优先级同时中断


  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhillery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值