51单片机(中断,定时器)

二、中断系统

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. 中断请求:中断源产生事件(如引脚信号、计数溢出),将对应中断请求标志位置1(IE0/IE1/TF0/TF1/TI/RI)

  2. 中断响应:CPU在每条指令执行完后查询中断标志,当满足响应条件(总中断允许EA=1、该中断源允许位=1、无同级或更高优先级中断正在服务、不在RETI等关键指令后)时响应

  3. 保护断点:硬件自动将当前PC(断点地址)压入堆栈,并把PC装载为该中断的固定入口地址(如0003H)

  4. 执行中断服务程序(ISR) :软件保护现场(将ISR中要用的寄存器/ACC压栈PUSH)→ 处理事件 → 清除中断标志位(部分标志需软件清0,如串口的TI/RI)→ 恢复现场(POP)

  5. 中断返回 :执行 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为例)

  1. 配置方式寄存器TMOD :选择工作方式(M1M0=01→方式1,16位定时器)、定时/计数模式 TMOD = 0x01; // T0方式1定时

  2. 装载初值TH0 = 0x3C; TL0 = 0xB0;(50ms@12MHz)

  3. 开中断EA = 1; ET0 = 1;(允许总中断和T0中断,也可查询方式不用中断)

  4. 启动定时器TR0 = 1;(TCON中的运行控制位)

  5. 计数:每个机器周期TL0自动加1,低8位溢出向TH0进位,16位全满溢出

  6. 溢出 :硬件自动置 TF0 = 1,若中断开放则CPU响应T0中断,转入入口地址000BH执行ISR;若用查询方式则软件检测TF0

  7. 重装初值:方式1非自动重装,需在ISR中重新赋TH0/TL0(方式2为8位自动重装)

  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单片机从入门到岗位面试的核心考点。建议重点掌握:

  1. 概念辨析:MCU与MPU/SOC的区别、RAM/ROM的易失性差异、51片内128B RAM + 4KB ROM

  2. 位操作三板斧|=置1、&= ~清0、^=取反,必须能手写

  3. 中断五要素:中断源→请求→响应→服务→返回(RETI),5个中断源及入口地址

  4. 定时器三步走:设TMOD→装初值→TR启动,自增溢出机制及初值计算公式

相关推荐
hahaha60161 小时前
HLS高层次综合设计技巧--数组
开发语言·嵌入式硬件·算法·fpga开发
zhangzhangkeji1 小时前
stm32 笔记 - 2:库函数方式的初始化,项目的文件结构
stm32·arm
云泽8081 小时前
STM32 USART 详解(六):HAL库初始化及阻塞式收发源码拆解
stm32·单片机·嵌入式硬件
linx2952 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
无忧.芙桃2 小时前
嵌入式(一):嵌入式历史与计算机基础:从 ENIAC 到 MCU 四大技术方向
c语言·单片机·嵌入式硬件·计算机
嵌入式er2 小时前
经纬恒润(成都)嵌入式一面 + 二面
单片机·嵌入式硬件
新晨单片机设计3 小时前
S014A-基于STM32单片机计算器(LCD1602显示)【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus
POMAGTOR3 小时前
【磁吸 POGOPIN 连接器 汽车医疗机器人弹簧顶针】
嵌入式硬件·机器人·汽车
clear sky .4 小时前
内存8字节对齐是什么?
c语言·stm32·嵌入式硬件