C51单片机学习笔记——定时器与中断
51单片机的定时器/计数器是其实现精确时间控制、延时、脉冲计数、PWM、串口波特率生成等功能的基石。中断系统则提供了CPU及时响应这些定时器溢出事件(或其他内外事件)的机制,使单片机能够“同时”处理多个任务或在后台进行定时操作。
一、定时器
1、什么是定时器
在51单片机中的定时器属于内部资源,其他电路的连接和运转都是在单片机的内部执行的。
2、定时器的作用
(1)用于计时系统,可实现软件计时,使程序每隔固定的一段时间执行一项操作。
(2)提高CPU的运行效率和处理速度。
(3)STC89C52定时器资源,定时器的个数有三个(T0、T1、T2),T0与T1的传统51单片机兼容,T2是此型号单片机增加的内部资源。
注:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的。
3、定时器的工作模式
我们通常使用16位定时器/计数器,其核心原理是
由两个8位寄存器
THx
(高8位)和TLx
(低8位)组成(x=0/1
对应定时器0/1)。
计数器从初值开始每个机器周期加1,溢出时产生中断。
最大计数值 = 216=65536216=65536(从
0x0000
到0xFFFF
)。
时钟来源(由
TMOD
寄存器控制):定时器模式(
C/T=0
):
计数脉冲 = 单片机晶振频率 f /12
(传统8051的1个机器周期 = 12个时钟周期)。计数器模式(
C/T=1
):
计数脉冲 = 外部引脚(T0
/P3.4
或T1
/P3.5
)的下降沿。
中断系统:
本质: 一种硬件机制,允许CPU在执行主程序时,暂停当前任务,立即响应来自内部或外部的紧急事件(中断请求),执行一段特定的程序(中断服务程序 - ISR),执行完毕后返回到主程序被中断的地方继续执行。
中断源 (Interrupt Sources): 51单片机有5个(或6个,取决于型号)基本中断源:
INT0
- 外部中断0 (P3.2引脚)INT1
- 外部中断1 (P3.3引脚)TF0
- 定时器/计数器T0溢出中断TF1
- 定时器/计数器T1溢出中断TI
/RI
- 串行口发送完成/接收完成中断 (通常共享一个中断向量)TF2
/EXF2
- (增强型51如AT89S52等) 定时器T2溢出/捕获中断
中断处理流程:
中断请求 (Interrupt Request): 中断源事件发生,相应的中断请求标志位(如
TF0
,IE0
等)被硬件置1。中断响应 (Interrupt Response):
当前指令执行完毕。
CPU检查全局中断允许位 (
EA
)和该中断源的中断允许位 (ETx
,EXx
等)是否都为1。检查中断优先级(如果存在更高优先级中断正在执行或被挂起,则需等待)。
满足响应条件后,CPU硬件自动完成:
将当前程序计数器(PC)值压入堆栈(保护断点)。
根据中断源,跳转到固定的程序存储器地址(中断向量地址)。
执行中断服务程序 (Interrupt Service Routine - ISR):
程序员在中断向量地址处放置一条跳转指令 (
LJMP
或AJMP
),跳转到实际的ISR代码。ISR中:
通常首先保护现场(将ISR中会用到的寄存器如
ACC
,PSW
,DPTR
等压入堆栈)。执行处理该中断事件的核心代码。
清除中断请求标志位(对于
TF0
,TF1
等需要软件清零的标志位,必须在ISR中清除,否则会不断触发中断)。恢复现场(弹出堆栈恢复寄存器)。
以
RETI
(Return from Interrupt) 指令结束。RETI
不仅弹出断点地址到PC,还会通知CPU中断处理结束。
中断返回: 执行
RETI
后,CPU从堆栈弹出断点地址到PC,继续执行主程序。
主要寄存器:
IE
(Interrupt Enable Register): 中断允许寄存器。控制各个中断源的开关以及总开关。关键位:
EA
(全局中断允许位),ETx
(定时器x中断允许位),EXx
(外部中断x允许位),ES
(串口中断允许位)。
IP
(Interrupt Priority Register): 中断优先级寄存器。51单片机有2个优先级(高优先级和低优先级)。通过IP
可以设置每个中断源的优先级。高优先级中断可以打断正在执行的低优先级中断,同优先级中断按自然优先级顺序响应(INT0
>TF0
>INT1
>TF1
>RI
/TI
)。TCON
/SCON
: 也包含部分中断请求标志位 (TFx
,IE0
,IE1
,TI
,RI
)。