二、中断系统
1. 中断
中断 是指CPU在正常执行程序的过程中,遇到某个紧急事件 (外部或内部)请求处理时,暂停当前程序,转去执行处理该事件的中断服务程序(ISR),处理完后再返回原程序断点处继续执行的机制。
类比:你在写作业(主程序),突然电话响了(中断请求),你先记下写到哪了(保护断点),去接电话(执行ISR),挂断后接着刚才的位置继续写(中断返回)。
中断的意义:让CPU不必轮询等待事件,提高实时性和CPU利用率。
2. 中断源
中断源 是引起中断事件的来源,即向CPU发出中断请求的设备或事件。
常见类型:
-
外部中断源:按键、传感器信号、通信请求(经INT0/INT1等引脚)
-
内部(片内)中断源:定时器溢出、串口收发完成、A/D转换结束等
3. 标准51单片机有 5个中断源,分为两类:
| 中断源 | 名称 | 触发条件 | 入口地址 | 默认优先级 |
|---|---|---|---|---|
| INT0 | 外部中断0 | P3.2引脚出现低电平/下降沿(IT0选择) | 0003H | 最高 |
| T0 | 定时器0中断 | 定时/计数器T0溢出(TF0置1) | 000BH | ↓ |
| INT1 | 外部中断1 | P3.3引脚出现低电平/下降沿(IT1选择) | 0013H | ↓ |
| T1 | 定时器1中断 | 定时/计数器T1溢出(TF1置1) | 001BH | ↓ |
| TI/RI | 串口中断 | 串口发送/接收完成(TI/RI置1) | 0023H | 最低 |
其中前两个为外部中断,后三个为内部中断;优先级可通过IP寄存器修改为高优先级,实现中断嵌套。(52子系列增加T2定时器中断,共6个。)
4. 中断处理流程
完整流程分五步:
-
中断请求:中断源产生事件(如引脚信号、计数溢出),将对应中断请求标志位置1(IE0/IE1/TF0/TF1/TI/RI)
-
中断响应:CPU在每条指令执行完后查询中断标志,当满足响应条件(总中断允许EA=1、该中断源允许位=1、无同级或更高优先级中断正在服务、不在RETI等关键指令后)时响应
-
保护断点:硬件自动将当前PC(断点地址)压入堆栈,并把PC装载为该中断的固定入口地址(如0003H)
-
执行中断服务程序(ISR) :软件保护现场(将ISR中要用的寄存器/ACC压栈PUSH)→ 处理事件 → 清除中断标志位(部分标志需软件清0,如串口的TI/RI)→ 恢复现场(POP)
-
中断返回 :执行
RETI指令,硬件自动从堆栈弹出断点地址送回PC,CPU返回原程序继续执行
// C语言示例:外部中断0
void Int0_ISR(void) interrupt 0 // interrupt 0 = INT0
{
// 处理中断事件
flag = 1;
} // 编译器自动生成RETI
注意:RETI 与普通 RET 不同,RETI还会通知中断系统"本次中断服务已结束",恢复中断逻辑。
5. PWM周期及占空比
PWM(Pulse Width Modulation,脉冲宽度调制):用一系列等幅不等宽的脉冲等效替代需要的波形。
-
PWM周期 T:一个完整脉冲循环持续的时间,即从脉冲开始到下一次相同状态开始的间隔。对应频率 f = 1/T
-
占空比 D(Duty Cycle) :一个周期内高电平(有效电平)持续时间占整个周期的百分比
D = \\frac{t_{高}}{T} \\times 100\\%
例如周期10ms、高电平2ms,占空比为20%。
应用:
-
通过改变占空比调节平均电压/功率 → LED调光、直流电机调速、舵机控制(舵机角度由脉宽决定)
-
51单片机无硬件PWM(多数型号),用定时器中断软件模拟:定时器周期性中断,计数值小于占空比阈值时输出高,否则输出低
6. 有源蜂鸣器和无源蜂鸣器区别
| 对比项 | 有源蜂鸣器 | 无源蜂鸣器 |
|---|---|---|
| 内部结构 | 内置振荡源(多谐振荡器) | 无振荡源,只有压电片/音圈 |
| 驱动信号 | 直接接直流电即响(持续鸣叫) | 需外部提供2K~5KHz方波才发声 |
| 声音特性 | 固定单一频率 | 频率随输入方波变化,可播放音调/音乐 |
| 价格 | 略贵 | 便宜 |
| 驱动复杂度 | I/O口直接(经三极管)拉高/拉低即可 | 需要PWM或定时器产生方波 |
| 辨别方法 | 高度略高(内置振荡电路);接直流即响 | 接直流只发出"咔"一声(通电/断电瞬间) |
"源"指振荡源,不是电源。 两者电流都较大(约30mA),一般不能由I/O口直接驱动,需经NPN三极管(如8050/9013)放大驱动,并并联续流二极管防止感性负载反向电动势。
7. 51单片机定时器工作流程
数量 :标准51有 2个16位定时/计数器:T0和T1(52子系列多一个T2)。
类型 :自增型(加1计数器)。从初值开始加1计数,计满溢出(FFFFH→0000H)时置位溢出标志TF0/TF1并申请中断。因此定时时间为:
t_{定时} = (65536 - 初值) \\times 机器周期
12MHz晶振下机器周期为1μs(12分频),若定时50ms需装初值 65536−50000 = 15536 = 0x3CB0(TH0=0x3C,TL0=0xB0)。
定时器 vs 计数器模式(由TMOD的C/T位选择):
-
C/T=0:定时器模式,对内部机器周期脉冲(晶振12分频)计数
-
C/T=1:计数器模式,对T0(P3.4)/T1(P3.5)引脚的外部脉冲计数(引脚检测到下降沿计1次)
工作流程(以定时器0方式1为例):
-
配置方式寄存器TMOD :选择工作方式(M1M0=01→方式1,16位定时器)、定时/计数模式
TMOD = 0x01;// T0方式1定时 -
装载初值 :
TH0 = 0x3C; TL0 = 0xB0;(50ms@12MHz) -
开中断 :
EA = 1; ET0 = 1;(允许总中断和T0中断,也可查询方式不用中断) -
启动定时器 :
TR0 = 1;(TCON中的运行控制位) -
计数:每个机器周期TL0自动加1,低8位溢出向TH0进位,16位全满溢出
-
溢出 :硬件自动置
TF0 = 1,若中断开放则CPU响应T0中断,转入入口地址000BH执行ISR;若用查询方式则软件检测TF0 -
重装初值:方式1非自动重装,需在ISR中重新赋TH0/TL0(方式2为8位自动重装)
-
清标志/停止 :中断响应后TF0硬件自动清0;
TR0 = 0可停止定时器
void Timer0_Init(void)
{
TMOD = 0x01; // T0方式1,16位定时
TH0 = 0x3C; // 50ms @ 12MHz
TL0 = 0xB0;
ET0 = 1; // 允许T0中断
EA = 1; // 开总中断
TR0 = 1; // 启动T0
}
void Timer0_ISR(void) interrupt 1 // T0中断号=1
{
TH0 = 0x3C; // 重装初值
TL0 = 0xB0;
// 每50ms执行一次,如计数20次=1s
}
四种工作方式(TMOD的M1M0):方式0为13位、方式1为16位、方式2为8位自动重装、方式3为T0拆成两个8位(仅T0有)。
总结
这组问题贯穿了"芯片架构 → 存储结构 → 寄存器接口 → 数字电路基础 → 外设驱动 → 中断定时机制"的完整知识链,是51单片机从入门到岗位面试的核心考点。建议重点掌握:
-
概念辨析:MCU与MPU/SOC的区别、RAM/ROM的易失性差异、51片内128B RAM + 4KB ROM
-
位操作三板斧 :
|=置1、&= ~清0、^=取反,必须能手写 -
中断五要素:中断源→请求→响应→服务→返回(RETI),5个中断源及入口地址
-
定时器三步走:设TMOD→装初值→TR启动,自增溢出机制及初值计算公式