前提概念

一、轮询 vs 中断:两种交互方式

1. 轮询(Polling)

  • 核心思想:内核主动、持续地去检查外设的状态,就像一个看门人按顺序挨个检查四个城门有没有人敲门。
  • 优点:逻辑简单,容易实现,不需要复杂的硬件配置。
  • 缺点:效率极低,CPU 一直被占用,无法处理其他任务;外设事件响应慢,必须等一轮检查到自己时才能被处理。

2. 中断(Interrupt)

  • 核心思想:外设主动 “敲门”(触发中断信号),内核立刻放下手头的事,优先去处理这个突发事件,处理完再回来继续原来的工作。
  • 优点:响应速度快,CPU 利用率高,能对突发事件做出最优先的处理。
  • 缺点:需要配置中断控制器、优先级等,逻辑相对复杂。

二、中断类型

  • 外部中断(INT0/INT1):响应按键、传感器等外部硬件触发,引脚对应 P32(INT0)、P33(INT1)。
  • 定时器中断(T0/T1):实现精准定时(1ms/10ms),用于数码管扫描、按键消抖、数据刷新。
  • 串口中断(TI/RI):处理串口收发数据,用于上位机通信。

三、中断核心:寄存器与优先级规则

1. 中断允许寄存器 IE(总开关 + 分开关)

IE 是 “中断总开关 + 分开关”,任何中断生效必须先开总中断(EA=1)

位序号 符号 功能说明
7 EA 中断总开关:EA=0(关所有中断)、EA=1(开所有)
4 ES 串口中断允许:ES=0(禁止)、ES=1(允许)
3 ET1 定时器 1 中断允许:ET1=0(禁止)、ET1=1(允许)
2 EX1 外部中断 1 允许:EX1=0(禁止)、EX1=1(允许)
1 ET0 定时器 0 中断允许:ET0=0(禁止)、ET0=1(允许)
0 EX0 外部中断 0 允许:EX0=0(禁止)、EX0=1(允许)
  • 配置顺序:先开分开关(如 EX0/ET0),再开总开关(EA=1)。

2. 中断优先级寄存器 IP(高 / 低两级)

IP 用于设置 “高 / 低” 两级优先级,决定中断是否可嵌套。

位序号 符号 功能说明
4 PS 串口中断优先级:PS=0(低)、PS=1(高)
3 PT1 定时器 1 优先级:PT1=0(低)、PT1=1(高)
2 PX1 外部中断 1 优先级:PX1=0(低)、PX1=1(高)
1 PT0 定时器 0 优先级:PT0=0(低)、PT0=1(高)
0 PX0 外部中断 0 优先级:PX0=0(低)、PX0=1(高)
中断优先级核心规则
  1. 高低优先级规则
    • 高优先级中断可打断低优先级中断(嵌套执行)。
    • 高优先级中断执行时,低优先级中断无法打断。
  2. 同级优先级规则
    • 同级中断无法互相打断,执行完当前中断才响应下一个。
    • 同级中断同时触发:按 “自然优先级”(中断号越小越优先)响应。
  3. 自然优先级(默认优先级)

        INT0(0 号) > T0(1 号) > INT1(2 号) > T1(3 号) > 串口(4 号) > T2(5 号)。


 定时器与中断系统|外部中断

一、模块功能

  • 响应外部引脚电平 / 边沿变化,触发中断服务程序
  • 实现异步事件处理,提升系统实时性
  • 常用于按键、传感器信号、外部触发控制等场景

二、工作原理

一、核心机制

中断的本质是CPU 暂停当前程序,跳转到固定入口执行中断服务程序,执行完毕后自动返回原程序继续执行。

二、触发方式

  1. 触发方式
  • ITx=1:下降沿触发(高→低),只触发 1 次,抗抖动,推荐
  • ITx=0:低电平触发,持续低则一直触发,易抖动重复
  1. 中断请求引脚满足触发条件 → TCON 中 IE0/IE1 硬件置 1 → 向 CPU 发请求

  2. 响应条件(同时满足)

  • EA=1(总中断开)
  • EX0/EX1=1(对应中断开)
  • 无更高优先级中断
  • 当前指令执行完
  1. CPU 响应
  • 保护断点:PC 自动压栈
  • 硬件清标志(下降沿)
  • 跳转到中断向量地址
  1. 执行与返回
  • 执行中断服务程序 ISR
  • 执行 RETI:PC 出栈,返回断点继续运行

三、硬件配置

