51单片机电子秤系列__TIMER0_H__
#includeREGX52.H//void Timer0Init(void) //1毫秒12.000MHz计时器T0//{// TMOD 0xF0; //设置定时器模式把TMOD的低4位清零高4位不变// TMOD | 0x01; //设置定时器模式将前4位置0不用T1计时器用T0给最低位置1高4位不变// TL0 0x18; //设置定时初值低位64535%256// TH0 0xFC; //设置定时初值高位64535/256// TF0 0; //清除TF0标志定时器标志0表示使用它// TR0 1; //定时器0开始计时// ET01;//分开关接通1// EA1;//总开关1接通// PT00;//优先级配置//}voidTimer0Init(void)//1毫秒11.0592MHz计时器T0{TMOD0xF0;//设置定时器模式把TMOD的低4位清零高4位不变TMOD|0x01;//设置定时器模式将前4位置0不用T1计时器用T0给最低位置1高4位不变TL00x66;//设置定时初值低位64535%256TH00xFC;//设置定时初值高位64535/256TF00;//清除TF0标志定时器标志0表示使用它TR01;//定时器0开始计时ET01;//分开关接通1EA1;//总开关1接通PT00;//优先级配置}////void Timer0Init(void) //1毫秒12.000MHz计时器T0////{//// TMOD 0x01; //设置定时器模式将前4位置0不用T1计时器用T0// TR0 1; //定时器0开始计时//// TL0 64535%256; //设置定时初值低位64535%256//// TH0 64535/256; //设置定时初值高位64535/256与65535相差1000溢出//// TF0 0; //清除TF0标志定时器标志0表示使用它//// ET01;//分开关接通1//// EA1;//总开关1接通//// PT00;//优先级配置//}/* TMODGATE C/T M1 M0//T1计时器 GATE C/T M1 M0//T0计时器 GATE 0-TR0 1-TL0-TH0-TF0 0-ET01-EA1-PT00(可省略) 设置模式-开始计时-设置范围-清除TF0标志-分开关接通1-总开关1接通-优先级配置 *//* 定时器中断函数模板 void Timer0Routine() interrupt 1//1是T0计时器的中断 { static unsigned int T0Count; TL0 0x18; //设置定时初值 TH0 0xFC; //设置定时初值 T0Count; if(T0Count1000) { T0Count0; } } *///void main()//{// Timer0_Init();// while(1)// {//// }//}//void Timer0Routine() interrupt 1//1是T0计时器的中断//{// static unsigned int T0Count;// TL0 0x18; //设置定时初值// TH0 0xFC; //设置定时初值// T0Count;// if(T0Count1000)//隔一秒执行一次// {// T0Count0;// P1_0~P1_0;//过1秒变一次// }//}#ifndef__TIMER0_H__#define__TIMER0_H__voidTimer0Init(void);#endif1. 引言在 51 单片机开发中定时器Timer是最常用也最基础的外设之一。无论是 LED 闪烁、数码管动态扫描、按键消抖还是产生精确的延时都离不开定时器。本文以STC89C52 / AT89C52系列单片机为例围绕Timer0 定时器从寄存器配置、初始化代码、中断服务函数到实际应用逐行讲解并配以可视化表格与流程图帮助你彻底吃透定时器的用法。2. 定时器核心概念2.1 什么是定时器定时器本质上是一个16 位加法计数器它由两个 8 位寄存器TH0高 8 位和TL0低 8 位拼接而成。当计数溢出从 65535 回到 0时硬件会自动将TF0标志位置 1并向 CPU 发出中断请求。2.2 定时器工作模式Timer0 有 4 种工作模式由TMOD寄存器的M1 M0两位决定模式M1 M0功能说明常见用途模式 00013 位定时器兼容旧 8048很少使用模式 10116 位定时器最常用精确延时、LED 闪烁模式 2108 位自动重装定时器波特率发生器模式 311两个独立 8 位定时器特殊场景本文代码采用模式 116 位定时器这也是初学者最应掌握的模式。2.3 定时器工作流程否是设置 TMOD 工作模式装载初值 TH0/TL0TR0 1 启动计时计数器逐 1 累加是否溢出 65535?TF0 置 1触发中断中断服务函数执行重装初值继续计时3. 寄存器逐位讲解3.1 TMOD 寄存器TMOD是一个 8 位寄存器高 4 位控制 Timer1低 4 位控制 Timer0位76543210名称GATEC/TM1M0GATEC/TM1M0所属Timer1Timer1Timer1Timer1Timer0Timer0Timer0Timer0代码中的两行配置TMOD0xF0;// 把低 4 位清零不影响 Timer1 的高 4 位TMOD|0x01;// 低 4 位 0001即 M10, M01 → 模式 13.2 初值计算定时器从初值开始累加直到 65535 溢出。若晶振为11.0592MHz机器周期为12 / 11.0592MHz ≈ 1.085μs定时 1ms 所需计数为计数个数 1000μs / 1.085μs ≈ 921.6 ≈ 922 初值 65536 - 922 64614 0xFC66因此TH00xFC;// 高 8 位TL00x66;// 低 8 位3.3 各寄存器作用一览寄存器/位作用代码示例TMOD配置工作模式TMOD 0xF0; TMODTH0/TL0装载定时初值TH0 0xFC; TL0 0x66;TF0溢出标志需清零TF0 0;TR0启动/停止计时TR0 1;ET0定时器 0 中断使能分开关ET0 1;EA总中断使能总开关EA 1;PT0中断优先级可省略PT0 0;4. 初始化代码逐行讲解以下为11.0592MHz 晶振、1ms 定时的完整初始化函数voidTimer0Init(void)//1毫秒11.0592MHz计时器T0{TMOD0xF0;//设置定时器模式把TMOD的低4位清零高4位不变TMOD|0x01;//设置定时器模式将前4位置0不用T1计时器用T0给最低位置1高4位不变TL00x66;//设置定时初值低位64535%256TH00xFC;//设置定时初值高位64535/256TF00;//清除TF0标志定时器标志0表示使用它TR01;//定时器0开始计时ET01;//分开关接通1EA1;//总开关1接通PT00;//优先级配置}4.1 逐行解释行号代码作用1TMOD 0xF0;清零低 4 位保留高 4 位不影响 Timer12TMOD 0x01;3TL0 0x66;装载初值低 8 位4TH0 0xFC;装载初值高 8 位5TF0 0;清除溢出标志防止误触发中断6TR0 1;启动定时器开始计时7ET0 1;打开定时器 0 中断分开关8EA 1;打开总中断总开关9PT0 0;设为低优先级可省略注意TMOD 0xF0与TMOD | 0x01的顺序不能颠倒否则会先清掉刚设置的位。5. 中断服务函数定时器溢出后CPU 自动跳转到中断服务函数。interrupt 1表示这是Timer0 的中断向量号voidTimer0Routine()interrupt1{staticunsignedintT0Count;TL00x66;//重装初值TH00xFC;//重装初值T0Count;if(T0Count1000)//累计 1000 次 1 秒{T0Count0;P1_0~P1_0;//LED 翻转}}5.1 为什么需要重装初值定时器溢出后自动归零若不重装初值下一次计时将从 0 开始导致定时不准。因此在中断函数开头必须重新写入TH0和TL0。5.2 中断流程否是1ms 定时溢出进入中断服务函数重装初值 TH0/TL0T0CountT0Count 1000?返回主程序T0Count 0P1_0 翻转6. 主函数与完整应用voidmain(){Timer0Init();//初始化定时器while(1){//主循环可做其他任务}}6.1 应用效果定时周期累计次数实际效果1ms1定时器中断触发1ms1000约 1 秒1ms1000LED 翻转一次通过修改T0Count的阈值可以灵活控制 LED 闪烁频率无需占用 CPU 主循环。7. 头文件封装将初始化函数封装到头文件便于多文件工程复用// Timer0.h#ifndef__TIMER0_H__#define__TIMER0_H__voidTimer0Init(void);#endif// main.c#includeREGX52.H#includeTimer0.hvoidmain(){Timer0Init();while(1);}8. 常见问题与调试技巧问题可能原因解决方案LED 不闪烁未开总中断EA检查EA 1;定时不准晶振频率与初值不匹配按实际晶振重算初值中断不触发ET0未置 1检查分开关程序跑飞初值未重装中断函数内重装TH0/TL09. 总结本文从寄存器、初值计算、初始化代码、中断服务函数到完整应用系统讲解了 51 单片机 Timer0 定时器的用法。核心要点模式选择TMOD | 0x01选择 16 位模式初值装载根据晶振频率计算TH0/TL0中断使能ET0 1分开关EA 1总开关初值重装中断函数内必须重新装载初值。掌握定时器后你可以进一步学习 PWM 输出、频率测量、数码管动态扫描等进阶应用。

