历史上的今天
今天是:2024年08月23日(星期五)
2021年08月23日 | 51单片机-中断函数
2021-08-23 来源:eefocus
1.中断函数概念
上一讲里,当赋值IT0为1时,P3.2遇到下降沿,IE0被置1,要想使IE0自动清零,我们引用中断函数就可以了。
我们可能已经习惯了都是在main函数里阅读分析代码,其实还有另一种函数需要我们认识的,那就是中断函数。所谓中断函数就是当它满足一定的条件时就会暂停主函数的执行内容,转而去执行中断函数。关于这个概念网上很多说法都已经讲解的很详细了,这里点一下即可。
因为我们擅长的是从实践中领悟真理,所以后面我们尽量用例程去理解中断函数。
2.中断函数的书写
中断函数与其他我们封装过的子函数的写法不同,有个区分标志“interrupt”。
至于后面为什么会有个数字0我们以后再讲。

当然函数名我们可以随意取,只要不跟以前封装定义好的函数名冲突就行。这里我们取“EXTI0_IRQHandler”作为函数名是模仿STM32单片机的写法。
3.EX0和EA
我们说过要想进入中断函数,必须满足它的一些前提条件。这里的EX0(IE^0)和EA(IE^7)要初始化赋值给1才能进入的了中断函数去执行任务。
EA叫做总中断开关,EX0是针对P3.2的外部中断的开关。
也就是要想进入中断函数必须满足两个开关都要闭合(都为1)。

4.实战
同样像上一讲那样拔插杜邦线观察现象,可以看到程序中IE0的身影不再出现但实现功能也都是一样的
#include #include 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没有反应,因为这样做已经不满足触发中断函数响应了。
上一篇:51单片机-寄存器
下一篇:51单片机-进一步理解中断函数
史海拾趣
|
求助:(TFTP)TIMEOUT waiting for Ack block 我是个新手,用一块板子s3c2510测试了下tftp的功能,发现程序中定义的的包结构,都偏移了两个字节发送出去,在发送前人为添加了两个字节,可以正常与tftpserver通信了,并能下载104K 的BIN文件, 但在下载稍微大点的应用文件(大约4M)时,总会报 ...… 查看全部问答> |
|
/*请教下各位大侠 为什么读出来的数据老是等于0呢 麻烦各位这点一下*/ #include #include \"NUC1xx.h\" #include \"DrvGPIO.h\" #include \"DrvSYS.h\" /*$$$$$$$$$$$$$$$$$RAM$$$$$$$$$$$$$$$$$$$$$$*/ #define& ...… 查看全部问答> |
|
哪位大牛给介绍一款常用的内部带flash的fpga 领导非要用内部带flash的,小弟新手找了好久爱也没找到,不知道从手册的哪里能够看出来有没有内置flash。 我们公司以前的产品里面貌似只有XC3S50AN-4TQ144C这个里面有,但是这个的资源不够用… 查看全部问答> |
|
刚学习一下MAX913比较器,一开始外围电路没用电阻,直接输入输出,LE脚接的地,可是把正玄波转换成方波总是出现问题 几百Khz时仿真就出现错误:本来应该高电平的却出现多个三角波 。再网上找别人的经验,试试还是不行 有 ...… 查看全部问答> |




