首页  /  单片机教程  /  中断函数  /  

中断函数

点击打开在线编译器,边学边练

1.中断函数概念

上一讲里,当赋值IT0为1时,P3.2遇到下降沿,IE0被置1,要想使IE0自动清零,我们引用中断函数就可以了。

我们可能已经习惯了都是在main函数里阅读分析代码,其实还有另一种函数需要我们认识的,那就是中断函数。所谓中断函数就是当它满足一定的条件时就会暂停主函数的执行内容,转而去执行中断函数。关于这个概念网上很多说法都已经讲解的很详细了,这里点一下即可。

因为我们擅长的是从实践中领悟真理,所以后面我们尽量用例程去理解中断函数。

 

2.中断函数的书写

中断函数与其他我们封装过的子函数的写法不同,有个区分标志“interrupt”。

至于后面为什么会有个数字0我们以后再讲。

6.8.png

当然函数名我们可以随意取,只要不跟以前封装定义好的函数名冲突就行。这里我们取“EXTI0_IRQHandler”作为函数名是模仿STM32单片机的写法。

 

3.EX0和EA

我们说过要想进入中断函数,必须满足它的一些前提条件。这里的EX0(IE^0)和EA(IE^7)要初始化赋值给1才能进入的了中断函数去执行任务。

EA叫做总中断开关,EX0是针对P3.2的外部中断的开关。

也就是要想进入中断函数必须满足两个开关都要闭合(都为1)。


6.9.png


4.实战

同样像上一讲那样拔插杜邦线观察现象,可以看到程序中IE0的身影不再出现但实现功能也都是一样的

#include <reg52.h> 
#include <function.h>//详见第六章第8讲

void main()
{  
    IT0 = 1;    //下降沿触发模式
    EX0 = 1;
    EA  = 1;
  
    LED_Init(); //初始化LED硬件模块 
    while(1);   //主函数什么事都不做,空循环这条语句
}
 
void EXTI0_IRQHandler() interrupt 0
{
    LED2=!LED2; 
}

所以看起来主函数什么内容也没有,但是在拔插杜邦线的过程中触发了中断函数,所以LED2被执行跳变,这就是中断函数的作用。

即使主函数一直执行“while(1);”,中断函数还是能执行的了的。

大家把“EX0=1;”改为“EX0=0;”,或者把“EA=1;”改为“EA=0;”再编译下载进去拔插杜邦线发现LED2没有反应,因为这样做已经不满足触发中断函数响应了。


本文固定URL:https://www.dotcpp.com/course/367

上一课:寄存器 下一课:进一步理解中断函数
第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)