相关新闻

从Apollo-11学复杂项目交付:目标定义、接口契约与故障预案

从Apollo-11学复杂项目交付:目标定义、接口契约与故障预案

我常常觉得,Apollo-11 是工程史上最值得反复拆解的项目代号之一。它不只是一次登月,更是一整套关于“如何在巨大不确定性下交付复杂系统”的实践样本。你可能没有造过火箭,但只要带过复杂项目、写过跨端系统、为一堆需求做过排期,…

2026/10/14 10:02:03 阅读更多 →
高比例可再生能源电力系统优化调度与N-k安全分析

高比例可再生能源电力系统优化调度与N-k安全分析

1. 项目背景与核心价值 在新能源占比逐渐提高的现代电力系统中,如何协调风电、光伏和光热电站的出力特性,同时确保系统在N-k故障情况下的安全稳定运行,是电力调度领域亟待解决的关键问题。这个开源项目提供了一个基于Matlab的优化调度模型&am…

2026/10/14 10:02:03 阅读更多 →
金蝶分布式调出同步到聚水潭其他出库单:实战教程

金蝶分布式调出同步到聚水潭其他出库单:实战教程

内容摘要This tutorial focuses on a single inventory sync strategy: converting Kingdee Cloud Galaxy distributed outbound documents into Jushuitan other outbound orders through Qeasy. It covers scenario value, data flow, configuration essentials, phased impl…

