1.7 定时器实验
学习目标:理解 51 单片机定时器工作原理,掌握定时器中断配置,实现 LED 定时闪烁(替代软件延时)。
实验原理
定时器工作方式
51 单片机有定时器 0(T0)和定时器 1(T1),均为 16 位计数器,计数脉冲来自:
- 定时模式:内部时钟(每个机器周期加 1)
- 计数模式:外部引脚脉冲(T0=P3.4,T1=P3.5)
┌─── 溢出 → 触发中断
时钟/脉冲 → 计数寄存器 ─┤
(THx:TLx 16位) └─── 查询 TFx 标志工作方式(TMOD)
| 方式 | 说明 | 位数 |
|---|---|---|
| 方式 0 | 13 位定时器 | THx 高8位 + TLx 低5位 |
| 方式 1 | 16 位定时器 | THx 高8位 + TLx 低8位 |
| 方式 2 | 8 位自动重装 | 重装值存 THx |
| 方式 3 | 仅 T0,拆为两个 8 位 | - |
本课程重点掌握方式 1(16 位)和方式 2(8 位自动重装)。
初值计算(方式 1)
定时时间 = (2^16 - 初值) × 机器周期
- 12MHz 晶振:机器周期 = 12/12MHz = 1µs
- 定时 50ms:需要计数 50000 个机器周期
- 初值 = 65536 - 50000 = 15536 = 0x3CB0
TH1 = 0x3C; TL1 = 0xB0; // 定时50ms(12MHz)程序设计
定时器 0 中断定时 50ms,LED 每 500ms 翻转
c
/****************************************************
* 实验名称:定时器0中断——LED定时闪烁
* 功能:T0 每 50ms 中断一次,10 次翻转一次 LED
****************************************************/
#include <reg51.h>
sbit LED = P1^0;
unsigned char count = 0; // 计数变量
// 定时器0中断服务函数(中断号1)
void timer0_isr(void) interrupt 1
{
TH0 = 0x3C; // 重装初值(定时50ms)
TL0 = 0xB0;
count++; // 计数值+1
if (count >= 10) // 累计 500ms
{
count = 0;
LED = ~LED; // 翻转 LED
}
}
void main(void)
{
TMOD = 0x01; // 定时器0,方式1(16位)
TH0 = 0x3C; // 初始初值
TL0 = 0xB0;
ET0 = 1; // 使能定时器0中断
EA = 1; // 开总中断
TR0 = 1; // 启动定时器0
while (1)
{
// 主循环可做其他事
}
}定时器初值速查表(12MHz,机器周期 1µs)
| 定时时间 | 计数次数 | 初值 | THx | TLx |
|---|---|---|---|---|
| 1ms | 1000 | 64536 | 0xFC | 0x18 |
| 10ms | 10000 | 55536 | 0xD8 | 0xF0 |
| 50ms | 50000 | 15536 | 0x3C | 0xB0 |
定时器 2(方式 2 自动重装示例)
c
// 方式2:8位自动重装,TL0计数,TH0自动重装
TMOD = 0x02; // 定时器0,方式2
TH0 = 0x38; // 重装值 = 初值
TL0 = 0x38; // 计数初值(定时 200µs)
TR0 = 1;关键知识点
| 知识点 | 说明 |
|---|---|
| TMOD | 工作方式寄存器,低 4 位控制 T0,高 4 位控制 T1 |
| THx / TLx | 16 位计数寄存器高/低字节 |
| TRx | 运行控制位(TRx=1 启动) |
| TFx | 溢出标志(中断方式自动清) |
| 初值重装 | 方式 1 需在中断中手动重装;方式 2 自动 |
定时器 vs 软件延时
| 方式 | 优点 | 缺点 |
|---|---|---|
| 软件延时 | 简单 | 占用 CPU,不能同时做其他事 |
| 定时器 | 不占用 CPU 主循环 | 需配置寄存器、中断 |
常见问题
Q1:定时不准?
- 检查晶振频率与实际是否一致
- 检查初值计算是否正确
- 方式 1 记得在中断中重装初值
Q2:LED 翻转太频繁/太慢?
- 调整初值(定时时间)或计数次数
Q3:中断不进入?
- 检查
TR0=1(启动)、ET0=1(使能)、EA=1(总开关)是否齐全
实验任务
- 用定时器 0 实现 LED 每 500ms 翻转(呼吸灯基础)
- 定时器 1 与定时器 0 同时工作,控制两路 LED 不同频率闪烁
- 扩展:用定时器实现 0~99 秒计时器(配合数码管)
考核点 / 验收标准
| 考核项 | 验收标准 | 分值 |
|---|---|---|
| 初值计算 | 能正确计算定时器初值(如定时 50ms) | 30 |
| 寄存器配置 | TMOD/TH/TL/TR/ET/EA 配置正确 | 25 |
| 定时实现 | 用定时器中断实现 LED 定时闪烁 | 30 |
| 原理理解 | 能对比定时器与软件延时的区别 | 15 |
实操要求:现场计算并实现定时 200ms 翻转(12MHz 晶振)。