原理
想必大家肯定都看过很多类似的博客了,中断的概念应该都有一定了解了,那我这里也就不多赘述了。(好吧,是我太懒了。)
那么,就直接根据原理图讲外部中断吧——
首先,先认一下外部中断的端口——
上图中有四个端口:INT0、Timer0、INT1、Timer1;
其中 INT0 为外部中断0,INT1 为外部中断1;
Timer0 为定时器0、Timer1 为定时器1。
先看外部中断0 INT0 ——
首先,开关 TCON.0(寄存器TCON的第0位,IT0) 有上、下两个接口,上面的是“ 上升沿和下降沿均可触发”,下面的是“只能下降沿触发”。即,当IT0为高电平时,只能下降沿触发,IT0为低电平时,上升沿和下降沿均可。
上升沿,就是电压从低电平到高电平的过程。
下降沿,就是从高电平到低电平的过程。
上升沿或下降沿一般都是通过按键来触发,后面会讲到,这里就先不深入讲解。
接着,就是一个开关 EX0 和开关 EA,都让他们为高电平即为导通了。
(EX0 为 外部中断0允许位,使其为高电平,代表允许外部中断0进行中断;
EA 为总中断允许位,使其为高电平,代表允许存在中断。)
所以初始化的代码即为 ——
void INT0_Init(void){ //这个函数名其实可以随便写啦,只是这样更好看
IT0 = 0; //上升沿或下降沿均可触发 或IT0 = 1;//只能下降沿触发
EX0 = 1; //允许外部中断0中断
EA = 1; //允许中断存在
}
接下来介绍一下“管脚复用”——
由于单片机的管脚较少,所以有些地方的管脚会有很多功能。
比如这个“IAP15F2K61S2”的原理图,INT0 与 P3.2是管脚复用,而 P3.2 我们之前学到是按键里会用到的。
所以,当我们写外部中断0时,触发这个外部中断的条件就是用按键触发,一般都是用独立按键(毕竟矩阵按键还要判断啥的也麻烦。),所以对应的,触发外部中断0的就是按键 S5.而一般按下按键都是下降沿,所以一般 TCON 都写为高电平。
外部中断 1、2、3、4 的都一样的原理,就不再赘述了。
最后,这个中断的运行代码是要加上一个中断号的,例——
void INT0_handle(void) interrupt 0{
}
interrupt 0
就代表外部中断0.
中断号表如下——
代码
假设,写一个外部中断 0 让 LED 灯左移的代码。
//外部中断0初始化
void INT0_Init(void){
IT0 = 1; //只允许下降沿触发
EX0 = 1; //中断外部中断0中断
EA = 1; //允许存在中断
}
//触发后的运行程序
void INT0_handle(void) interrupt 0{
led = _cror_(led,1);
}
代码可参考我之前发的一篇流水灯的博客:@Moqim—— 学习自检 —— 流水灯。
注意:IT0 只是寄存器 TCON 中的一位,TCON 是可位寻址的,所以,初始化外部中断时,尽可能写 IT0/IT1,不要写 TCON。