定时器与中断系统1
寄存器核心作用配置核心逻辑AUXR控速度(1T/12T)仅改第 7 位,不碰其他位TMOD控模式(16 位 / 定时)先清空低 4 位,再配目标模式TCON控启停 + 清标志先清溢出标志,最后启动计数IE控中断开关先开分中断,再开总中断IP控优先级(可选)仅在多中断时配置,默认无需改所有寄存器配置需遵循 “速度→模式→初值→标志→中断→启停” 的顺序,是保证定时器稳定工作的核心原则。四、完整代码实
前提概念
一、轮询 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(高) |
中断优先级核心规则
- 高低优先级规则
- 高优先级中断可打断低优先级中断(嵌套执行)。
- 高优先级中断执行时,低优先级中断无法打断。
- 同级优先级规则
- 同级中断无法互相打断,执行完当前中断才响应下一个。
- 同级中断同时触发:按 “自然优先级”(中断号越小越优先)响应。
- 自然优先级(默认优先级)
INT0(0 号) > T0(1 号) > INT1(2 号) > T1(3 号) > 串口(4 号) > T2(5 号)。
定时器与中断系统|外部中断
一、模块功能
- 响应外部引脚电平 / 边沿变化,触发中断服务程序
- 实现异步事件处理,提升系统实时性
- 常用于按键、传感器信号、外部触发控制等场景
二、工作原理
一、核心机制
中断的本质是CPU 暂停当前程序,跳转到固定入口执行中断服务程序,执行完毕后自动返回原程序继续执行。
二、触发方式
- 触发方式
- ITx=1:下降沿触发(高→低),只触发 1 次,抗抖动,推荐
- ITx=0:低电平触发,持续低则一直触发,易抖动重复
-
中断请求引脚满足触发条件 → TCON 中 IE0/IE1 硬件置 1 → 向 CPU 发请求
-
响应条件(同时满足)
- EA=1(总中断开)
- EX0/EX1=1(对应中断开)
- 无更高优先级中断
- 当前指令执行完
- CPU 响应
- 保护断点:PC 自动压栈
- 硬件清标志(下降沿)
- 跳转到中断向量地址
- 执行与返回
- 执行中断服务程序 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 等,定时器 / 串口中断),无需修改 |
配置代码思路:
- 先开启对应外部中断的分开关(
EX0=1/EX1=1) - 最后开启总中断(
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
{
}
五、调试经验
- 中断不触发排查
- 检查总中断开关
EA是否为 1,对应中断使能位(EX0/EX1)是否开启。 - 确认触发方式:下降沿触发需
IT0/IT1=1,低电平触发需IT0/IT1=0,同时保证外部信号符合触发条件。 - 验证硬件引脚:INT0 对应 P3.2,INT1 对应 P3.3,确保引脚未被复用、电平正常。
- 检查总中断开关
- 反复触发问题解决
- 优先使用下降沿触发,避免低电平触发时引脚持续低电平导致多次请求。
- 中断服务程序中避免延时,确保硬件标志位(
IE0/IE1)被自动清除。
- 服务程序异常排查
- 中断服务函数必须用
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 位自动重装(串口波特率专用) |
配置代码思路
-
先清空 T0 配置位:用
& 0xF0(二进制1111 0000),仅保留 T1 配置,避免旧配置干扰 -
再配置目标模式:用
| 目标值,仅修改 T0 的 4 个位,不碰 T1 -
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 等),无需修改 |
配置代码思路
-
先开 T0 分中断(ET0=1),再开总中断(EA=1)
-
顺序不影响功能,但先开分中断再开总中断,可避免初始化时误触发
典型配置示例
// 开启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
{
// 业务逻辑
}
五、调试经验
- 中断不触发:检查总中断
EA、对应中断使能(ET0/ET1)是否开启,TR0/TR1是否置 1,TF0/TF1是否误置 1。 - 定时不准:核对晶振频率与
AUXR分频模式(1T/12T),重新计算定时器初值。 - 反复触发:电平触发模式下外部信号未释放,改用下降沿触发,或在中断中过滤抖动。
六、应试要点
- 高频考点:
TMOD/AUXR寄存器功能、1T/12T 模式区别、定时初值计算、中断号对应(T0=1,T1=3)。 - 必记知识点:
- 配置流程:
分频→模式→初值→标志→中断→启动 EA=1是所有中断生效的前提- 中断服务函数必须精简,避免长延时
- 配置流程:
- 解题思路:先确定晶振与分频模式→计算初值→按流程配置寄存器→编写中断服务函数→主循环等待。
七、学习总结
- 核心逻辑:定时器对时钟 / 脉冲计数,溢出后触发中断,实现异步非阻塞处理。
- 寄存器分工:
AUXR管速度、TMOD管模式、TCON管启停、IE管中断开关。 - 应试关键:牢记配置流程、寄存器位功能、中断号对应关系,可直接套模板写代码。
更多推荐



所有评论(0)