学习笔记之-51单片机中断

来源:互联网 发布:租车app源码 编辑:程序博客网 时间:2024/05/29 16:59

1.中断的概念

  通俗的讲,中断就是cup正在工作的时候,突然外部来了某一请求,要求cpu转去处理请求的事件,当事情做完之后cup再回来继续它的工作。这一过程称为中断 。
单片机中断响应可以分为以下几个步骤:
1、停止主程序运行。当前指令执行完后立即终止现行程序的运行;
2、保护断点。把程序计数器PC 的当前值压入堆栈,保存终止的地址(即断点地址),以便从中断服务程序返回时能继续执行该程序;
3、寻找中断入口;
4、执行中断处理程序;
5、中断返回。执行完中断处理程序后,就从中断处返回到主程序,继续往下执行。
  流程图如下:
  这里写图片描述
  
中断技术不仅解决了快速主机与慢速I/O设备的数据传送问题,而且还具有如下优点:
分时操作:CPU可以分时为多个I/O设备服务,提高了计算机的利用率;
实时响应:CPU能够及时处理应用系统的随机事件,系统的实时性大大增强;
可靠性高:CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。

2.51单片机中断详解

中断
上图是80C51单片机中断系统的结构,从图中可以看到80C51的中断系统有5个中断源(补充:8052有 6个) ,分别是: 外部中断0/1(P3.2,P3.3),内部中断(定时计数器中断)0/1(P3.4,P3.5),串口中断(这一节先不讨论)
先介绍几个和中断相关的寄存器:

  • TCON
    这里写图片描述
    TF1:定时器T1溢出标志,可由程序查询和清零,TF1也是中断请求源,当CPU响应T1中断时由硬件清零。
    TF0:定时器T0溢出标志,可由程序查询和清零,TF0也是中断请求源,当CPU响应T0中断时由硬件清零。
    TR1:T1充许计数控制位,为1时充许T1计数(定时)。
    TR0:T0充许计数控制位,为1时充许T0计数(定时)。
    IE1:外部中断1请示源(INT1,P3.3)标志。IE1=1,外部中断1正在向CPU请求中断,当CPU响应该中断时由硬件清“0”。
    IT1:外部中断源1触发方式控制位。为1设置为底电平触发,为0设置为下降沿触发。
    IE0:外部中断0请示源(INT0,P3.2)标志。IE0=1,外部中断1正在向CPU请求中断,当CPU响应该中断时由硬件清“0”。
    IT0:外部中断源0触发方式控制位。为1设置为底电平触发,为0设置为下降沿触发。

高四位是控制内部中断(定时计数器)的,底四位是控制外部中断的,从中断结构图可以知道,外部中断有两种触发方式,IT0或者IT1为外部中断源触发方式控制位,此位为1设置为电平触发,为0设置为下降沿触发。TF0,TF1,IE0,IE1这四个位都是中断标志位,不需要设置的。

  • 中断允许寄存器IE:

ie

顾名思义,中断允许寄存器就是控制中断是否打开,注意EA总中断,使用任何中断这个位都要置一,当EA=0时,所有中断都将关闭。

  • 中断优先级寄存器:
    ip

80C51单片机有两个中断优先级,即可实现二级中断服务嵌套。51单片机中自然的优先级为:
这里写图片描述
从中断系统结构图中可以看到,中断优先级分为两级,每一级都是按照自然优先级排列,这样说应该可以理解吧。IP这个寄存器默认值为xx000000b,所有的中断都处在同一级,它就按照自然优先级进行响应。假设我们想人为的把串口的优先级设置为最高,那我们就可以在IP寄存器的PS位写一,这样,串口就被设置为更高一级,它的优先级是最高的。

这样,和单片机外部中断的几个寄存器都讲完了,定时器和串口的中断会分开阐述的。这里重点理解外部中断。

3.中断服务程序

  上面讲中断过程中我们知道,那5个过程都是由计算机自动完成的,与我们无关,我们的工作只是在这5 个入口地址处存放有中断处理的程序,那么怎么具体写中断服务程序呢?
格式:
     void function(void) interrupt x using y
x=0 是外部中断0;
x=1 是定时器中断0;
x=2 是外部中断1;
x=3 是定时器中断1;
x=4 是串行口中断;
y只能取以下值,一般我们是不用后面的using的
y=0 是第0组寄存器;
y=1 是第1组寄存器;
y=2 是第2组寄存器;
y=3 是第3组寄存器;

4.实例:外部中断

protues环境下硬件搭建
123
实现一个外部中断的步骤:
1.设置外部中断源触发方式控制位,为1设置为电平触发。
2.开总中断
3.开外部中断0

#include<reg51.h>sbit led=P1^0;sbit s=P3^2;void main(){ IT0=1; //1.设置外部中断源触发方式控制位,为1设置为电平触发。 EA=1;  //2.开总中断 EX0=1; //3.开外部中断0while(1){}}void exterfunction(void) interrupt 0 using 1{ led=~led;}
0 0
原创粉丝点击