目录
一、中断系统
1.中断源种类
51的中断系统共有5个中断源:
外部中断0(INT0):由P3.2引脚输入的中断请求信号。
外部中断1(INT1):由P3.3引脚输入的中断请求信号。
定时器T0中断(T0):由定时器/计数器T0的定时、计数溢出产生的中断请求。
定时器T1中断(T0):由定时器/计数器T1的定时、计数溢出产生的中断请求。
串行口中断(ES):由串行数据发生完成(TI)或串行数据接收完成(RI)产生的中断请求。
2.中断地址入口
中断源 | 中断入口地址 | 中断序号 |
---|---|---|
外部中断0 | 0003H | 0 |
定时器T0 | 000BH | 1 |
外部中断1 | 0013H | 2 |
定时器T1 | 001BH | 3 |
串行口中断ES | 0023H | 4 |
3.中断请求标志
(1)TCON寄存器
TCON寄存器为定时器/计数器的控制寄存器,字节地址为88H,可位寻址。既包括定时器/计数器T0、T1溢出中断请求标志位TF0和TF1,也包括两个外部中断请求的标志位IE1与IE0,还包括两个外部中断请求源的中断触发方式选择位
TF0——定时器T0的溢出中断请求标志位。溢出时由硬件置1,即开始发送中断请求;单片机响应中断后,重新由硬件清0。
TR0——定时器/计数器0的启动控制。功能详见定时器知识。
IE0——外部中断0的中断请求标志位。触发中断时由硬件置1,即开始发送中断请求;单片机响应中断后,重新由硬件清0。
IT0——外部中断0的触发方式选择位。令它为1,则对应引脚为下降沿触发中断;令它为0,则对应引脚为低电平触发方式。
TF1、TR1,IE1、IT1则为定时器1、外部中断1的相关标志位,功能与上述相同。
(2)SCON寄存器
SCON寄存器 串行口控制寄存器,字节地址为98H,可位寻址。SCON的低二位锁存串口的发送中断和接收中断的中断请求标志TI和RI
TI——串行口发送完成中断请求标志位。串行口发送数据后,TI位被硬件置1;单片机响应串行口中断后,必须在服务程序中将TI手动清0。
RI——串行口接收完成中断请求标志位。串行口接收数据后,TI位被硬件置1;单片机响应串行口中断后,必须在服务程序中将TI手动清0
4.中断控制
EA——总中断允许控制位。用来开启或屏蔽所有的中断请求,令它为1,则开放中断请求,可以响应中断;令它为0,则屏蔽所有中断请求。
ES——串行口中断允许控制位。为1时开放串行口中断请求,为0时屏蔽。
ET1——定时器/计数器T1中断允许控制位。为1时开放TI的中断请求,为0时屏蔽。
EX1——外部中断1中断允许控制位。为1时开放外部中断1的中断请求,为0时屏蔽。
ET0、EX0则为T0、外部中断0的中断允许控制位。功能与上述相同。
二、中断案例实操
1.单一外部中断
要求:在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接一只按钮开关K1。要求将外部中断0设置为电平触发。程序启动时,P1口上的8只LED全亮。每按一次按钮开关K1,使引脚接地,产生一个低电平触发的外中断请求,在中断服务程序中,让低4位的LED与高4位的LED交替闪烁5次。然后从中断返回,控制8只LED再次全亮。
代码如下:
#include <reg51.h>
#define uchar unsigned char
void Delay(unsigned int i) //延时函数Delay( ),i形式参数,不能赋初值
{
unsigned int j;
for(;i > 0;i--)
for(j=0;j<333;j++) //晶振为12MHz,j选择与晶振频率有关
{;} //空函数
}
void main( ) //主函数
{
EA=1; //总中断允许
EX0=1; //允许外部中断0中断
IT0=1; //选择外部中断0为跳沿触发方式
while(1) //循环
{ P1=0;} // P1口的8只LED全亮
}
void int0( ) interrupt 0 using 0 //外中断0的中断服务函数
{
uchar m;
EX0=0; //禁止外部中断0中断
for(m=0;m<5;m++) //交替闪烁5次
{
P1=0x0f; //低4位LED灭,高4位LED亮
Delay(400) ; //延时
P1=0xf0; //高4位LED灭,低4位LED亮
Delay(400); //延时
EX0=1; //中断返回前,打开外部中断0中断
}
仿真效果图如下:
一个中断
2.两个外中断
要求:在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接有一只按钮开关K1。在外部中断1输入引脚(P3.3)接有一只按钮开关K2。要求K1和K2都未按下时,P1口的8只LED呈流水灯显示,仅K1(P3.2)按下再