STC8H8K64U 定时器 定时器应用开发指南 · 寄存器详解 · C代码示例
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,可位寻址
| 位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 名称 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
TF1/TF0:中断标志位
溢出时硬件置1,进入中断后硬件自动清零
溢出时硬件置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倍)
📋 定时器中断向量表
| 中断源 | 中断向量号 | 说明 |
|---|---|---|
| 定时器0 | interrupt 1 | T0溢出中断 |
| 定时器1 | interrupt 3 | T1溢出中断 |
| 定时器2 | interrupt 12 | T2溢出中断 |
| 定时器3 | interrupt 19 | T3溢出中断 |
| 定时器4 | interrupt 20 | T4溢出中断 |
🔢 定时器初值计算公式
12T模式(T0x12=0)
初值 = 65536 − T定时 × fosc / 12
1T模式(T0x12=1)
初值 = 65536 − T定时 × fosc
示例:系统时钟24MHz、定时1ms(1T模式)
即 TH0 = 0xA2, TL0 = 0x40。
💡推荐使用STC-ISP工具自动计算定时器初值。
初值 = 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,它们的配置方式类似,使用T4T3M、AUXR和IE2寄存器。中断向量号分别为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级中断优先级 · 精准高效定时
本站所有文章、数据、图片来源于网络,仅供学习使用,如有侵权,联系删除!