任务34中断的原理及实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任务3.4 中断的概念和应用
3.4.1 任务介绍
中断和定时器是单片机中最重要的资源之一,中断功能的存在很大程度上提高了单片机处理外部或者内部事件的能力。什么是中断,我们从一个生活中的例程引入。你正在家中看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来继续看你的书。这就是生活中的“中断”的现象,就是正常的工作过程被突如其来的事件打断了。
本节的任务是:
单片机外接两个两个发光二极管和一个按键,,其中一个发光二极管以0.5Hz的频率闪烁,另外一个发光二极管,按键每按下一次改变一下状态,按键用采用外部中断的方式。3.4.2知识准备
1、中断的基本概念
(1)单片机中为什么需要中断
我们先根据之前学过的知识试着编写一下任务要求的程序,程序如下:
//......省略了程序开头部分
while(1)
{
LED1=1; //LED1灭
DelayMs(1000); //延时1000ms
LED1=0; //LED1亮
DelayMs(1000); //延时1000ms
if(KeyInput==0) //检测按键是否按下
{
DelayMs(10); //10ms延时消抖
if(KeyInput==0) //再次判断按键是否按下
{
LED2=!LED2; //按键按下,LED2状态取反
while(!KeyInput); //等待按键弹起
}
}
}
烧录到单片机后,我们发现程序运行的效果并非和我们想象中的一样,如果按键不按下,LED1闪烁正常,按键按下,LED1不再闪烁,直到按键弹起。LED2也并非是每次按键按下都改变状态,按键有的时候没有检测到。我们先来分析一下按键为什么没有检测到的原因。
主程序中有两个任务,任务1:LED1以2Hz频率闪烁,任务2:按键按下LED2状态取反。这两个任务在大循环中顺序运行,即任务1执行完后,才能执行任务2。LED1闪烁一次需要2000ms(亮1000ms+灭1000ms),按键按下到弹起来大约需要200ms-500ms左右。如果程序刚开始执行任务1,这个时候按键也按下了,那么按键所对应的任务2必须等待任务1执行完了,才能执行。任务1执行完了,2000ms过后,再扫描按键,按键早就释放了,本次按键无效。
我们的生活中也会遇到这样的问题,以接电话为例。你正在看着书,如果没有别的事情会一直看下去,这个时候电话响了,如果我们按照程序的思路,任务1执行完了,才能执行任务2,那么我们只有把书看完了,才能去接电话,这显然是不合理的。
我们把所有需要处理的事件都放到大循环while(1)中去一个个的执行的方式是行不通的,一些紧急的事件必须立即处理,不能等待。中断就具有处理紧急事件的能力。
(2)中断的响应过程
正在看书,这是电话铃响了,在接电话之前,我们要把正在看的那一页书做个标记,接完电话后后我们按照之前的标记继续看书。单片机响应中断的过程和看书接电话的过程类似。中断事件产生后,首先要保存当前执行程序的地址,然后再去执行中断函数,中断函数执行完后,再从保存的地址处开始执行程序。
(3)中断的种类
传统的8051单片机一共有5个中断源(DIP封装的STC89C52有6个中断),它们的符号、名称和产生的条件分别解释如下:
①:INT0:外部中断0,由P32端口引入,低电平或下降沿引起。
②:INT1:外部中断1,由P33端口引入,低电平或下降沿引起。
③:T0:定时/计数器0中断,由定时/计数器0溢出引起。
④:T1:定时/计数器1中断,由定时/计数器1溢出引起。
⑤:TI/RI:串行口中断,由串行口发送或者接受一帧数据引起。
本节当中我们只关注两个外部中断,定时器和串口的中断在后面的章节会详细介绍。
(4)中断优先级和嵌套
在某些时刻,2个或者更多个中断同时到来,单片机应该响应哪一个中断呢?设想一下,你正在看书,电话铃响了,同时又有人按了门铃,你该先做那样呢?如果你正在等一个很重要的电话,你一般不会去理会门铃的,而反之,你正在等一个重要的客人,则可能就不会去理电话了。总之这里存在一个优先级的问题,单片机的5个中断也有优先级,即两个以上的
中断同时触发,CPU先响应哪一个。
另外还可能存在这样一种情况,你正在看书,电话铃响了,去接电话,在接电话的过程当中,这时又有人按门铃,我们的做法是先暂停通话,打开门,然后再接听电话,接听电话完后再继续看书。一个正在执行的中断任务被另外一个级别更高的中断任务打断,称之为中断的嵌套。
51单片机的优先级有两大类:高优先级和低优先级,如果不对优先级做任何的设置,系统默认的是低优先级。在同类优先级中,也有一个先后顺序,称为自然优先级。在51单片机中自然优先级的顺序为,外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串口。在同类优先级中,当同时有几个中断到达,自然优先级高的中断会先得到响应,但不能实现中断的嵌套,例如,定时/计数器0和外中断0同为低优先级,当它们同时到来时,由于外部中断0 > 定时/计数器0,系统先进入到外部中断0的程序,然后再执行定时/计数器0的中断程序。
要想实现中断的嵌套,中断A能打断中断B的执行,则中断A和中断B不能在同一类型优先级中,中断A应设置为高优先级,中断B设置为低优先级。例如:串口中断在同类优先级中的排位是最低的,但如果把串口中断设置为高优先级,而其他中断设为低优先级,,则串口中断不仅可以在两个中断到来时优先执行,而且可以在别的中断正在运行时,打断别的中断转而执行串口中断。
2、中断的寄存器配置
51单片机中断系统框图可用图3.4.1来表示。
图3.4.1 51单片机中断系统框图