1,定时器中断核心基础总览

定时器中断:定时器计数溢出时,硬件自动触发中断,CPU 暂停主程序执行中断服务函数,是单片机定时控制、延时、周期任务的核心方式。

中断名称 中断号 入口地址 核心控制寄存器 中断标志
定时器 0 中断 (T0) 1 000BH TMOD、TCON、IE、IP TF0
定时器 1 中断 (T1) 3 001BH TMOD、TCON、IE、IP TF1
核心特性

<1> 16 位自动计数,支持定时模式(内部时钟)/计数模式(外部脉冲)

<2> 4 种工作模式,模式 1(16 位定时)最常用

<3> 溢出标志TF0/TF1:硬件自动置 1,响应中断后自动清 0

<4> 独立中断使能、两级优先级,支持中断嵌套

2,核心控制寄存器(表格逐位详解)

(1)TMOD 定时器模式寄存器(地址:89H,不可位寻址

作用:配置定时器 0/1 的工作模式、定时 / 计数选择、门控

位序号 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
位符号 GATE C/T M1 M0 GATE C/T M1 M0
归属 定时器 1 定时器 1 定时器 1 定时器 1 定时器 0 定时器 0 定时器 0 定时器 0
功能含义 门控位1 = 外部引脚控制 1 = 计数模式0 = 定时模式 模式选择位 模式选择位 门控位1 = 外部引脚控制 1 = 计数模式0 = 定时模式 模式选择位 模式选择位

模式选择(M1M0)

  • 00:模式 0(13 位,极少用)
  • 01:模式 1(16 位定时 / 计数,最常用
  • 10:模式 2(8 位自动重装)
  • 11:模式 3(仅 T0 可用,拆分模式)
(2)TCON 定时器 / 中断控制寄存器(地址:88H,可位寻址)

作用:控制定时器启停、中断标志位,TR0/TR1分别开始启动定时器0/1,TF0/1当计时溢出后会被硬件置1。

位序号 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
位符号 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
功能含义 T1 溢出标志硬件置 1 T1 启动控制1 = 启动 T0 溢出标志硬件置 1 T0 启动控制1 = 启动 外部中断 1 标志 外部中断 1 触发 外部中断 0 标志 外部中断 0 触发
(3)IE 中断允许寄存器(地址:A8H,可位寻址)

作用:总中断开关 + 定时器中断使能,ET0=1使能T0中断,ET1=1使能T1中断,EA=1使能全局中断。

位序号 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
位符号 EA - - - ET1 - ET0 -
功能含义 总中断使能1 = 开启 保留 保留 保留 T1 中断使能1 = 开启 保留 T0 中断使能1 = 开启 保留
(4)IP 中断优先级寄存器(地址:B8H,可位寻址)

作用:设置定时器中断优先级,bit1 PT0=1置T0为高优先级否则低优先级,bit3 PT1=1置T1为高优先级否则低优先级。

位序号 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
位符号 - - - - PT1 - PT0 -
功能含义 保留 保留 保留 保留 T1 优先级1 = 高 保留 T0 优先级1 = 高 保留
(5)TH0/TL0、TH1/TL1 寄存器

这 4 个都是定时器计数寄存器,是定时器中断的核心硬件单元,负责计数、定时、溢出触发中断。

寄存器名称 全称 归属 位数 功能
TH0 Timer0 High 8-bit 定时器 0 高 8 位 存储定时初值 / 自动重装值
TL0 Timer0 Low 8-bit 定时器 0 低 8 位 实际计数单元
TH1 Timer1 High 8-bit 定时器 1 高 8 位 存储 16 位定时初值
TL1 Timer1 Low 8-bit 定时器 1 低 8 位 存储 16 位定时初值
通用工作原理

<1> 定时器启动后,每 1 个机器周期 +1

<2> 计数到最大值 → 溢出 → 触发中断

<3> 溢出标志位 TF0/TF1 硬件置 1

<4> CPU 响应中断,执行中断服务函数

晶振:11.0592MHz

机器周期 = 12 个时钟周期 = 1.085μs

3, 定时器中断标志查询方法

通过TF0、TF1可在主程序中主动查询定时器是否溢出:

    if(TF0 == 1)  // 查询定时器0是否溢出
    {
        TF0 = 0;  // 软件清零
        // 处理逻辑
    }

    if(TF1 == 1)  // 查询定时器1是否溢出
    {
        TF1 = 0;  // 软件清零
        // 处理逻辑
    }

4、定时器中断服务函数

    // 定时器0中断函数(中断号 1)
    void Timer0_ISR(void) interrupt 1 
    {
        // 定时溢出后执行的代码
    }

    // 定时器1中断函数(中断号 3)
    void Timer1_ISR(void) interrupt 3 
    {
        // 定时溢出后执行的代码
    }

5,定时器中断 标准配置步骤

(1)配置工作模式TMOD 赋值(如0x01=T0 模式 1)

(2)装载定时初值TH0/TL0、TH1/TL1(决定定时时间)

(3)开启定时器中断ET0=1 / ET1=1

(4)开启总中断EA=1(必备)

(5)启动定时器TR0=1 / TR1=1

(6)编写中断服务函数

6,示例程序

(1)示例 1:定时器 0 → 8 位自动重装中断(模式 2)

功能:定时200μs 自动触发中断,反转 LED,无需手动重装初值

    #include <reg52.h>
    sbit LED0 = P2^4;  

    unsigned short int count = 0;

    // 定时器0中断服务函数
    void Timer0_ISR(void) interrupt 1
    {
            // ============== 核心:无需重装初值!硬件自动加载 TH0 ==============
          count ++;
            if(count >= 1000)
            {
                count = 0;

                LED0 = ~LED0;  		

            }
    }

    void main(void)
    {
            // 1. 配置模式:定时器0 模式2(8位自动重装)
            TMOD = 0x02;   

            // 2. 自动重装初值(200μs):TH0 = 重装值,TL0自动加载
            TH0 = 256 - 200;  // 自动重装值存入TH0
            TL0 = 256 - 200;  // 初始值

            // 3. 开启中断
            ET0 = 1;    // 使能定时器0中断
            EA  = 1;    // 开启总中断

            // 4. 启动定时器0
            TR0 = 1;    

            while(1);
    }
(2)示例 2:定时器 1 → 16 位不可自动重装中断(模式 1)

功能:定时50ms 触发中断,必须手动重装初值

    #include <reg52.h>
    sbit LED1 = P2^5;  

    // 定时器1中断服务函数
    void Timer1_ISR(void) interrupt 3
    {
        // ============== 核心:必须手动重装16位初值 ==============
        TH1 = (65536 - 50000) / 256;
        TL1 = (65536 - 50000) % 256;

        LED1 = ~LED1;
    }

    void main(void)
    {
        // 1. 配置模式:定时器1 模式1(16位,不可自动重装)
        TMOD = 0x10;   

        // 2. 装载50ms初始值
        TH1 = (65536 - 50000) / 256;
        TL1 = (65536 - 50000) % 256;

        // 3. 开启中断
        ET1 = 1;
        EA  = 1;

        // 4. 启动定时器1
        TR1 = 1;    

        while(1);
    }
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