什么是中断程序呢?
形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章。烤地瓜这件事就好比中断程序,他中断了你看文章这件事。在程序方面来说 当CPU在执行一个程序的时候,突然产生了中断事件CPU就去执行中断程序了,当执行完成后CPU又回来执行原先的程序。
中断事件
什么是中断事件,就是引起中断的事件。对于单片机来说这些事件是多种多样的。比如 说一个按键按下,一定的时间到了,一串数据发送完毕,或接收完一个数据。
讲到中断不得不讲讲和中断相对的 查询。其实不管是按键按下 还是 时间到,还是数据发送完毕,这些事实上都可以用查询的方式办到。比如 你是经理 如果你想知道属下任务完成了没有 一种方式就是去询问属下,任务完成没有。早上没完成,下午在问。下午没完成第二天再问。。。。一直到完成为止 这种方式就相当于查询的方式,另一种就是然属下完成任务好直接汇报,在下属执行任务的期间你无需去打挠下属,当下属任务完成后就第一时间向你汇报,这种方式就好像中断。
查询方式:缺点就是可能会大量浪费CPU的时间,不断去查询。如果事情不多还好,可是一旦事情多了会明显感到运行速度变慢。
中断方式:可以用在对时间和响应速度有要求的场合。
具体有哪些事件会引起中断 可以看
1,中断控制寄存器INTCON
2,外设中断允许寄存器 PIEX 注 : X可以是1 2 3 4.。。。不同型号的单片机数目不同
3,外设中断标志寄存器 PIRX 注: X可以是1 2 3 4.。。。不同型号的单片机数目不同
INTCON 中断控制寄存器讲解:
1开启或关闭 全体的中断功能(GIE)
2开启或关闭全体外设的中断功能(PEIE)外设就是在外设中断允许/标志寄存器里面所写的设备。
3开启一些中断事件。
PIEX 与 PIRX 是相互对应的如:当把PIE1的TMR1IE设置为1 定时器timr1将开启中断。等到TMR1定时器溢出后,则会在PIR1的TMRIF将为1,并且执行中断程序。
实例讲解:
我们把上一讲的《PIC单片机之定时器》中的实例修改成中断方式 实现 每隔 50MS亮起LED,每隔50MS灭掉LED。
/*开发环境MPLAB X IDE 芯片型号PIC16LF1823*/
#include
__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON
&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);//这个要放到上一行去
__CONFIG(PLLEN_OFF&LVP_OFF) ;
#define LED LATA5
void init_fosc(void)
{
OSCCON= 0x68;
}
void init_gpio(void)
{
PORTA = 0;
LATA = 0;
ANSELA = 0;
TRISAbits.TRISA5=0;
}
void init_timer0(void)
{
OPTION_REG=0x87;
}
void interrupt isr(void)//中断程序,interrupt是个关键字说明该函数,是中断函数。
{
LED = ~LED;//改变LED的状态
INTCONbits.TMR0IF=0;//清零中断标志位 如果在离开中断程序前没有清零,程序将不停的中断。
TMR0=61;//给TMR0付初始值61 ,开始下一个50ms计时做准备。
//中断函数结束 返回主函数。哪里来回 回那里去,也就是回到主函数的while(1);处
}
int main(int argc, char** argv)
{
init_fosc();
init_gpio();
init_timer0();
INTCONbits.GIE=1; //开启总中断
INTCONbits.TMR0IF=0;//清零TMR0溢出中断标志位
INTCONbits.TMR0IE=1;//开启TMR0溢出中断
TMR0=61;
while(1);//主函数 在此什么都没做一直在死循环。但等到50ms时间到了TMR0将会溢出,程序就会跳到void interrupt isr(void)处执行。
}
我帮大家理清下中断初始设置大致的步骤
1 ,开启总中断,开启外设中断。INTCONbits.GIE=1; INTCONbits.PEIE=1;其实即使没用到外设开启也无妨。
2 ,清楚相应中断的标志位。如INTCONbits.TMR0IF=0;
3 ,开启相应中断。如INTCONbits.TMR0IE=1;
中断函数/程序 中要注意的就是 清零相应的中断标志位 如INTCONbits.TMR0IF=0; 否则单片机会认为中断未被执行 则一直中断。