51单片机之中断系统

这次是关于中断的专题啦!

中断源:是指引起中断的原因或者设备。

MCS-51单片机设置了5个中断源,其中内部有3个中断源,包括定时/计数器T0、T1和片内串口,外部有两个中断请求输入,当系统产生中断时,5个中断源的中断请求标志分别由特殊功能寄存器TCONSCON的相应位来锁存。

  • 定时计数器控制器TCON

既能控制定时计数器T0、T1,又能锁存外部中断请求标志和定时计数器T0、T1的溢出中断标志,具有双重功能,相关位的定义如下:

TF0:定时计数器T0溢出标志。

TF1:定时计数器T1溢出标志。

定时计数器T0、T1启动后,当计数产生溢出时,硬件自动置位TF0、TF1标志,并请求中断,CPU响应中断后,这两个标志位既可通过软件清除,也可通过硬件自动清除。

IE1:外部中断1请求标志。

IE0:外部中断0请求标志。

由CPU检测外部中断请求,当输入信号有效触发后,硬件自动置位IE0,IE1标志,并请求中断,CPU响应中断后,这两个标志位被硬件自动清除。

IT0:外部中断0触发方式选择位。

IT1:外部中断1触发方式选择位。

可用程序控制为0或1,当该位为0,外部中断为电平触发方式,即低电平有效;当该位为1,外部中断为边沿触发方式,即下降沿有效。

  • 串行口控制寄存器SCON

既是串行口控制寄存器,当串行口发生中断请求时,SCON低两位又能锁存其发送中断和接收中断,具有双重功能,其相关位的定义如下:

T1:串行口发送中断标志。

当CPU向串行口的发送数据缓冲器SBUF写入一个数据或字符时,发送器就开始发送,当发完一帧数据后,硬件自动置位TI标志,表示串口正在向CPU发送中断请求,请求发送下一帧数据,该标志必须由软件进行清0.

RI:串行口接收中断标志

若串行口接收器允许接收,当接收器接收到一帧数据后,硬件自动置位RI标志,表示串口接收器正在向CPU发送中断请求,使CPU读取接收数据缓冲器中的数据,该标志必须由软件进行清0。

中断系统:单片机中用于管理各类中断的逻辑。

中断的优点:

1、分时操作:中断系统解决了CPU的快速运行与慢速外设、定时计数器及串口之间的“定时”矛盾,这样CPU在运行主程序的同时可以令定时器、串口及其他外设同时工作,当出现中断后,CPU响应中断,停止主程序的运行,转入执行中断服务程序,使CPU高效而有序的工作。

2、实时处理:中断系统使CPU能及时处理实时控制系统中的许多随机参数和信息,它们能在任何时候向CPU发出中断请求,要求转向中断程序,CPU会对变化的现场信息进行及时响应,使CPU具有随机应变和实时处理能力。

3、故障处理:中断系统还可以使CPU处理系统中出现的故障,从而不必进行人工干预或停机,提高了系统的稳定性和可靠性。

  • 中断控制

中断系统的功能主要包括以下几点:
1、中断的打开与关闭:

2、中断响应(有一个中断优先级的问题)

中断优先级:
简单点说就是当同时来了多个中断的时候,CPU必须判断哪些中断的优先级比较高,因为一些中断会导致系统功能无法实现甚至故障,自然优先级就高,CPU必须先处理。

所以我们需要对特殊功能寄存器IE编程,用来选择允许或禁止哪些中断,然后可以通过中断优先级寄存器IP进行编程,定义被允许中断的优先级。

  • IE:设置允许的中断源,相关位如下:

EA: CPU总中断允许位,为0时,禁止所有中断;为1时允许中断。

*ET2:MCS-52系列单片机中T2中断允许位,为0禁止中断;

ES:串行口中断允许位,为0时,禁止串行口中断;

ET1:定时/计数器T1中断允许位,为0时,禁止中断;

EX1: 外部中断1中断允许位,为0时,禁止中断;

ET0: 定时/计数器T0中断允许位,为0时,禁止中断;

EX0:外部中断0中断允许位,为0时,禁止中断。

  • 中断优先级寄存器IP

用于控制不同中断源的优先级的高低,相关位如下:

PT2:定时/计数器T2优先级设定,为0时,T2设定为低优先级;为1时,T2设定为高优先级。

PS:串行口优先级设定,为0时,串行口设定为低优先级;为1时,串行口设定为高优先;

PT1:定时/计数器T1优先级设定,为0时,T1设定为低优先级

PX1:外部中断1优先级设定,为0时,外部中断1设定为低优先级;

PT0:定时/计数器T0优先级设定,为0时,设为低优先级;

PX0:外部中断0优先级设定,为0时,设为低优先级。

  • CPU在响应中断请求时遵循两个原则:

1、对于一个正在执行的低级中断服务程序,可以被高级中断请求所打断,但不能被同等优先级的中断请求所中断。

2、一个正在执行的高级中断服务程序,不能被任何中断请求所中断,只有在执行完此高级中断服务程序后,返回主程序再执行一条指令才能响应新的中断请求。

MCS-51单片机中只设置有两个优先级,必然会出现几个中断源处于同等的优先级状态,当CPU同时接收到几个同等优先级中断请求时,按照内部硬件查询逻辑,按照自然优先顺序来查询,优先顺序由高到低为:外部中断0->定时/计数器0->外部中断1->定时计数器1->串行口->定时计数器2.

  • 中断响应:

51单片机在每个机器周期都顺序查询每一个中断源,若接收到中断请求,将在紧跟着的下一个机器周期执行该中断,但是在遇到一些情况时中断会暂时受阻。

  • 最后扯扯51单片机的外部中断源:

1、外部中断源端口引脚:外部中断0,端口引脚为12(P3^2),引脚符号为INTO^

外部中断1:端口引脚13(P3^3),引脚符号为INT1^

2、外部中断请求方式:负边沿触发,使控制位IT0=1即可;

低电平触发,使控制位IT1=0即可

  • 51单片机外部中断源应用步骤

1、设置外部中断请求允许位,设置IE寄存器中的EAEX1EX0

2、选择合适的外部中断请求触发方式,设置TCON寄存器中的IT1IT0

3、编写中断服务函数,函数格式为:

返回值  函数名([参数]interrupt n [using m]

#include 
typedef unsigned int u16;
typedef unsigned char u8;
sbit key = P3^2;
sbit led = P1^0;

void delay(u16 num)
{
    u16 x ,y;
    for(x=num; x>0; --x)
        for(y=110; y>0; --y)
        {
            ;    // 延时1ms
        }
}

int main(void)
{
    TCON |= 0x01;    //设置外部中断0触发方式为边沿触发方式
    IE = 0X81;    //开放总中断并且外部中断0允许中断
    while(1)
    {
        ;
    }
}

void ext_int0(void) interrupt 0
{
    delay(10);
    if(key == 0)
    {
        led =~led;
    }
    while(!key);
}

 

 

 

 

 

你可能感兴趣的:(嵌入式)