中断系统
主程序遇中断请求后,执行中断请求处理程序,完成后继续执行主程序。
51里有5个中断源。2个优先级,可以实现二级中断的嵌套。51中断系统结构图。
从上图可以看出中断优先级顺序:外部中断0、定时器中断0、外部中断1、定时器中断1、串口中断。
1. INT0外部中断0由P3.2引入,低电平或者下降沿触发。中断号0
2. INT1外部中断1由P3.3引入,低电平或者下降沿触发。中断号2
3. T0定时器/计数器0中断,由T0计数器计满回零触发。中断号1
4. T1定时器/计数器1中断,由T1计数器计满回零触发。中断号3
5. T1/R1串行口完成一帧字符发送或接收后引发此中断。中断号4
51单片机的IT0位是控制外部中断0的触发方式的,如果IT0设置为0,则外部中断0引脚被拉至低电平即可引发外部中断;如果IT0设置为1,则外部中断0引脚需要检测到下降沿才能引发外部中断。(外部中断1同理IT1)。
下降沿触发指中断允许后,只要中断引脚的信号出现下降沿,就触发中断,使用时注意,如果信号出现抖动,会导致多次触发中断。
低电平出发是指中断允许后,只要中断引脚的信号是低电平,就触发中断,使用时注意,如果低电平一直保持,会导致多次触发中断。
EX0是外部中断0的使能控制位,如果EX0设置为0,则外部中断0失效,无论外部中断引脚如何变化,都不会发生外部中断。
TMOD
开中断
void init()//开外部中断0,中断号0
{
EA=1;//开全局中断
EX0=1;//允许外部中断0
IT0=1;//下降沿引发外部中断
}
void init()//开外部中断1,中断号2
{
EA=1;
EX1=1;//允许外部中断1
IT1=1;//下降沿引发外部中断
}
void init()//开定时器T0
{
TMOD=0X01;
//TH0=0;TL0=1;
EA=1;
ET0=1; //允许定时器中断T0中断
TR0=1; //开T0中断
}
void init()//开定时器T1
{
TMOD=0X10;
//TH1=0;TL1=1;
EA=1;
ET1=1; //允许定时器中断T0中断
TR1=1; //开T0中断
}
开中断实例
void init()
{
EA = 1; //开全局中断
EX0 = 1;//INT0中断允许
IT0 = 1;//触发方式为下降沿触发
EX1 = 1;//INT0中断允许
IT1 = 1;//触发方式为下降沿触发
TMOD = 0x19; //选工作方式
// TH0 = 0x4C; //给定初值,循环20次为一秒
// TL0 = 0x00;
TH1 = 0xff; //给定初值
TL1 = 0x00;
// ET0 = 1; //定时器中断打开(优先级0低)
ET1 = 1;
// TR0 = 1; //T0开关打开
TR1 = 1; //T1定时器开关关闭
}
例子(按键通过中断0控制灯亮灭)
按键口连接P3.2/INT0口,IT0=1改为IT0=0后,改为低电平触发,按下按钮后一直保持低电平,则小灯一直亮着。直到再按一次按钮。参照中断图。
include <reg51.h>
sbit LED=P0^0;
void main()
{
LED=0;/*初始灯不亮*/
EA=1;/*开全局中断*/
EX0=1;/*允许INT0中断*/
IT0=1;/*设置外部中断触发方式:下降沿触发
思考:如果修改为:低电平触发呢?*/
while(1); /*等待中断*/
}
void EX_INT0() interrupt 0 /*INT0中断服务程序*/
{
LED=~LED; //控制LED亮灭
}
中断寄存器
- 中断允许控制寄存器IE
- 定时器控制寄存器TCON
- 串口控制寄存器SCON
- 中断优先控制寄存器IP
- 定时器工作方式控制寄存器TMOD
- 定时器初值赋予寄存器(TH0/TH1,TL0/TL1)
IE
EX0:外部中断0允许位;
ET0:定时/计数器T0中断允许位;
EX1:外部中断1允许位;
ET1:定时/计数器T1中断允许位;
ES :串行口中断允许位;
EA :CPU中断允许(总允许)位。
TCON
IT0:外部中断0触发方式控制位
当IT0=0时,为电平触发方式(低电平有效)
当IT0=1时,为边沿触发方式(下降沿有效)
IE0:外部中断0中断请求标志位
IT1:外部中断1触发方式控制位
IE1:外部中断1中断请求标志位
TF0:定时/计数器T0溢出中断请求标志位
TF1:定时/计数器T1溢出中断请求标志位
SCON
RI:串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。
TI:串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。
IP
PX0:外部中断0优先级设定位
PT0:定时/计数器T0优先级设定位
PX1:外部中断0优先级设定位
PT1:定时/计数器T1优先级设定位
PS :串行口优先级设定位
PT2:定时/计数器T2优先级设定位
中断响应的条件
- 中断源有中断请求
- 此中断源的中断允许位为1
- 开中断(即EA=1)