《单片机中断应用.ppt》由会员分享,可在线阅读,更多相关《单片机中断应用.ppt(35页珍藏版)》请在课桌文档上搜索。
1、第5章 单片机中断应用,5.1 中断的概念 5.2 中断控制 5.3 单片机中断处理过程 5.4 中断系统C51语言编程要点,本章内容:,【任务导入】数码管加减数的实现:用C51编程,使外部中断每发生一次,在共阴极数码管上显示一个数字,且每中断一次显示的数值加1或减1(根据按下的是“加1键”还是“减1键”而定)。要求:按键有消除抖动功能。,【任务分析】本任务的要求是:每发生一次中断,数码管数值加1或减1。加1和减1是两种不同的任务,在软件里面体现为两个程序。那么什么时候数码管数值加1,什么时候又减1呢?在进行设计之前,需要补充下面有关51单片机中断系统的知识。,5.1 中断的概念,所谓中断,是
2、指CPU执行正常程序时,系统中出现特殊请求码,CPU需要暂时中止当前的程序,转去处理更紧急的任务程序,处理完毕后,CPU再返回原程序被中止的地方继续执行原程序的过程。日常生活中也常发生“中断”现象。比如某人正在看书,有电话铃响,决定接电话,做书签标记,起身接电话,接完电话再从刚才做标记的页码继续读书。,5.2 中断控制,89C51系列单片机的中断系统结构框图如图所示,由5个中断请求源INT0、T0、INT1、T1、TI/RI,中断请求标志寄存器TCON,中断允许控制寄存器IE,中断优先级寄存器IP和查询硬件等组成。通过对各种寄存器的读/写来控制单片机的中断类型、中断开/关和中断源的优先级。,当
3、有中断源发出请求时,由硬件将相应的中断标志位置1。在中断请求被响应前,相应的中断请求标志位被锁存在特殊功能寄存器TCON和SCON中。外部中断源有外部中断和外部中断,经由外部引脚P3.2、P3.3引入。在特殊功能寄存器TCON中有4位与外部中断有关的位和4位与定时/计数器有关的位,如表5-1所示。,1.中断请求标志寄存器TCON,表5-1 TCON寄存器结构,(1)IT0(IT1):外部中断0(或1)触发方式控制位,可由软件进行置位和复位。IT0(或IT1)=0时,外部中断为低电平触发方式;IT0(或IT1)=1时,外部中断为边沿触发方式。(2)IE0(IE1):外部中断0(或1)中断请求标志
4、位。在电平触发方式时,CPU在每个机器周期的S5P2时刻采样P3.2(或P3.3)引脚的电平,若引脚为高电平,则IE0(或IE1)清零,若引脚为低电平,则IE0(或IE1)置1,向CPU提出中断请求;在边沿触发方式时,若第一个机器周期采样到引脚为高电平,第二个机器周期采样到引脚为低电平时,将IE0或IE1置1,向CPU提出中断请求。在边沿触发方式时,CPU在每个机器周期都采样P3.2(或P3.3)。为了保证检测到下降沿,P3.2(或P3.3)引脚的高电平与低电平至少应该保持1个机器周期。(3)TR0(TR1):定时/计数器T0或T1的启动/停止控制位。当置1时启动定时/计数器,清零时停止定时或
5、计数。(4)TF0(TF1):定时/计数器T0(或T1)的溢出中断请求标志位。当定时时间到或计数值满时由硬件置位TF0(或TF1)。当CPU响应中断后,再由硬件将该位清零。,89C51系列单片机的5个中断源有6个中断请求标志位,其中4个与外部中断和定时/计数器有关的都属于TCON寄存器,另外2个与串行口中断有关的属于串行口控制寄存器SCON。SCON的D7D2位在第7章中会有详细讲解,本小节只介绍与中断源有关的位,如表5-2所示。,2.串行口控制寄存器SCON,表5-2 SCON寄存器结构,(1)TI:发送中断请求标志位。(2)RI:接收中断请求标志位。无论哪个标志位置1,都请求串行口中断。到
6、底是发送中断TI,还是接收中断RI,只有在中断服务程序中通过指令查询来判断。串行口中断响应后,TI或RI不能由硬件清零,因此都需要软件清零。,89C51单片机中没有专门的开中断和关中断指令,对各个中断源的允许和屏蔽是由内部的中断允许控制寄存器IE的各位来控制的。中断允许控制寄存器IE的字节地址为A8H,可以进行位寻址,各位定义如表5-3所示。,3中断允许控制寄存器IE,表5-3 中断允许寄存器IE,(1)EA:中断允许总控制位。EA=0,屏蔽所有的中断请求;EA=1,开放中断。EA的作用是使中断允许形成两级控制,即各中断源首先受EA位的控制,其次还要受各中断源自己的中断允许位控制。(2)ES:
7、串行口中断控制位。ES=1,允许串行口中断;ES=0,屏蔽串行口中断。,(3)ET1:定时/计数器T1溢出中断允许控制位。ET1=1,允许T1中断;ET1=0,禁止T1中断。(4)EX1:外部中断1中断允许控制位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。(5)ET0:定时/计数器T0溢出中断允许控制位。ET0=1,允许T0中断;ET0=0,禁止T0中断。(6)EX0:外部中断0中断允许控制位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。例如,要设置允许外部中断0和定时/计数器T1中断允许,其他中断不允许,则IE的值如表5-4所示,即IE=89H。,表
8、5-4 IE=89H,89C51单片机采用了自然优先级和人工设置高、低优先级的策略。当CPU处理低优先级中断,又发生更高级中断时,可由软件设置每个中断源的优先级别,实现二级中断嵌套,中断过程如图所示。,4中断优先级寄存器IP,上电时,中断优先级寄存器IP被清零,每个中断源都处于同一个优先级,这时若其中几个中断同时产生中断请求,CPU通过内部硬件查询逻辑按自然优先级顺序确定该响应哪个中断请求。其自然优先级由硬件形成,如表5-5所示。,表5-5 51单片机中断级别,在某些特殊情况下,如果希望每个中断源有更高的优先级,则可以通过程序人工地设置高、低优先级。中断优先级由中断优先级寄存器IP来设置,如表
9、5-6所示。,表5-6 中断优先级寄存器IP,(1)PS:串行口中断优先级控制位。PS=1,声明串行口中断为高优先级中断;PS=0,声明串行口中断为低优先级中断。(2)PT1:定时/计数器T1优先级控制位。PT1=1,声明定时/计数器T1为高优先级中断;PT1=0,声明定时/计数器T1为低优先级中断。(3)PX1:外部中断1优先级控制位。PX1=1,声明外部中断1为高优先级中断;PX1=0,声明外部中断1为低优先级中断。(4)PT0:定时/计数器T0优先级控制位。PT0=1,声明定时/计数器0为高优先级中断;PT0=0,声明定时/计数器0为低优先级中断(5)PX0:外部中断T0优先级控制位。P
10、X0=1,声明外部中断T0为高优先级中断;PX0=0,声明外部中断T0为低优先级中断。在同一个优先级下,中断响应按照自然优先级顺序进行。,例如,5个中断源同时请求中断响应,CPU响应的顺序为:定时/计数器T0外部中断1外部中断0定时/计数器T1串行口中断。则IP各位的设置如表5-7所示,即IP=06H。,表5-7 IP=06H,表5-8 89C51系列单片机中断系统的主要信息,CPU都会去查询各个中断标记,看它们是否是“1”,如果是“1”,说明有中断请求。所以所谓中断,也是在查询,不过是在每个机器周期都查一下而已,并且此查询过程是由单片机的CPU完成的,而不是通过程序来完成的。了解了中断的过程
11、就不难了解中断响应的条件了,但是遇到下列三种情况之一时,CPU将封锁对中断的响应。(1)CPU正在处理一个同级或更高级别的中断请求。(2)当前正在执行的指令还没有执行完。(3)当前正在执行的指令是RETI或访问IP、IE寄存器的指令,则CPU至少再执行一条指令才能响应中断。,5.3 单片机中断处理过程,1中断响应的条件,具体地说,中断响应可以分为以下几个步骤。(1)自动清除中断请求标志(对串行口的中断标志要用软件清除),然后保护断点,保存下一个将要执行指令的地址,即把这个地址送入堆栈。(2)寻找中断入口,根据5个不同的中断源所产生的中断,查找5个不同的入口地址,即将5个中断入口的地址装入寄存器
12、PC中(PC是程序指针,CPU取指令就是根据PC中的值去取,如果PC中装入了中断入口的地址,程序就会转到中断入口处执行)。以上工作是由单片机自动完成的,与编程者无关。一般在5个中断入口地址处存放有跳转到对应中断服务程序的跳转指令。(3)执行中断处理程序。(4)中断返回。执行完中断指令后,就从中断处返回到主程序,继续执行。,2中断响应过程,各中断源的中断服务程序入口地址如下。外部中断0:0003H。定时/计数器T0:000BH。外部中断1:0013H。定时/计数器T1:001BH。串行口:0023H。可见,每个中断向量地址只间隔了8个单元,如0003H000BH。一般情况下,如此小的空间无法完成
13、中断程序,那么中断服务程序就不能放在这里,在汇编语言程序中要通过AJMP或是LJMP等跳转指令把中断服务程序安排到适合它的空间去。,一个完整的主程序的轮廓如下:汇编语言:ORG 0000HAJMP STARTORG 0003HAJMP INT0;跳到外中断0的服务子程序处执行ORG 000BHORG 0030HSTART:INT0:RETIC语言:main()主程序内容/*中断程序入口,“using 工作组”可以忽略*/void 函数名()interrupt 中断序号 using 工作组 中断服务内容 在汇编语言中如此设计的目的就是让出中断源的入口地址,在C语言中就不需要自己编写,而是由C51
14、编译器自己完成。所以,C语言程序相对汇编语言程序来说简单易懂。,为了能在C51语言编写的源程序中直接编写中断服务函数,C51编译器对函数的定义有所扩展,增加了一个关键字interrupt。在C51中,中断程序的设计要点如下。(1)在主函数中,设置相关中断允许和优先级。(2)中断函数用关键字interrupt进行定义,格式如下:返回值 中断函数名()interrupt 中断号 using 寄存器组号 中断号取值为04,不同值与中断源的对应关系如表5-9所示。寄存器组号取值为03,对应着4组工作寄存器。,5.4 中断系统C51语言编程要点,表5-9 中断号与中断源的对应关系,例如,单片机P1.0引
15、脚接发光二极管,此发光二极管随P3.2引脚脉冲亮灭变化,电路如图5-5所示。,用C51编写的源程序如下。#include sbit P1_0=P10;void INT_0()interrupt 0 using2/外部中断0 中断服务 P1_0=!P1_0;void main()IT0=1;/设定外部中断0下降沿触发 EX0=1;/外部中断0打开 EA=1;/开中断总开关 P1_0=0;while(1);,【任务实施】1)设计方案任务要求每按下一次“加1键”(或“减1键”)按键数码管显示的数值加1或减1,因此可以选用两个外部中断分别作为“加1键”和“减1键”信号的输入端。每次给外部中断0信号输入
16、引脚一个低电平,即发生一次外部中断0事件,这时程序从主程序跳到外部中断0的中断程序,完成给一个变量加1,并显示当前数值到数码管;每次给外部中断1信号输入引脚一个低电平,即发生一次外部中断1事件,这时程序从主程序跳到外部中断1的中断程序,完成给一个变量减1,并显示当前数值到数码管。选用P0口做输出口驱动共阴极数码管,为了提高输出电平,需要给P0口接上拉电阻。,2)硬件电路实现 硬件原理图如图5-6所示。晶振和复位电路略。,3)系统程序实现(1)程序分析 在实际电路中按键难免出现抖动现象,本例采用延时20ms来消抖。观察后面第4部分源程序可发现,中断程序void INT_0没有在主程序main()
17、中调用,而且后面还多了interrupt 0,那么为什么C语言中每个子程序必须在main()被调用才能生效,而在这里不被调用也能生效呢?其实这是Keil C在C语言上的扩展,如果Keil C的中断服务程序和C语言一样,需要在主程序main()中调用,那么它应该放在什么位置呢?因为中断的发生是我们无法预知的,在编写程序时也就不能预测中断发生的时间。Keil C中程序根据interrupt来判断该函数是中断程序,根据interrupt后面的序号来判断该中断的类型。只要有中断发生,并且CPU允许响应,程序就会自动跳出主程序执行中断服务程序;执行完中断服务程序后,程序才回到主程序刚才跳出的地方,继续向
18、下执行未完成的主程序。,(2)程序流程图 主程序流程图如图5-7所示。主程序主要完成输出口和中断的初始化任务。按键的响应并不是CPU主动查询到的,而是中断一旦发生会主动向CPU提出中断请求,从而被响应。,(3)中断服务程序流程图 中断服务程序流程图如图5-8所示。中断服务程序主要完成与按键有关的任务,即按下“加1键”显示数值加1,按下“减1键”显示数值减1。当中断发生后,CPU若响应了中断请求,则自动转入外部中断0或外部中断1的中断服务程序入口地址处寻找中断处理程序。CPU可以实时处理紧急事件且有更多的时间处理主程序,提高了工作效率。,(4)源程序,/*必要的变量定义*/#include#de
19、fine unit unsigned int#define uchar unsigned charuchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;/共阴极数码管“09”编码表uchar m=0;/*延时函数*/void delay(uchar c)unsigned char a,b;for(;c0;c-)for(b=142;b0;b-)for(a=2;a0;a-);,/*外部中断0子程序*/void INT_0()interrupt 0 EX0=0;delay(20);EX0=1;if(m
20、=10)m=0;else P0=tablem+;/*外部中断1子程序*/void INT_1()interrupt 2 EX1=0;delay(20);EX1=1;if(m=0)m=10;else P0=table-m;,/*主程序*/void main()P0=0 x00;EA=1;EX0=1;IT0=1;/外部中断0采用边沿触发EX1=1;IT1=1;/外部中断1采用边沿触发while(1);,【拓展训练:实时报警系统的实现】1)功能要求 利用所学的中断系统知识设计一个实时报警系统,要求有声音和灯光报警提示。2)硬件电路实现 实时报警系统硬件电路如图5-9所示,按下按键系统可开启灯光及声音
21、报警,其中8个LED中相邻的3个旋转滚动显示,再次按下按键时可停止声光报警。3)系统程序实现 本例同时用了3个中断:外部中断0、T0中断和T1中断。它们分别负责按键控制、声音控制与LED控制,其中外部中断0被设为高优先级,且控制T0和T1定时器的启/停。有关T0和T1部分的程序可在第6章中学习。,T0工作在方式1,TH0固定取值为0 xFE(即TH0=254),TL0则从0 x00至0 xFF(0至255)反复循环取值,这样可生成的频率范围计算如下。(1)延时计数寄存器取值范围为254256+0254256+255(即65 02465 279)。(2)延时值为65 53665 024与65 5
22、3665 279(即512257)。(3)输出频率为1000 000/(5122)1000 000/(2572)Hz(即9761945Hz)。正是因为主程序中的while循环控制FRQ变量由0 x00持续递增,由于FRQ类型为uchar,因此会在0 x000 xFF范围内反复循环取值,而T0中断程序内的TL0则持续获取这个变化的FRQ值,这使T0中断的触发频率也会递增,于是形成了频率在9761945Hz之间平滑递增的声音效果,实现的报警声音非常逼真。读者可修改程序中while循环内delays函数参数值及TH0初值,查看不同的效果。源程序代码如下。,/*实时报警系统*/#include#inc
23、lude#define uchar unsigned char#define uint unsigned intsbit sounder=P37;uchar FRQ=0 x00;/*延时子程序*/void delayms(uint ms)uchar i;while(ms-)for(i=0;i120;i+);,/*主程序*/void main()P2=0 x00;TMOD=0 x11;TH0=0 x00;TL0=0 xFF;IT0=1;IE=0 x8B;IP=0 x01;TR0=0;TR1=0;while(1)FRQ+;delayms(1);,/*外部中断0程序*/void EX0_INT()interrupt 0 TR0=!TR0;TR1=!TR1;if(P2=0 x00)P2=0 xe0;else P2=0 x00;/*定时器T0程序*/void T0_INT()interrupt 1 TH0=0 xFE;TL0=FRQ;sounder=sounder;/*定时器T1程序*/void T1_INT()interrupt 3 TH1=45000/256;TL1=45000%256;P2=_crol_(P2,1);,小 结,本章通过引入实现数码管显示数值加1或减1的任务,介绍了51系列单片机中断系统的结构,以及与中断系统有关的特殊功能寄存器,并提出了训练任务供读者进行拓展训练。,
链接地址:https://www.desk33.com/p-246745.html