×
单片机 > 单片机程序设计 > 详情

PIC单片机中断程序实例

发布时间:2020-09-03 发布时间:
|

PIC单片机中断程序实例

什么是中断程序呢?


形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章。烤地瓜这件事就好比中断程序,他中断了你看文章这件事。在程序方面来说 当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; 否则单片机会认为中断未被执行 则一直中断。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码