1. TCON 寄存器(外部中断触发方式 + 请求标志)

  • 地址:0x88,可位寻址 ✅
  • 核心作用:控制外部中断的触发方式、标记中断请求状态
位序号 位名称 功能说明
3 IE1 外部中断 1 请求标志位:INT1 引脚触发时硬件自动置 1 → 触发中断进入中断服务程序后硬件自动清 0
2 IT1 外部中断 1 触发方式选择:0 = 低电平触发(INT1 引脚持续低电平触发)1 = 下降沿触发(INT1 引脚电平从高→低时触发,抗抖动,推荐)
1 IE0 外部中断 0 请求标志位:INT0 引脚触发时硬件自动置 1 → 触发中断进入中断服务程序后硬件自动清 0
0 IT0 外部中断 0 触发方式选择:0 = 低电平触发(INT0 引脚持续低电平触发)1 = 下降沿触发(INT0 引脚电平从高→低时触发,抗抖动,推荐)
7~4 其他位 与外部中断无关(TF1、TR1、TF0、TR0,定时器相关),无需修改

配置代码思路

  • 优先选择下降沿触发IT0=1/IT1=1),避免电平触发导致的反复中断问题
  • 初始化时可手动清IE0/IE1,避免上电误触发中断
// 外部中断0:下降沿触发 + 清标志
IT0 = 1;
IE0 = 0;

// 外部中断1:下降沿触发 + 清标志
IT1 = 1;
IE1 = 0;

2. IE 寄存器(中断使能总开关 + 分开关)

  • 地址:0xA8,可位寻址 ✅
  • 核心作用:控制外部中断的使能(总中断 + 外部中断分开关)
位序号 位名称 功能说明
7 EA 总中断开关:0 = 关闭所有中断(所有中断失效)1 = 开启总中断(分中断生效的前提)
0 EX0 外部中断 0 分开关:0 = 禁用 INT0 中断(即使触发也不响应)1 = 启用 INT0 中断
2 EX1 外部中断 1 分开关:0 = 禁用 INT1 中断(即使触发也不响应)1 = 启用 INT1 中断
6~3/1 其他位 与外部中断无关(ET0、ET1、ES 等,定时器 / 串口中断),无需修改

