STC8H8K64U 定时器 定时器应用开发指南 · 寄存器详解 · C代码示例

⏱️ STC8H8K64U 定时器

定时器应用开发指南 · 寄存器详解 · C代码示例

T0 T1 T2 T3 T4

STC8H8K64U内部集成了 5个16位定时器(定时器0~4)。 其中 定时器0和定时器1的模式0为16位自动重载模式定时器0的模式3具有NMI(不可屏蔽中断)功能。 均可配置为1T或12T模式,实现精准定时。

定时器中断工作流程

🔧 系统初始化阶段(以定时器0为例)

📌
设置I/O口模式
PxM0, PxM1
⚙️
配置工作模式
TMOD / AUXR
🔢
写入定时初值
TH0, TL0
🛡️
设置中断允许
ET0=1, EA=1
▶️
启动定时器
TR0=1

⚡ 中断响应阶段

🏃
主程序运行
📈
定时器计数溢出
🚩
TF0硬件置1
🔄
PC→中断向量
📋
执行ISR / TF0硬件清零
↩️
RETI返回主程序
⚠️ 编程要点(陈桂友教授教学): 总中断EA打开 → 需要用的外设中断打开 → 如有需要就设置中断优先级 → 中断处理函数尽量简短,不要用延时函数。

定时器相关寄存器说明(以定时器0为例)

2.1 TMOD(定时器模式寄存器)

地址0x89,不可位寻址,必须整体操作

D7 D6 D5 D4 D3 D2 D1 D0
名称 GATE C/T M1 M0 GATE C/T M1 M0
控制 定时器1 定时器0
GATE(门控位)
=0 软件启动(TRn控制)
=1 硬件门控(TRn+INTn)
C/T(模式选择)
=0 定时器(内部时钟)
=1 计数器(外部脉冲)
M1、M0(模式选择)
00 模式0,16位自动重载
11 模式3,最高中断优先级的16位自动重载
配置示例:
TMOD &= 0xF0;
TMOD |= 0x00; // T0:GATE=0, C/T=0, 16位自动重载

2.2 TCON(定时器控制寄存器)

地址0x88,可位寻址

D7D6 D5D4 D3D2 D1D0
名称 TF1TR1 TF0TR0 IE1IT1 IE0IT0
TF1/TF0:中断标志位
溢出时硬件置1,进入中断后硬件自动清零
TR1/TR0:运行控制位
=1 启动定时器 | =0 停止定时器

2.3 AUXR(辅助寄存器)

用于设置T0、T1、T2的速度模式

D7 D6 D5 D4 D3 D2 D1 D0
名称 T0x12 T1x12 UART_M0x6 T2R T2_C/T T2x12 EXTRAM S1ST2
T0x12 / T1x12: =0 12分频(12T模式,兼容经典8051) | =1 不分频(1T模式,速度约快12倍)

📋 定时器中断向量表

中断源 中断向量号 说明
定时器0interrupt 1T0溢出中断
定时器1interrupt 3T1溢出中断
定时器2interrupt 12T2溢出中断
定时器3interrupt 19T3溢出中断
定时器4interrupt 20T4溢出中断

🔢 定时器初值计算公式

12T模式(T0x12=0)
初值 = 65536 − T定时 × fosc / 12
1T模式(T0x12=1)
初值 = 65536 − T定时 × fosc
示例:系统时钟24MHz、定时1ms(1T模式)
初值 = 65536 − 0.001 × 24000000 = 65536 − 24000 = 41536 = 0xA240
即 TH0 = 0xA2, TL0 = 0x40。
💡推荐使用STC-ISP工具自动计算定时器初值。

C语言示例代码

💡 定时器0中断控制LED闪烁(1ms中断)

系统时钟24MHz · 1T模式 · P2.0 LED 1秒周期闪烁

/*============================================================
 * 文件名   : timer0_interrupt.c
 * 芯片型号 : STC8H8K64U
 * 系统时钟 : 24MHz
 * 功能描述 : 定时器0中断控制LED闪烁,1秒周期
 *============================================================*/

#include "stc8h8k64u.h"

sbit LED = P2^0;
unsigned int g_Timer0_Count = 0;

void Timer0_Init(void)
{
    // 1. 配置定时器0为16位自动重载模式
    TMOD &= 0xF0;       // 清零T0字段
    TMOD |= 0x00;       // 16位自动重载模式
    
    // 2. 设置1T模式(不分频)
    AUXR |= 0x80;       // T0x12=1
    
    // 3. 装载定时初值(1ms @ 24MHz)
    TL0 = 0x40;         // 低字节
    TH0 = 0xA2;         // 高字节
    
    // 4. 开启中断
    TF0 = 0;            // 清除T0溢出中断标志
    ET0 = 1;            // 允许定时器0中断
    EA  = 1;            // 开启总中断
    
    // 5. 启动定时器0
    TR0 = 1;            // T0开始运行
}

void Timer0_ISR(void) interrupt 1
{
    // 16位自动重载模式下,硬件自动重载TH0/TL0,TF0硬件自动清零
    g_Timer0_Count++;
    if(g_Timer0_Count >= 1000)  // 1000次 = 1秒
    {
        g_Timer0_Count = 0;
        LED = ~LED;       // LED翻转
    }
}

void main(void)
{
    P2M0 = 0x00; P2M1 = 0x00;  // P2口准双向口
    LED = 1;                    // 初始熄灭
    Timer0_Init();               // 定时器初始化
    while(1) { }                 // 主循环
}

🚀 扩展示例:多定时器联合使用

STC8H8K64U还支持定时器2/3/4,它们的配置方式类似,使用T4T3MAUXRIE2寄存器。中断向量号分别为12、19、20。推荐使用STC-ISP工具生成初始化代码。

定时器使用要点与常见问题

🔸 1T模式 vs 12T模式:1T模式每个机器周期为1个时钟周期,速度快、精度高;12T模式兼容传统8051,但定时精度较低。通常推荐使用1T模式。
🔸 16位自动重载优势:定时器0/1的模式0(M1M0=00)为16位自动重载,溢出后硬件自动重装TH0/TL0初值,无需在ISR中手动装载,减少了中断延迟。
🔸 中断优先级:定时器0的模式3具有NMI功能,可用作最高优先级定时。其他定时器优先级可通过IP/IP2寄存器配置。
🔸 ISR编写原则:中断服务函数应尽量简短,避免使用延时函数,也不要在ISR中做复杂运算。如需处理耗时任务,可在ISR中设置标志位,由主循环检测并处理。

📚 参考资料

📖 官方数据手册
STC官网下载
stcmicro.com
🛠️ STC-ISP工具
内置定时器初值计算器、范例程序
📘 参考教材
丁向荣 · 清华大学出版社
💬 STC官方论坛
爱好者社区
stcaimcu.com
STC8H8K64U · 5个16位定时器 · 22个中断源 · 4级中断优先级 · 精准高效定时

本站所有文章、数据、图片来源于网络,仅供学习使用,如有侵权,联系删除!