【普中51单片机开发攻略--基于普中-2普中-3普中-4】-- 第 21 章 定时器中断 📅 发布时间:2026/7/7 18:27:21 👁️ 浏览次数: (1)实验平台普中51单片机开发板-A2A3A4上一章我们介绍了 51 单片机的外部中断 学习了如何配置 51 单片机的外部中断。 这一章我们来学习 51 单片机的定时器中断。 STC89C5X 含有 3 个定时器定时器 0、 定时器 1、 定时器 2注意 51 系列单片机一定有基本的 2 个定时器定时器 0 和定时器 1 但不全有 3 个中断 需要查看芯片手册 通常我们使用的是基本的 2 个定时器 定时器 0/1 。 本章以定时器 0 为例进行讲解 让大家学会 51 单片机定时器的使用 定时器 1 的使用方法与定时器 0 一样。 本章要实现的功能是 通过定时器 0 中断控制 D1 指示灯间隔 1 秒闪烁。 学习本章可以参考前面的实验章节内容。 本章分为如下几部分内容21.1 定时器介绍21.1.1 51 单片机定时器原理21.1.2 51 单片机定时/计数器结构21.1.3 51 单片机定时/计数器的工作方式21.2 定时器配置21.3 硬件设计21.4 软件设计21.5 实验现象21.1 定时器介绍在介绍定时器之前先科普下几个知识1 CPU 时序的有关知识①振荡周期 为单片机提供定时信号的振荡源的周期晶振周期或外加振荡周期 。②状态周期 2 个振荡周期为 1 个状态周期 用 S 表示。 振荡周期又称 S 周期或时钟周期。③机器周期 1 个机器周期含 6 个状态周期 12 个振荡周期。④指令周期 完成 1 条指令所占用的全部时间 它以机器周期为单位。例如 外接晶振为 12MHz 时 51 单片机相关周期的具体值为振荡周期1/12us;状态周期1/6us;机器周期1us;指令周期1~4us;2 学习定时器前需要明白的几点①51 单片机有两组定时器/计数器 因为既可以定时 又可以计数 故称之为定时器/计数器。②定时器/计数器和单片机的 CPU 是相互独立的。 定时器/计数器工作的过程是自动完成的 不需要 CPU 的参与。③51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加 1。有了定时器/计数器之后 可以增加单片机的效率 一些简单的重复加 1 的工作可以交给定时器/计数器处理。 CPU 转而处理一些复杂的事情。 同时可以实现精确定时作用。21.1.1 51 单片机定时器原理STC89C5X 单片机内有两个可编程的定时/计数器 T0、 T1 和一个特殊功能定时器 T2。 定时/计数器的实质是加 1 计数器16 位 由高 8 位和低 8 位两个寄存器 THx 和 TLx 组成。 它随着计数器的输入脉冲进行自加 1 也就是每来一个脉冲 计数器就自动加 1 当加到计数器为全 1 时 再输入一个脉冲就使计数器回零 且计数器的溢出使相应的中断标志位置 1 向 CPU 发出中断请求定时/计数器中断允许时 。 如果定时/计数器工作于定时模式 则表示定时时间已到如果工作于计数模式 则表示计数值已满。 可见 由溢出时计数器的值减去计数初值才是加 1 计数器的计数值。21.1.2 51 单片机定时/计数器结构51 单片机定时器/计数器内部结构如下所示上图中的 T0 和 T1 引脚对应的是单片机 P3.4 和 P3.5 管脚。 51 单片机定时/计数器的工作由两个特殊功能寄存器控制。 TMOD 是定时/计数器的工作方式寄存器 确定工作方式和功能 TCON 是控制寄存器 控制 T0、 T1 的启动和停止及设置溢出标志。1 工作方式寄存器 TMOD工作方式寄存器 TMOD 用于设置定时/计数器的工作方式 低四位用于 T0 高四位用于 T1。 其格式如下GATE 是门控位, GATE0 时 用于控制定时器的启动是否受外部中断源信号的影响。 只要用软件使 TCON 中的 TR0 或 TR1 为 1 就可以启动定时/计数器工作 GATA1 时 要用软件使 TR0 或 TR1 为 1 同时外部中断引脚 INT0/1 也为高电平时 才能启动定时/计数器工作。 即此时定时器的启动条件 加上了 INT0/1 引脚为高电平这一条件。C/T :定时/计数模式选择位。 C/T 0 为定时模式;C/T 1 为计数模式。M1M0 工作方式设置位。 定时/计数器有四种工作方式。2 控制寄存器 TCONTCON 的低 4 位用于控制外部中断,已在前面介绍。 TCON 的高 4 位用于控制定时/计数器的启动和中断申请。 其格式如下TF1TCON.7 T1 溢出中断请求标志位。 T1 计数溢出时由硬件自动置 TF1为 1。 CPU 响应中断后 TF1 由硬件自动清 0。 T1 工作时 CPU 可随时查询 TF1 的状态。 所以 TF1 可用作查询测试的标志。 TF1 也可以用软件置 1 或清 0 同硬件置 1 或清 0 的效果一样。TR1TCON.6 T1 运行控制位。 TR1 置 1 时 T1 开始工作 TR1 置 0 时 T1 停止工作。 TR1 由软件置 1 或清 0。 所以 用软件可控制定时/计数器的启动与停止。TF0TCON.5 T0 溢出中断请求标志位 其功能与 TF1 类同。TR0TCON.4 T0 运行控制位 其功能与 TR1 类同。21.1.3 51 单片机定时/计数器的工作方式1 方式 0方式 0 为 13 位计数 由 TL0 的低 5 位高 3 位未用 和 TH0 的 8 位组成。TL0 的低 5 位溢出时向 TH0 进位 TH0 溢出时 置位 TCON 中的 TF0 标志 向 CPU发出中断请求。 其结构图如下所示门控位 GATE 具有特殊的作用。 当 GATE0 时 经反相后使或门输出为 1 此时仅由 TR0 控制与门的开启 与门输出 1 时 控制开关接通 计数开始 当 GATE1时 由外中断引脚信号控制或门的输出 此时控制与门的开启由外中断引脚信号和 TR0 共同控制。 当 TR01 时 外中断引脚信号引脚的高电平启动计数 外中断引脚信号引脚的低电平停止计数。 这种方式常用来测量外中断引脚上正脉冲的宽度。 计数模式时 计数脉冲是 T0 引脚上的外部脉冲。 计数初值与计数个数的关系为 X213-N。2 方式 1方式 1 的计数位数是 16 位 由 TL0 作为低 8 位 TH0 作为高 8 位 组成了16 位加 1 计数器。 其结构图如下所示计数初值与计数个数的关系为 X216-N。3 方式 2方式 2 为自动重装初值的 8 位计数方式。 工作方式 2 特别适合于用作较精确的脉冲信号发生器。 其结构图如下所示计数初值与计数个数的关系为 X28-N。4 方式 3方式 3 只适用于定时/计数器 T0 定时器 T1 处于方式 3 时相当于 TR10停止计数。 工作方式 3 将 T0 分成为两个独立的 8 位计数器 TL0 和 TH0。 其结构如下所示这几种工作方式中应用较多的是方式 1 和方式 2。 定时器中通常使用定时器方式 1 串口通信中通常使用方式 2。21.2 定时器配置在使用定时器时 应该如何配置使其工作 其步骤如下 各步骤顺序可任意 ①对 TMOD 赋值 以确定 T0 和 T1 的工作方式 如果使用定时器 0 即对 T0 配置 如果使用定时器 1 即对 T1 配置。②根据所要定时的时间计算初值,并将其写入 TH0、 TL0 或 TH1、 TL1。③如果使用中断 则对 EA 赋值 开放定时器中断。④使 TR0 或 TR1 置位 启动定时/计数器定时或计数。上述中有一个定时/计数器初值的计算 下面我们来看下如何计算定时/计数器初值。前面我们介绍过机器周期的概念 它是 CPU 完成一个基本操作所需要的时间。其计算公式是 机器周期1/单片机的时钟频率。 51 单片机内部时钟频率是外部时钟的 12 分频 也就是说当外部晶振的频率输入到单片机里面的时候要进行 12分频。 比如说你用的是 12MHZ 晶振 那么单片机内部的时钟频率就是 12/12MHZ当你使用 12MHZ 的外部晶振的时候 机器周期1/1M1us。 如果我们想定时 1ms的初值是多少呢 1ms/1us1000。 也就是要计数 1000 个 初值65535-10001 因为实际上计数器计数到 65536 2 的 16 次方 才溢出 所以后面要加 1 64536FC18H 所以初值即为 THx0XFC TLx0X18。知道了如何计算定时/计数器初值 那么想定时多长时间都可以计算出 当然由于定时计数器位数有限 我们不可能直接通过初值定时很长时间 如果要实现很长时间的定时 比如定时 1 秒钟。 可以通过初值设置定时 1ms 每当定时 1ms结束后又重新赋初值 并且设定一个全局变量累计定时 1ms 的次数 当累计到1000 次 表示已经定时 1 秒了。 需要其他定时时间类似操作 这样我们就可以使用定时器来实现精确延时来替代之前的 delay 函数。这里以定时器 0 为例介绍配置定时器工作方式 1、 设定 1ms 初值 开启定时器计数功能以及总中断 如下void time0_init(void) { TMOD|0X01;//选择为定时器0模式工作方式1 TH00XFC; //给定时器赋初值定时1ms TL00X18; ET01;//打开定时器0中断允许 EA1;//打开总中断 TR01;//打开定时器 }对于定时器 1 的使用方法是一样的 只是将上述的 0 变为 1 即可 具体可参考我们定时器 1 实验例程。21.3 硬件设计本实验使用到硬件资源如下1 LED 模块D12 定时器 0本章硬件电路非常简单 只使用到开发板上 LED 模块的 D1 至于定时器 0它属于 51 单片机内部资源 只需通过软件配置即可使用。 开发板上 LED 模块电路在前面已经介绍 这里就不多说。21.4 软件设计本章所要实现的功能是 通过定时器 0 中断控制 D1 指示灯间隔 1 秒闪烁。我们打开“\4--实验程序\1--基础实验\17-定时器实验\17.1-定时器 0 实验”工程 控制代码全部都在 main.c 中 代码如下/************************************************************************************** 深圳市普中科技有限公司PRECHIN 普中 技术支持www.prechin.net PRECHIN 普中 实验名称定时器0实验 接线说明 实验现象下载程序后D1指示灯间隔1s闪烁 注意事项 ***************************************************************************************/ #include reg52.h typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8; //定义LED1管脚 sbit LED1P2^0; /******************************************************************************* * 函 数 名 : delay_10us * 函数功能 : 延时函数ten_us1时大约延时10us * 输 入 : ten_us * 输 出 : 无 *******************************************************************************/ void delay_10us(u16 ten_us) { while(ten_us--); } /******************************************************************************* * 函 数 名 : time0_init * 函数功能 : 定时器0中断配置函数通过设置TH和TL即可确定定时时间 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void time0_init(void) { TMOD|0X01;//选择为定时器0模式工作方式1 TH00XFC; //给定时器赋初值定时1ms TL00X18; ET01;//打开定时器0中断允许 EA1;//打开总中断 TR01;//打开定时器 } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { time0_init();//定时器0中断配置 while(1) { } } void time0() interrupt 1 //定时器0中断函数 { static u16 i;//定义静态变量i TH00XFC; //给定时器赋初值定时1ms TL00X18; i; if(i1000) { i0; LED1!LED1; } }实验代码非常简单 首先定义 LED1 指示灯控制管脚 然后定义定时器 0 中断配置函数 time0_init 该函数配置内容就是按照前面介绍的配置方法所写即选择定时器工作模式 0、 工作方式 1、 设置定时 1ms 初值、 打开定时器计数功能和开启总中断功能。 然后进入 while 循环 在循环体内没有执行任何功能程序。当定时时间到达即会进入定时器 0 中断 在中断服务函数内 重新赋初值准备下次计数 并且定义一个静态变量来累计定时 1ms 次数 当变量等于 1000 时 表示定时时间达 1 秒 然后清零变量以及控制 LED 状态翻转。 执行完成后退出中断返回主函数 当时间到达又进入中断 如此循环。为什么要使用关键字 static 将 i 定义为静态变量呢 我们希望每次进入中断函数时 i 保存的是上次累加值 使用了 static 关键字 就可以让变量 i 实现这种功能 即不会每次进入中断函数后被初始化为 0。 假如去掉 static 关键字 那么变量 i 就是一个局部变量 每次进入中断函数后 变量 i 初始值都是 0也就是说它的值永远也不会递增到 1000 从而实现不了 1s 定时。 可以这样理解使用了 static 关键字就相当于将 i 变成了一个全局变量功能。对于定时器 1 的使用方法是一样的 只是将上述的 0 变为 1 即可 具体可参考我们定时器 1 实验例程。21.5 实验现象使用 USB 线将开发板和电脑连接成功后电脑能识别开发板上 CH340 串口 把编译后产生的.hex 文件烧入到芯片内 实现现象如下 当 D1 指示灯间隔 1s闪烁。注意 实验中我们是以 12M 晶振为例讲解初值的计算 假如外部晶振为11.0592M 那么使用前面的计算公式可能就比较繁琐 这里给大家推荐一个非常好用的小工具“\5--开发工具\4-常用辅助开发软件\51 定时器计算.exe” 打开小工具 选择好定时器工作方式、 晶振频率、 定时时长即可得出 TH 和 TL 的初值。 假如现在使用的晶振是 11.0592M 使用定时器方式 1 定时时间为 1ms 设置界面如下定时器初值为 TH00XFC TL00X66。 该值与前面 12M 晶振得到的初值是有差别的 这也就是很多同学咨询为什么开发板上定时器工作慢或者快的原因 一定要注意开发板上使用的外部晶振大小 晶振大小不同 换算的初值是不一样的。
汽车精密部件PLC数据采集监控管理系统方案 在汽车精密部件的生产工作中,镀铜工序的温度、机加工试漏的压力与压降数据,是直接关系到良品率的重要因素。但在传统管理体系中,这些数据往往依赖人工抄录,出现效率低、误差大、汇总慢等问题, 越来越难以适应自动化的生… 2026/7/5 23:06:13
基于Java springboot大学生家教服务管理系统家教服务预约学习评价家教招聘应聘(源码+文档+运行视频+讲解视频) 文章目录 系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈 后端框架springboot前端框架vue持久层框架MyBaitsPlus系统测试 四、代码参考 源码获取 目的 针对大学生家教服务需求,基于Java Spring Boot框架开发的系统集成了家教预约、学习评价… 2026/7/6 5:07:09
小学 1 到 6 年级网盘学习资源大全|同步习题 + 奥数作文小升初全套 很多家长辅导孩子、老师日常备课时,苦于找不到成套完整的小学学习资料,网上素材杂乱、版本不匹配,整理起来十分麻烦。这份网盘资源包划分 9 个独立文件夹,整合小学 1-6 年级全套同步内容,搭配奥数、作文、小升初专项资… 2026/7/7 18:26:27
2026永久免费去水印软件推荐,电脑手机在线工具安全使用教程 在日常个人素材整理、自有作品优化、已授权内容归档的过程中,图片、视频自带的平台水印、文字logo、浮动字幕,往往会遮挡画面细节、影响素材观感。不少用户在挑选工具时,都希望找到适配电脑、手机双端,同时拥有在线网页版本&#… 2026/7/7 18:26:27
根据轨迹(经纬度)计算路径距离 计算工具类: public class HaversineDistanceCalculator {// 地球半径,单位为千米private static final double EARTH_RADIUS = 6371;// 计算两点之间的距离,使用Haversine公式private static double calculateDistance(double lat1, double lon1, double lat2, double lon… 2026/7/7 18:24:27
[具身智能-560]:两套国产具身智能方案完整对比:RK3588 VS 地平线地瓜 RDK S100 方案 A:RK3588 RKNN Toolkit 轻量化智能体(低成本分体落地路线)1. 硬件底层架构:分体式大小脑大脑(RK3588 SoC) 8nm,4A764A55,6TOPS 三核 NPU;跑 Ubuntu/ROS2、多模态感… 2026/7/7 18:22:26
版权那些事儿|你的一个“随手转发”,可能已经违法了 刷到一篇好文章,顺手复制粘贴到朋友圈; 看到一张美图,随手保存下来转发给朋友; 刷到一段有趣的视频,剪一剪、拼一拼,做成自己的“作品”…… 这些操作,你是不是也觉得“没什么大不了”… 2026/7/7 18:16:24
2026免费去水印工具教程全解:网页手机通用方法 日常整理个人素材、收藏优质短视频和图片时,素材自带的平台水印、文字logo、浮动字幕,往往会影响观感和素材整洁度。很多用户苦于找不到靠谱工具,要么需要付费解锁基础功能,要么广告繁多、导出二次水印、画质严重压缩。本文结合20… 2026/7/7 18:16:24
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践 1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8… 2026/7/7 0:01:11
如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是… 2026/7/7 0:03:13
Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 【免费下载链接】Jailhouse-gui A graphical user interface (GUI) tool for configuring and managing Jailhouse, a Linux-based hypervisor for partitioning multicore processors into isolated cel… 2026/7/7 0:03:13
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/7 11:26:57
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/7 11:26:58