1.卡顿的流水灯
我们用一个实验现象来再一次理解中断函数。
在主函数里我们使八盏灯不停地左右快速流水,此时若是被外部因素触发了中断函数的执行,我们就在中断函数里实现蜂鸣器响一下,看看此时主函数里的流水灯是什么现象。
代码下载进去,我们随意按K4,观察流水灯。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <reg52.h> #include <function.h>//详见第六章第8讲 void main() { u8 i,dir; IT1 = 1; //下降沿触发模式 EX1 = 1; EA = 1; LED_Init(); //初始化LED硬件模块 KEY_Init(); //初始化按键功能模块 while (1) { if (i<8)dir=0; //向左移 if (dir==0)P0=~(0x01<<i); if (i>=8)dir=1; //向右移 if (dir==1)P0=~( 0x80>>(i-7) ); //当i大于等于8之后,(i-7)其实也还是在1~7之间变化 delay_ms(50); i++; if (i>=15)i=1; //让i一直在1~14之间变化 } } //请把P3.3和P2.3用杜邦线连接起来 void EXTI1_IRQHandler() interrupt 2 { u16 i; u8 x; for (i=0;i<2000;i++) { BEEP=!BEEP; for (x=0;x<75;x++); } } |
可以看到流水灯在K4按下的时候触发了中断函数的执行,蜂鸣器响了一下,响的过程中流水灯停止了流水,说明在主函数里的CPU使用权被剥夺给了中断函数,导致了主函数的执行任务被暂停,蜂鸣器响完之后,也就是中断函数执行完了,CPU使用权给回了主函数,于是又接着执行流水灯的任务了,这些过程叫做保留现场和恢复现场。
2.中断的好处
我们再来领略一下中断的优势。
把下面的代码下载进去,蜂鸣器会一直响,然后随意按K4。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <reg52.h> #include <function.h>//详见第六章第8讲 void main() { u8 x; IT1 = 1; //下降沿触发模式 EX1 = 1; EA = 1; LED_Init(); //初始化LED硬件模块 KEY_Init(); //初始化按键功能模块 LED2=0; //点亮LED2 while (1) { BEEP=!BEEP; for (x=0;x<75;x++); } } //请把P3.3和P2.3用杜邦线连接起来 void EXTI1_IRQHandler() interrupt 2 { static u8 i=1; P0=~(0x01<<i); i++; if (i>=8)i=0; } |
试想,我们没学过中断函数,在前面几章的基础知识中只在主函数里实现蜂鸣器一直响,然后按键还可以切换小灯的跳转,这样的功能我们可以做得到吗,我想应该有点难度。所以在中断函数的帮助下有种任务并列执行的优势。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程