Skip to content

1.7 定时器实验 ​

学习目标:理解 51 单片机定时器工作原理,掌握定时器中断配置,实现 LED 定时闪烁(替代软件延时)。

实验原理 ​

定时器工作方式 ​

51 单片机有定时器 0(T0)和定时器 1(T1),均为 16 位计数器,计数脉冲来自:

  • 定时模式:内部时钟(每个机器周期加 1)
  • 计数模式:外部引脚脉冲(T0=P3.4,T1=P3.5)
                     ┌─── 溢出 → 触发中断
时钟/脉冲 → 计数寄存器 ─┤
  (THx:TLx 16位)      └─── 查询 TFx 标志

工作方式(TMOD) ​

方式说明位数
方式 013 位定时器THx 高8位 + TLx 低5位
方式 116 位定时器THx 高8位 + TLx 低8位
方式 28 位自动重装重装值存 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) ​

定时时间计数次数初值THxTLx
1ms1000645360xFC0x18
10ms10000555360xD80xF0
50ms50000155360x3C0xB0

定时器 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 / TLx16 位计数寄存器高/低字节
TRx运行控制位(TRx=1 启动)
TFx溢出标志(中断方式自动清)
初值重装方式 1 需在中断中手动重装;方式 2 自动

定时器 vs 软件延时 ​

方式优点缺点
软件延时简单占用 CPU,不能同时做其他事
定时器不占用 CPU 主循环需配置寄存器、中断

常见问题 ​

Q1:定时不准?

  • 检查晶振频率与实际是否一致
  • 检查初值计算是否正确
  • 方式 1 记得在中断中重装初值

Q2:LED 翻转太频繁/太慢?

  • 调整初值(定时时间)或计数次数

Q3:中断不进入?

  • 检查 TR0=1(启动)、ET0=1(使能)、EA=1(总开关)是否齐全

实验任务 ​

  1. 用定时器 0 实现 LED 每 500ms 翻转(呼吸灯基础)
  2. 定时器 1 与定时器 0 同时工作,控制两路 LED 不同频率闪烁
  3. 扩展:用定时器实现 0~99 秒计时器(配合数码管)

考核点 / 验收标准 ​

考核项验收标准分值
初值计算能正确计算定时器初值(如定时 50ms)30
寄存器配置TMOD/TH/TL/TR/ET/EA 配置正确25
定时实现用定时器中断实现 LED 定时闪烁30
原理理解能对比定时器与软件延时的区别15

实操要求:现场计算并实现定时 200ms 翻转(12MHz 晶振)。

aioteer · 物联网专业课程群

💬AI 伴学配置