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 → 开启外部中断0
  • EX1 = 1 → 开启外部中断 1
  • EA = 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);       // 等待中断触发
    }
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