2026/10/14 10:02:03 阅读更多 →

最新新闻

Android Jetpack Room+Paging3列表分页加载实践

Android Jetpack Room+Paging3列表分页加载实践

做客户端开发这些年,最绕不开的一个场景就是列表页。从服务端拉一批数据,塞进 RecyclerView,用户滑到底了再翻下一页,Cache 层再做一次去重合并。这个需求看着简单,落到工程上就会牵扯出数据库写入策略、分页加载状态、…

2026/10/14 16:52:02 阅读更多 →
Linux安卓驱动开发实战:从寄存器到App的完整链路

Linux安卓驱动开发实战:从寄存器到App的完整链路

今年的就业环境大家心里都有数,嵌入式Linux和安卓底层方向看起来永远缺人,但要拿下一个满意的Offer,难度一点不比卷后端低。我做了这么多年系统底层开发,也当过面试官,最大的感受是:简历上写着“熟悉Linux驱…

2026/10/14 16:52:02 阅读更多 →
异步SAR数字控制逻辑综合后出错:五大根因与排查实战

异步SAR数字控制逻辑综合后出错:五大根因与排查实战

干过异步SAR数字控制逻辑的人,十有八九都经历过这么一个场景:RTL功能仿真跑得干干净净,波形漂亮得像教科书,结果逻辑综合完,网表仿真一跑,输出就开始随机抽风——某一比特判错了、某个事件信号丢了、甚至整…

2026/10/14 16:52:02 阅读更多 →
pi coding agent CLI 深度解析:agent loop、subagent 与 TUI 启动排查

pi coding agent CLI 深度解析:agent loop、subagent 与 TUI 启动排查

1. 从"pi"这个极简名字说起:它到底是个什么东西第一次看到"pi"这个名字,我以为是那个圆周率,或者是树莓派(Raspberry Pi)的简称。直到我在几个技术社区反复刷到pi agent、pi coding agent、pi sub…

2026/10/14 16:52:02 阅读更多 →
机房精密空调怎么选?从显热比到液冷,避开五大选型误区

机房精密空调怎么选?从显热比到液冷,避开五大选型误区

去年帮朋友看一个机房空调改造方案,预算批下来了,参数表也反复核对过,结果设备进场安装时才发现,设计负荷还是按传统中密度机房算的,机柜实际功率密度早就翻了一倍。没办法,只能临时加装列间空调补位&#…

2026/10/14 16:52:02 阅读更多 →
Android自定义View实战:从零绘制带刻度的码表组件

Android自定义View实战:从零绘制带刻度的码表组件

前阵子接了个终端项目,首页需要一个带刻度的速度码表,既要实时显示当前速度,又要有那种指针缓慢抬起的机械感。我第一时间想到的是搜现成库,但找了一圈都不太合胃口:要么样式没法精确控制,要么引入一堆用不…

2026/10/14 16:51:01 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →