一、中断系统
单片机的裸板程序,都是在main()函数中按顺序执行.若此时有些紧急的事情需要马上处理,就需要暂停当前工作,转去处理事件.
等事件处理好后,再返回原来的地方继续执行.
在单片机中,有个专门处理这样的实时性要求高的方式: 中断系统.
例如: 每天的事务就是吃饭,然后洗澡,最后睡觉.
若在吃饭时,突然有个电话过来.(你也不止到电话什么时候来,但来了就要及时接听,不接听就错过了). 这时候,你就要放下手头的工作,接听电话.
等电话接听完成后,再返回到原来的工作(吃饭).
二、外部中断的原理
2.1 STC8的中断系统
STC8G1K08A的中断类型主要分为:
- 外部中断: INT0,INT1,INT2,INT4,INT4 (主要是响应电平变化,常用于按键处理)
- 定时器中断: Timer0,Timer1 (主要响应定时器溢出)
- 数模转换中断: ADC(数模转换完成时出现)
- 其他中断
这里是STC8的中断结构图,我们只需看懂其中一路中断,其余部分即可触类旁通.
左边是中断请求,中间是中断允许控制,右边是中断优先级控制.
- 中断请求: 用于配置中断的触发方法(就是什么时候中断出现)
- 中断允许控制: 用于配置中断是否允许被处理(就是处理中断还是直接无视它)
- 中断优先级控制: 每个中断设置一个优先级,当多个中断同时出现时,按照优先级顺序依次处理
通过写寄存器的方式,我们就能完成中断的初始化配置.
然后再中断相应函数中,进行中断的处理.
2.2 外部中断例子: 单按键
例如: 我们的开发板,按键连接到P3.2/INT0引脚.
当按键按下时,引脚的电平是低; 按键松开(没按下)时,引脚的电平是高.
所以,我们需要INT0作为中断源,然后相应下降沿的中断,那就这样配置:
- 设置IT0 =1,让其接收下降沿信号
- 设置EX0 = 1, EA = 1, 使得中断信号被允许
- 设置PX0= 0,PX1 = 1,使其优先级为最低
2.3 中断相应函数
最后在中断相应函数中,响应中断(进行事件处理).
//中断函数的格式
void void 函数名() interrupt 中断号
{
//执行的语句
}
中断号可以根据中断的源进行查找,这里我们使用的是INT0,所以中断号是0.
三、关键代码
#include "stc8.h"
#include "intrins.h"
sbit LED = P5^5; //LED所在引脚
//INT0中断响应函数
void INT0_Isr() interrupt 0
{
LED = !LED;
}
void main()
{
P3M0 = 0x00;
P3M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
IPH &= (~PX0H); //PX0H,Px0 = 0,0 优先级为0级 (最低级)
PX0 = 0;
IT0 = 1; //使能INT0下降沿中断
EX0 = 1; //使能INT0中断
EA = 1; //使能中断总开关(放在最后,配置好其它功能,最后才开启)
while (1);
}
完整的代码,请见开头.
四、实验现象
按下按键,触发中断,LED状态改变;
再次按下按键,LED状态再次改变.