【51 单片机入门到进阶】07 入门:51单片机外部中断使用详解
·
1,STC89C51RC 外部中断核心资源总览
STC89C51C 包含 2 个外部中断(INT0 / INT1),均支持下降沿触发 / 低电平触发,拥有独立中断号、入口地址、控制寄存器。
| 中断名称 | 对应引脚 | 中断号 | 入口地址 | 触发方式 | 控制寄存器 |
|---|---|---|---|---|---|
| 外部中断 0 (INT0) | P3.2 | 0 | 0003H | 下降沿 / 低电平 | TCON |
| 外部中断 1 (INT1) | P3.3 | 2 | 0013H | 下降沿 / 低电平 | TCON |
核心特性
<1> 触发方式:下降沿触发(推荐)、低电平触发
<2> 中断标志:硬件自动置 1,响应中断后硬件自动清 0(无需软件清除)
<3> 独立使能:可单独开启 / 关闭
<4> 引脚内部自带弱上拉,按键直接接 GND 即可使用
2,外部中断 核心控制寄存器逐位详解
(1)TCON 寄存器(地址:88H)→ 控制 外部中断 1 (INT1)
仅用于配置 INT1 的触发方式和中断标志,可位寻址。
| 位序号 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
|---|---|---|---|---|---|---|---|---|
| 位符号 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
| 功能含义 | 定时器 1 溢出标志 | 定时器 1 启动控制 | 定时器 0 溢出标志 | 定时器 0 启动控制 | INT1 中断标志 | INT1 触发方式 | INT0 中断标志 | INT0 触发方式 |
IT0=1:INT0 下降沿触发;IT0=0:低电平触发
IT1=1:INT1 下降沿触发;IT1=0:低电平触发
IE0/IE1:中断请求标志,可软件查询
(2) IE 中断允许寄存器(地址:A8H)→ 总开关 + 分开关
所有外部中断的使能总控,必须开启总中断 + 对应分中断才能响应。
| 位 7 | 位 6 | 位 5 | 位 4 | 位 3 | 位 2 | 位 1 | 位 0 |
|---|---|---|---|---|---|---|---|
| EA | - | ES | ET1 | EX1 | EX0 | ET0 | |
| 总中断 | - | - | - | - | INT1 使能 | INT0使能 | - |
扩展使能位(INT2/INT3):
EX0 = 1→ 开启外部中断0EX1 = 1→ 开启外部中断 1EA = 1→ 开启总中断(必须配置)
(3) IP 中断优先级寄存器(地址:B8H,可位寻址)
作用:设置外部中断 0/1 的优先级(高 / 低两级)
| 位序号 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
|---|---|---|---|---|---|---|---|---|
| 位符号 | - | - | - | PS | PT1 | PX1 | PT0 | PX0 |
| 功能含义 | 保留 | 保留 | 保留 | 串口优先级 | 定时器 1 优先级 | INT1 优先级1 = 高优先级 | 定时器 0 优先级 | INT0 优先级1 = 高优先级 |
3, 中断标志查询方法
中断标志位 IE0/IE1 支持软件主动查询,可在主程序中判断是否触发中断:
if(IE0 == 1) // 查询外部中断0是否请求
{
// 中断处理逻辑
}
if(IE1 == 1) // 查询外部中断1是否请求
{
// 中断处理逻辑
}
4,中断服务函数
下面函数为中断服务函数,interrupt 2对应外部中断1,INT1_ISR只是函数名称可任意更改,但是interrupt 2一定要写对,外部中断2、3也是一样。
// 外部中断0 服务函数(中断号0)
void INT0_ISR(void) interrupt 0
{
// 中断触发后执行的代码
}
// 外部中断1 服务函数(中断号2)
void INT1_ISR(void) interrupt 2
{
// 中断触发后执行的代码
}
5,外部中断 标准配置步骤
(1)配置触发方式:IT0(INT0)、IT1(INT1)
(2)开启中断使能:EX0/EX1 = 1
(3)开启总中断:EA = 1
(4)编写中断服务函数(指定中断号)
(5)配置**中断优先级 **(可选)
6,实战示例程序
硬件说明
- INT0:P3.2接按键(按下低电平)
- INT1:P3.3 接按键(按下低电平)
- LED:P2.4/P2.5 分别对应两个中断
(1) 外部中断 0(INT0)下降沿触发
#include <reg52.h>
sbit LED0 = P2^4; // INT0 对应LED
// 外部中断0服务函数
void INT0_ISR(void) interrupt 0
{
LED0 = ~LED0; // 反转LED状态
}
void main(void)
{
LED0 = 1; // 初始灭灯
IT0 = 1; // TCON:INT0 下降沿触发
EX0 = 1; // IE:开启外部中断0
EA = 1; // 开启总中断
while(1); // 等待中断触发
}
(2)外部中断1(INT1)下降沿触发
#include <reg52.h>
sbit LED1 = P2^5; // INT1 对应LED
// 外部中断1服务函数
void INT1_ISR(void) interrupt 2
{
LED1 = ~LED1; // 反转LED状态
}
void main(void)
{
LED1 = 1; // 初始灭灯
IT1 = 1; // TCON:INT1 下降沿触发
EX1 = 1; // IE:开启外部中断1
EA = 1; // 开启总中断
while(1); // 等待中断触发
}
更多推荐
所有评论(0)