历史上的今天
返回首页

历史上的今天

今天是:2025年02月05日(星期三)

正在发生

2020年02月05日 | PIC单片机中断程序实例

2020-02-05 来源:eefocus

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; 否则单片机会认为中断未被执行 则一直中断。

推荐阅读

史海拾趣

High Voltage Semiconductor Inc公司的发展小趣事

进入21世纪,美高测持续加大在技术研发上的投入,成功研发出具有自主知识产权的VLF(超低频)测试技术,并应用于变电站设备、中高压电力电缆等关键领域的测试。这项技术不仅提高了测试的准确性和效率,还降低了操作风险,迅速获得了市场的广泛认可。公司借此机会,在全球范围内建立了多个销售和服务中心,进一步巩固了其在高压半导体测试市场的领先地位。

C&K Switches公司的发展小趣事

C&K Switches公司一直致力于技术创新和研发。它不断投入资金和资源,研发出了一系列具有高性能和可靠性的开关产品。这些产品不仅提高了设备的运行效率和稳定性,还降低了故障率和维修成本。同时,C&K还积极与合作伙伴和客户进行技术交流和合作,共同推动电子行业的发展。这种技术突破和创新精神使得C&K在激烈的市场竞争中保持领先地位。

Chemi-Con公司的发展小趣事

随着电子行业的快速发展,Chemi-Con公司不断加大对研发的投入,致力于技术创新和产品升级。公司研发团队在铝电解电容器的基础上,不断推出性能更优、体积更小、寿命更长的产品,满足了市场对于高效、可靠电容器的迫切需求。此外,Chemi-Con还积极拓展产品线,涉足了多层陶瓷电容器、薄膜电容器等多个领域,为客户提供更加丰富的选择。

EMC Component Group公司的发展小趣事

Chemi-Con公司的历史可以追溯到XXXX年,当时铝电解电容器在日本首次成功实现产品化。这不仅是电子行业的一个里程碑,也是Chemi-Con公司传奇故事的起点。公司创始人凭借对技术的深刻理解和市场的前瞻性,敏锐地捕捉到了铝电解电容器的巨大潜力,并决定将其作为公司的主营业务。在创业初期,Chemi-Con面临着资金、技术和市场等多方面的挑战,但创始人凭借着坚定的信念和不懈的努力,带领公司逐步攻克难关,奠定了在铝电解电容器领域的领先地位。

Bipolarics Inc公司的发展小趣事

随着国内市场的饱和,Bipolarics Inc开始将目光投向国际市场。公司制定了一套完善的国际化战略,包括在海外市场建立销售团队、设立研发中心和生产基地等。通过不断努力,Bipolarics Inc的产品逐渐打入了欧洲、北美等发达地区的市场,并获得了良好的口碑。公司的国际化战略不仅拓展了市场空间,也提升了公司的品牌影响力和国际竞争力。

安森德(Ascend)公司的发展小趣事

随着产品技术的成熟,安森德公司开始积极拓展市场。公司凭借优质的产品和服务,成功进入工业电源、电机驱动、消费电子等多个领域。同时,安森德积极寻求与全球顶尖企业的战略合作,通过与这些企业的技术交流和业务合作,不断提升自身的技术水平和市场竞争力。这些合作不仅为安森德带来了更多的商业机会,也进一步提升了公司在行业内的知名度和影响力。

问答坊 | AI 解惑

模拟数字考试不难(暮森的模拟电路串讲,原创

模拟数字考试不难(暮森的模拟电路串讲,原创) 作者:暮森 (转自:www.ezikao.com.cn,如果联系我请到易自考“模拟电路”版块) 对于模拟电路大家都觉得比较难,确实模拟电路数字电路在计算机专业中的学分比重比较大,内容比较多,理解起来比 ...…

查看全部问答>

线性光耦HCNR201的误差问题

我用HCNR201隔离模拟电压有0.6V左右的误差,不知怎么回事请各位看一下…

查看全部问答>

PIC16系列单片机与PC机串行通信的软硬件实现

摘 要: 介绍一种运用 PIC16F84单片机实现与PC机串行通信的方法,并给出其硬件接口电路及通信源程序。 1 前言 美国 Microchip 公司的 PIC16 系列单片机是一种新型的 CMOS 工艺的 8 位单片机。其中, PIC16FXX 单片机的程序存储器为电可擦除闪速存 ...…

查看全部问答>

dxp 2004 指导教程

为方便同行们设计,现贡献资料DXP20047指导教程,只需1枚金币,因为我也需要下载其他的资料,不然肯定免费,望理解和支持。 点击下载:…

查看全部问答>

【求助】请教一个最最简单的关于PIC12C508单片机如何使用的问题……

由于最近要试着用PIC12C508单片机做点东西,就在mplab上先仿真玩玩。这才发现自己居然连最最基本的“点灯一个led灯”都完成不了…… 还请坛子里的老鸟们指教一下,这对于你们来说可能就是几秒钟的事情,而我却卡在这里大半天了……  &nbs ...…

查看全部问答>

以下信息如何看呀

appverifce.exe 产生log. avlogview.exe 看log, 怎么看不出来有问题的函数? 以下信息如何看呀: Invalid pointer (ole32.dll:404CA33C) lpUserMem: 0x00000000 (ole32.dll:404CA1F0) lpUserMem: 0x00000000 (message.exe:000197EC) lpUserMem ...…

查看全部问答>

编写简单的IP协议栈

最近要在ARM平台上实现一个网络IP数据包加密的程序,但是现有的系统没有网络协议栈,而我有不想移植一个完整的TCP/IP协议栈(其实移植困难也很大,因为系统是我们团队自己实现的嵌入式最简系统),完整的协议栈很多部分对我们的这次应用来说是多余 ...…

查看全部问答>

进阶高级--Protel 99sePCB与SCH比较

本人从事PCB设计三年,现在转做业务,希望能在这里面认识 一些朋友 ,QQ520122524   SKYPE  :xcq185388740     MSN:xcq185388740 @live.cn    提供点资料给你们 [ 本帖最后由 xcq185388740 于 2011-7-14 11:17 ...…

查看全部问答>

有关bootloader制作的问题

我在做booloader加入sb.xcl文件之后出现了Fatal Error[e72]: Segment IEEE_ADDRESS_SPACE must be defined in a segment definition option (-Z, -b or -P) 错误请问这个是什么原因呢? [ 本帖最后由 wateras1 于 2013-2-25 15:10 编辑 ]…

查看全部问答>