配置代码思路

  1. 先开启对应外部中断的分开关(EX0=1/EX1=1
  2. 最后开启总中断(EA=1),避免初始化阶段误触发
// 开启外部中断0分中断
EX0 = 1;
// 开启外部中断1分中断(按需选择)
EX1 = 1;

// 开启总中断(必须配置,否则所有中断失效)
EA = 1;

3. IP 寄存器(中断优先级,可选配置)

  • 地址:0xB8,可位寻址 ✅
  • 核心作用:设置外部中断的优先级(多中断场景下使用)
位序号 位名称 功能说明
0 PX0 外部中断 0 优先级:0 = 低优先级(默认,可被高优先级中断打断)1 = 高优先级(可打断低优先级中断)
2 PX1 外部中断 1 优先级:0 = 低优先级(默认)1 = 高优先级
7~3/1 其他位 与外部中断无关(PT0、PT1、PS 等),无需修改

配置代码思路

  • 仅在多中断并发时需要配置,默认低优先级无需额外操作
  • 高优先级适合紧急外部事件(如急停按键),低优先级适合普通交互(如普通按键)
// 将外部中断0设为高优先级(可选)
PX0 = 1;

// 将外部中断1设为高优先级(可选)
PX1 = 1;

4. 硬件引脚与连接

表格

中断源 引脚名称 引脚号 硬件连接说明
外部中断 0 INT0 P32 外部中断输入引脚,默认需接上拉电阻至高电平,避免悬空误触发
外部中断 1 INT1 P33 外部中断输入引脚,默认需接上拉电阻至高电平,避免悬空误触发

硬件注意事项

  • 按键触发时,按下后引脚电平从高→低(匹配下降沿触发)
  • 电平触发模式下,需保证引脚电平恢复高电平,否则会反复触发中断

四、完整代码实现

#include <STC12C5A60S2.H>

#include <init.h>
#include <led.h>

unsigned char x;

void ExtInt_Init(void)
{
    // 外部中断0配置:下降沿触发
    IT0 = 1;  // IT0=1 → 下降沿触发(抗抖动,推荐)
    EX0 = 1;  // EX0=1 → 开启外部中断0使能
    
    // 外部中断1配置:下降沿触发
    IT1 = 1;  // IT1=1 → 下降沿触发
    EX1 = 1;  // EX1=1 → 开启外部中断1使能
    
    EA = 1;   // EA=1 → 开启总中断(所有中断的总闸门)
}

void main(void)
{
    system_init();    // 系统初始化
    ExtInt_Init();    // 外部中断初始化
    
    while(1)
    {
    }
}

//中断服务函数//
void isr1(void) interrupt 0//中断号——>是哪个中断? 
{
	x = !x;
	Led_Disp2(0, x);
}

void isr2(void) interrupt 2
{
	
}

五、调试经验

  1. 中断不触发排查
    • 检查总中断开关 EA 是否为 1,对应中断使能位(EX0/EX1)是否开启。
    • 确认触发方式:下降沿触发需 IT0/IT1=1,低电平触发需 IT0/IT1=0,同时保证外部信号符合触发条件。
    • 验证硬件引脚:INT0 对应 P3.2,INT1 对应 P3.3,确保引脚未被复用、电平正常。
  2. 反复触发问题解决
    • 优先使用下降沿触发,避免低电平触发时引脚持续低电平导致多次请求。
    • 中断服务程序中避免延时,确保硬件标志位(IE0/IE1)被自动清除。
  3. 服务程序异常排查
    • 中断服务函数必须用 interrupt 关键字声明,且中断号与中断源严格对应(INT0=0、INT1=2)。
    • 服务函数内尽量精简,禁止调用耗时函数(如长延时、串口打印),避免阻塞主程序。

六、学习总结

  • 关键知识点回顾

  • 中断本质:异步事件处理机制,实现 CPU 与外设的并行工作。
  • 核心寄存器
    • TCON:控制触发方式与中断标志。
    • IE:管理各中断源的使能与总中断开关。
    • IP:设置中断优先级。
  • 代码模板
    // 外部中断0初始化(下降沿触发)
    void Int0_Init() {
        IT0 = 1;  // 下降沿触发
        EX0 = 1;  // 开启INT0使能
        EA  = 1;  // 开启总中断
    }
    // 中断服务函数
    void Int0_ISR() interrupt 0 {
        // 业务逻辑
    }
    
  • 应试核心:牢记中断号、配置流程、服务函数格式,结合调试经验快速排错。


定时器与中断系统|定时器中断

一、模块功能

  • 定时 / 计数功能:对系统时钟(经分频后)或外部引脚脉冲进行计数,实现精确延时周期信号生成外部事件计数等核心功能。
  • 异步事件处理:定时时间到后硬件自动置位溢出标志位,触发中断;CPU 暂停主程序,自动执行中断服务程序,执行完毕后返回主程序继续运行,实现非阻塞式异步处理
  • 典型应用
    • LED 周期性闪烁:通过定时中断翻转 IO 口电平。
    • 按键消抖:利用定时器延时过滤按键抖动信号。
    • 串口波特率生成:使用定时器自动重装模式提供稳定时钟。
    • 传感器定时采样:每隔固定时间读取传感器数据。

二、工作原理

1. 时钟分频与源选择

  • 系统时钟输入SYSclk 为单片机核心时钟,进入分频模块。
  • 分频控制(AUXR 寄存器)
    • AUXR.7/T0x12=0:选择 ÷12 通路 → 12T 模式(机器周期 = 12× 时钟周期,传统 51 速度)。
    • AUXR.7/T0x12=1:选择 ÷1 通路 → 1T 模式(机器周期 = 1× 时钟周期,计数速度提升 12 倍,IAP 系列推荐)。
  • 时钟源选择(C/T̄ 控制,来自 TMOD)
    • C/T̄=0:选择内部分频时钟 → 定时器模式,对系统时钟计数。
    • C/T̄=1:选择 T0 Pin(P3.4 引脚) → 计数器模式,对外部脉冲信号计数。

2. 计数使能控制

  • 逻辑控制:control = (¬GATE) ∧ INT0 ∧ TR0(来自 TMOD 的 GATE、外部引脚 INT0、TCON 的 TR0)。
    • GATE=0¬GATE=1,仅需 TR0=1 即可启动计数(比赛 / 项目最常用)。
    • GATE=1:需 INT0=高电平TR0=1 才允许计数,用于测量外部脉冲宽度。

3. 计数与溢出机制

  • 计数核心TL0(8bit) + TH0(8bit) 组成 16 位计数器,RL_TL0/RL_TH0 为自动重装寄存器(方式 2 专用)。
  • 溢出触发:计数器从初值递增至 0xFFFF(65535)后溢出,硬件自动置位 TF0(溢出标志位)。
  • 中断与输出
    • TF0=1 且中断使能开启时,触发 Interrupt 中断,CPU 执行中断服务程序。
    • 溢出信号可通过开关输出至 P3.5 引脚,生成 T0CLKO 周期信号。

4. 完整中断流程

外部/内部时钟 → 分频 → 计数使能 → 计数溢出 → TF0 置1 → 中断响应 → 执行服务程序 → 重装初值 → 继续计数

三、硬件配置

一、AUXR 寄存器(辅助寄存器)

基本信息

  • 地址:0x8E

  • 可位寻址:❌ (只能整字节操作,需用与 / 或运算修改目标位)

  • 核心作用:控制定时器时钟分频模式(1T/12T),决定计数速度

位结构与功能(仅关注 T0 相关位)

位序号

位名称

功能说明

7

T0x12

定时器 0 分频控制(唯一核心位):0 = 12T 模式(传统 51,机器周期 = 12× 时钟周期)1 = 1T 模式(增强型 51,机器周期 = 1× 时钟周期,速度 ×12)

6~0

其他位

与 T0 无关(如 T1x12、串口波特率等),配置 T0 时无需修改

配置代码思路

  • 原则:仅修改第 7 位(T0x12),其余位保持默认值,避免影响其他功能

  • 操作逻辑:

    • 清 0(12T 模式):用 & 0x7F(二进制0111 1111),仅把第 7 位置 0,其他位不变

    • 置 1(1T 模式):用 | 0x80(二进制1000 0000),仅把第 7 位置 1,其他位不变

典型配置示例

// 配置T0为12T模式
AUXR &= 0x7F; 

// 配置T0为1T模式
AUXR |= 0x80;

二、TMOD 寄存器(定时器模式寄存器)

基本信息

  • 地址:0x89

  • 可位寻址:❌ (整字节操作,低 4 位控 T0,高 4 位控 T1)

  • 核心作用:定义 T0 的工作模式(定时 / 计数、门控、计数位数)

位结构与功能(仅关注 T0 相关的低 4 位)

位序号

位名称

功能说明

3

GATE0

门控位:0 = 仅 TR0(TCON 寄存器)控制 T0 启停(99% 场景用此配置)1 = 需 INT0(P3.2)高电平 + TR0=1 才启动 T0(仅测脉冲宽度用)

2

C/T0

定时 / 计数选择:0 = 定时器模式(对内部时钟计数,常用)1 = 计数器模式(对 T0 引脚 P3.4 外部脉冲计数)

1

M10

模式选择位 1,与 M00 配合决定计数位数

0

M00

模式选择位 0:M10=0+M00=1 → 16 位模式(最常用,需手动重装初值)M10=1+M00=0 → 8 位自动重装(串口波特率专用)

配置代码思路

  1. 先清空 T0 配置位:用 & 0xF0(二进制1111 0000),仅保留 T1 配置,避免旧配置干扰

  2. 再配置目标模式:用 | 目标值,仅修改 T0 的 4 个位,不碰 T1

  3. 16 位定时器模式(GATE0=0、C/T0=0、M10=0、M00=1)→ 目标值0x01

典型配置示例

// 步骤1:清空T0配置位(低4位)
TMOD &= 0xF0; 

// 步骤2:配置T0为16位定时器模式(最常用)
TMOD |= 0x01; 

// 若需配置为8位自动重装模式(串口用)
// TMOD |= 0x02;

三、TCON 寄存器(定时器控制寄存器)

基本信息

  • 地址:0x88

  • 可位寻址:✅ (可直接操作单个位,无需整字节运算)

  • 核心作用:控制 T0 启停、标记溢出状态

位结构与功能(仅关注 T0 相关位)

位序号

位名称

功能说明

5

TF0

溢出标志位:T0 计数溢出时硬件自动置 1 → 触发中断进入中断服务程序后,硬件自动清 0初始化时需手动清 0,避免误触发

4

TR0

启停控制位:1 = 启动 T0 计数0 = 停止 T0 计数需在所有配置完成后置 1

3~0

其他位

与 T0 无关(如 IE0、IT0 等外部中断位),无需修改

配置代码思路

  • TF0:初始化阶段手动清 0,无需后续操作(硬件自动管理)

  • TR0:所有寄存器配置、初值装载完成后,置 1 启动计数

典型配置示例

// 初始化时清空溢出标志,避免误触发中断
TF0 = 0; 

// 所有配置完成后,启动T0计数
TR0 = 1; 

// 若需暂停T0,直接置0
// TR0 = 0;

四、IE 寄存器(中断允许寄存器)

基本信息

  • 地址:0xA8

  • 可位寻址:✅ (直接操作单个位)

  • 核心作用:控制中断开关(总开关 + T0 分开关)

位结构与功能(仅关注 T0 相关位)

位序号

位名称

功能说明

7

EA

总中断开关:0 = 关闭所有中断(所有中断失效)1 = 开启总中断(分中断生效的前提)必须最后开,或与分中断配合开

1

ET0

T0 分中断开关:0 = 禁用 T0 中断(即使溢出也不触发)1 = 启用 T0 中断(溢出后触发中断服务程序)

6~2/0

其他位

与 T0 无关(如 ET1、ES 等),无需修改

配置代码思路

  1. 先开 T0 分中断(ET0=1),再开总中断(EA=1)

  2. 顺序不影响功能,但先开分中断再开总中断,可避免初始化时误触发

典型配置示例

// 开启T0分中断
ET0 = 1; 

// 开启总中断(所有中断的总闸门,必须开)
EA = 1; 

// 若需关闭T0中断,仅需关分中断(无需关总中断)
// ET0 = 0;

五、IP 寄存器(中断优先级寄存器)

基本信息

  • 地址:0xB8

  • 可位寻址:✅ (直接操作单个位)

  • 核心作用:设置 T0 中断优先级(可选配置,非必须)

位结构与功能(仅关注 T0 相关位)

位序号

位名称

功能说明

1

PT0

T0 中断优先级:0 = 低优先级(默认,可被高优先级中断打断)1 = 高优先级(可打断低优先级中断)

7~2/0

其他位

与 T0 无关(如 PT1、PS 等),无需修改

配置代码思路

  • 仅在需要多中断优先级时配置,默认低优先级无需操作

  • 高优先级适合 “紧急任务”(如定时采样),低优先级适合 “普通任务”(如 LED 闪烁)

典型配置示例

// 将T0设为高优先级(可选)
PT0 = 1; 

// 恢复默认低优先级
// PT0 = 0;

总结

寄存器 核心作用 配置核心逻辑
AUXR 控速度(1T/12T) 仅改第 7 位,不碰其他位
TMOD 控模式(16 位 / 定时) 先清空低 4 位,再配目标模式
TCON 控启停 + 清标志 先清溢出标志,最后启动计数
IE 控中断开关 先开分中断,再开总中断
IP 控优先级(可选) 仅在多中断时配置,默认无需改

所有寄存器配置需遵循 “速度→模式→初值→标志→中断→启停” 的顺序,是保证定时器稳定工作的核心原则。

四、完整代码实现

//#include <STC12C5A60S2.H> //sfr AUXR = 0x8E;

void T0_Reset() 
{
    AUXR &= 0x7F;   // T0 12T模式
    TMOD &= 0xF0;   // 清空T0配置
    TH0 = 0xFC;     // 12MHz 1ms初值
    TL0 = 0x18;     
    TF0 = 0;        // 清溢出标志
    ET0 = 1;        // 开T0中断
    EA  = 1;        // 开总中断
    TR0 = 1;        // 启动计数
}

void main()
{	
	while(1)
	{
		
	}
}

// 中断服务函数 //
void Timer0_ISR() interrupt 1 
{
    // 业务逻辑
}

五、调试经验

  1. 中断不触发:检查总中断EA、对应中断使能(ET0/ET1)是否开启,TR0/TR1是否置 1,TF0/TF1是否误置 1。
  2. 定时不准:核对晶振频率与AUXR分频模式(1T/12T),重新计算定时器初值。
  3. 反复触发:电平触发模式下外部信号未释放,改用下降沿触发,或在中断中过滤抖动。

六、应试要点

  1. 高频考点TMOD/AUXR寄存器功能、1T/12T 模式区别、定时初值计算、中断号对应(T0=1,T1=3)。
  2. 必记知识点
    • 配置流程:分频→模式→初值→标志→中断→启动
    • EA=1是所有中断生效的前提
    • 中断服务函数必须精简,避免长延时
  3. 解题思路:先确定晶振与分频模式→计算初值→按流程配置寄存器→编写中断服务函数→主循环等待。

七、学习总结

  • 核心逻辑:定时器对时钟 / 脉冲计数,溢出后触发中断,实现异步非阻塞处理。
  • 寄存器分工AUXR管速度、TMOD管模式、TCON管启停、IE管中断开关。
  • 应试关键:牢记配置流程、寄存器位功能、中断号对应关系,可直接套模板写代码。

Logo

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

更多推荐