51单片机——定时器中断实验,小白讲解,相互学习
定时器介绍
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转而处理一些复杂的事情。同时可以实现精确定时作用。
51单片机的定时原理
STC89C5X单片机内有两个可编程的定时/计数器 T0,T1 和一个特殊功能定时器T2。定时/计数的是指是加 1 计数器(16位),由高 8 位到低 8 位两个寄存器 THx 和 TLx 组成。它随着计数器的输入脉冲进行自加 1 ,也就是每来一个脉冲,计数器就自动加 1 ,当加到计数器为全 1 时,再输入一个脉冲就使计数器回零,且计数器的益出相应的中断标志位置 1 ,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。可见,由溢出时计算器的值减去计数初值才是加 1 计数器的计算值。
51单片机定时/计数器结构
51单片机定时器/计数器内部结构图如下:
上图中的T0和T1引脚对应的是单片机P3.4和P3.4管脚。51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD是定时器/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制 T0 ,T1的启动和停止及设置溢出。
1,工作方式寄存器TMOD
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,搞四位用例T1.其格式如下;
GATE 是门空位,GATE=0时,用于控制定时器的启动是受外部中断源信号的影响。只要用软件使TCON 中的 TR0 或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使 TR0 或 TR1为1,同时外部中断引脚 INTO/1 也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条,加上了INTO/1引脚为高电平这一条件。
C/T:定时/计数模式选择位。C/T = 0 为定时模式;C/T = 1 为计数模式。
MIMO:工作方式设置位。定时/计数器有四种工作方式。如下:
2,控制寄存器TCON
TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:
TF1 (TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1,CPU响应中断后 TF1 由硬件自动清 0 。T1工作时,CPU可随时查询 TF1 的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件设置 1 或 清0,同硬件置 1 或 清0的效果一样。
TR1(TCON.6):T1运行控制位。TR1置1时,T1 开始工作;TR1 置 0 时,T1 停止工作。TR1由软件置 1 或 清 0。所以,软件可控制定时/计数器的启动与停止。
TF0(TCON.5):T0溢出中断请求标志位,其功能与 TF1 类同。
TR0(TCON.4):T0运行控制位,其功能与TR1类同。
51单片机定时/计数器的工作方式
1,方式0
方式0位13-位计数,有TL0的低5(高3位未用)和TH0的8位组成。TL0的低5位溢出时间TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。其结构图如下
门控位GATE具有特殊的作用。当GATE=0时,经反相后使或门输出为1,此时仅由TR0控制与门的开启,与门输出1时,控制开关接通,计数开始;当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号和TR0共同控制。当TR0=1时,外中断引脚信号引脚的高电平启动计数,外中断引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。计数模式时,计数脉冲的T0引脚上的外部脉冲。计数初值与计数个数的关系为:x=2^13- N。
2,方式1
方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加 1 计数器。其结构图如下所示:
计数初值与计数个数的关系为:X=2^16-N
3,方式2
方式2位自动重装初值的8位计数方式。工作方式2特别适合用作较精确的脉冲信号发生器。其结构图如下所示:
计数初值与计数个数的关系为:X=2^-N
4,方式3
方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。工作方式3将T0分成为两个独立的8为计数器TL0和TH0。其结构如下所示:
这几种工作方式中应用较多的是方式1和方式2.定时器中通常适用定时器方式1,串口通信中通常适用方式2.
定时器配置
在适用定时器时,应该如何配置使其工作?其步骤如下(各步骤顺序可任意):
①对TMOD赋值,以确定T0和T1的工作方式,如果适用定时器0即对T0配置,如果使用定时器1即对T1配置。
②根据所要定时的时间计算初值,并将其写入TH0,TL0或TH1,TL1。
③如果适用中断,则对EA赋值,开放定时器中断。
④适用TR0 或 TR1 置位,启动定时/计数器定时或计数。
上述中有一个定时/计数器初值的计算,下面我们来看如何计算定时/计数器初值。
前面我们介绍过机器周期的概念,它是CPU完成的一个基本操作所需要的时间。其计算公式是:机器周期=1/单片机的时钟频率。51单片机内部时钟频率是外部时钟的12分频,也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频,也就是说外部晶振的频率输入到单片机里面的时候要进行12分频。比如说你用的是12MHZ晶振,那么单片机内部的时钟频率就是12/12MHZ,当你适用12MHZ的外部晶振的时候,机器周期=1/1M=1us。如果我们想定时1ms的初值是多少呢?1ms/1us=1000.也就是要计数1000个,初值=65535-1000+1(因为实际上计数器计数到65536(2的16次方))才溢出,所以后面要加1)=64536=FC18H,所以初值即为THx=0XFC,TLx=0X18.
知道了如何计算定时/计数器初值,那么想定时多长时间都可以算出,当然由于定时计数器位数有限,我们不可能直接通过初值定时很长时间,如果要实现很长时间的定时,比如定时1秒钟。可以通过初值设置定时1ms,当定时1ms结束后又重新赋初值,并且设定一个全局变量累计定时1ms的次数,表示已经定时1秒了。需要其他定时时间类似操作,这样我们就可以适用定时器来实现精确延时来替代之前的delay函数。
这里以定时器 0 为例介绍配置定时器工作方式1,设定1ms初值,开启定时器计数功能以及总中断如下:
void time0_init(void){TMOD|=0X01;//选择为定时器 0 模式,工作方式 1TH0=0XFC; //给定时器赋初值,定时 1msTL0=0X18;ET0=1;//打开定时器 0 中断允许EA=1;//打开总中断TR0=1;//打开定时器}对于定时器 1 的使用方法是一样的,只是将上述的0变为1即可,具体可参考我们定时器1实验例程。
软件设计
本章所要实现的功能是:通过定时器0中断控制D1指示灯间隔1秒闪烁.
/**********************************************************************************
****
实验名称:定时器 0 实验
接线说明:
实验现象:下载程序后,当按下 D1 指示灯间隔 1s 闪烁
注意事项:
***********************************************************************************
****/
#include "reg52.h"
typedef unsigned int u16;//对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义 LED1 管脚
sbit LED1=P2^0;
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1 时,大约延时 10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{while(ten_us--);
}
/*******************************************************************************
* 函 数 名 : time0_init
* 函数功能 : 定时器 0 中断配置函数,通过设置 TH 和 TL 即可确定定时时间
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void time0_init(void)
{TMOD|=0X01;//选择为定时器 0 模式,工作方式 1TH0=0XFC; //给定时器赋初值,定时 1msTL0=0X18;ET0=1;//打开定时器 0 中断允许EA=1;//打开总中断TR0=1;//打开定时器
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{time0_init();//定时器 0 中断配置while(1){}
}
void time0() interrupt 1 //定时器 0 中断函数
{static u16 i;//定义静态变量 iTH0=0XFC; //给定时器赋初值,定时 1msTL0=0X18;i++;if(i==1000){i=0;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 实验例程
相关文章:

51单片机——定时器中断实验,小白讲解,相互学习
定时器介绍 1,CPU时序的有关知识 震荡周期:为单片机提供定时信号的震荡源的周期(晶振周期或外加震荡周期)。状态周期:2个震荡周期为1个状态周期,用S表示。震荡周期又称S周期或时钟周期。机器周期ÿ…...

什么是循环依赖,spring是如何去解决循环依赖问题的?什么是三级缓存?【spring】
文章目录什么是循环依赖?什么是三级缓存?执行流程什么是循环依赖? 在我们的开发中,会不可避免的遇到Bean之间循环依赖的,所谓循环依赖,就是两个或者两个以上的Bean互相持有对方,这样在程序运行…...
Cron表达式
网上搜一下就有在线生成网站,很方便。 比如:Cron表达式生成器 用途 定时调度任务,比如说服务器、云函数中定时执行脚本函数。 Cron 表达式构成 Cron 表达式是字符串,一般由 6 - 7 个字段构成,空格分隔。每个字段代…...

JavaScript 作用域
作用域是可访问变量的集合。在JavaScript中,能够定义全局作用域或者局部作用域。在 JavaScript 中, 对象和函数同样也是变量。在 JavaScript 中, 作用域为可访问变量,对象,函数的集合。JavaScript 函数作用域: 作用域在函数内修改。JavaScrip…...

Hive内部表与外部表的区别具体说明
目录 1.在/opt/atguigu/目录下,新建两个txt文件 2.在hadoop的web端递归创建一个目录,存储这两个文件 3.查看web端的文件 一、内部表: 1.创建一个内部表,并指定内部表的存储位置 2.查看内部表,内部表中没有数据 …...

Java流程控制
目录 前言 一、用户交互Scanner及其进阶使用 输入的数据为字符串类型 输入的数据为整型或者浮点型 练习 二、顺序结构 三、选择结构 if单选泽结构 if双选择结构 if多选择结构 嵌套的if结构 switch多选择结构 四、循环结构 while循环 Do...while循环 For循环 练习 利用for循环…...

I.MX6ULL_Linux_系统篇(17) uboot分析-启动linux
bootz 启动 Linux 内核 images 全局变量 不管是 bootz 还是 bootm 命令,在启动 Linux 内核的时候都会用到一个重要的全局变量:images, images 在文件 cmd/bootm.c 中有如下定义: images 是 bootm_headers_t 类型的全局变量&…...

C/C++每日一练(20230221)
目录 1. 格雷编码 2. 矩阵问题 3. 搜索旋转排序数组 II 1. 格雷编码 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案&#…...

用Python采集热门城市景点数据并简单制作数据可视化图
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 模块使用: 爬虫部分: requests parsel csv 数据分析部分: pandas pyecharts 如何安装模块: win R 输入 cmd 输入安装命令: pip install 模块名 回车 pycharm里面安装 terminal 输入安装命令…...

论文阅读:pixelNeRF: Neural Radiance Fields from One or Few Images
中文标题:从一或少量图像中构建神经辐射场 提出问题 NeRF效果虽然惊艳,但是其需要大量环绕图像以及长时间的训练。 创新点 与原始的NeRF网络不使用任何图像特征不同,pixelNeRF将与每个像素对齐的空间图像特征作为输入。也可以集合更多输入…...

C++项目——高并发内存池(1)--介绍及定长内存池
1.什么是内存池 1.1 池化技术 将程序中需要经常使用的核心资源先申请出来,放在一个池内,由程序自己管理,这样可以提高资源的使用效率,也可以保证本程序占有的资源数量。 比如之前博文实现的线程池,就是预先的申请出…...

网络有线无线配置
一、需求 在无线接入区内,当Lsw1的上联口出现故障时,需要通过AP1-LSw1-LSw2-LSw3的路径访问公网server3。这是因为AP1通过无线网连接到LSw1,而LSw1与LSw3之间的链路出现故障,无法直接访问公网server3。因此,流量需要通…...

阅读笔记——Feature-Point Matching for Aerial and Ground Images方法
阅读笔记——Feature-Point Matching for Aerial and Ground Images 1.应用背景 在三维重建应用中,常用的是航空影像,但在城市环境中,面对大量的高层建筑物,航空影像往往不能很好的重建出完整的三维模型。因为航空影像视角约束以…...
前端工程师面试题10条必会笔试题
布局 左边20% 中间自适应 右边200px 不能用定位答案:圣杯布局/双飞翼布局或者flex什么叫优雅降级和渐进增强?渐进增强 progressive enhancement:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进…...

【技术分享】Web自动化之Selenium安装
Web 应用程序的验收测试常常涉及一些手工任务,例如打开一个浏览器,并执行一个测试用例中所描述的操作。但是手工执行的任务容易出现人为的错误,也比较费时间。因此,将这些任务自动化,就可以消除人为因素。Selenium 可以…...

【Linux】进程状态的理解
✍作者:阿润菜菜 📖专栏:Liunx系统编程 本文目录概述两个先行概念我们为啥创建进程Linux下的进程状态1. R 运行状态2.S 休眠状态 --- 可中断休眠状态3. D 磁盘休眠状态 ---不可中断休眠4.T 暂停状态 (t 追踪暂停状态)5…...

打游戏哪种蓝牙耳机比较好?适合玩游戏的无线蓝牙耳机
2023年耳机市场一如既往地卷,不只是卷音质,还在外观和功能上做了许多的改进,以至于现在哪怕不懂耳机的人从各电商平台都能闭眼入一个款平价品牌耳机且极少会踩雷,玩游戏是当前年轻人的娱乐方式,下面整理了几款适合玩游…...

Fortinet推出新一代自研安全芯片,跨所有网络边缘加速网络与安全融合
专注网络与安全融合的全球网络安全领导者 Fortinet(NASDAQ:FTNT),近日宣布推出新一代自研安全芯片 FortiSP5,作为 Fortinet ASIC 技术的最新突破,有力推动了分布式网络边缘安全的重大飞跃。FortiSP5 源自 F…...

ChatGPT爆火背后的真相:学编程已经成为必选项
这一阵最热门的话题,莫过于人工智能新选手——ChatGPT,在推出后只用了两个月就积累了1亿用户!它的出现在科技圈掀起了一阵“惊涛骇浪”,有人称ChatGPT的意义,堪比当年蒸汽机的出现,它足以爆发新一轮的“工业…...

Unity UI框架
一、简介 最近在各大网站看了一下 Unity3d 的 UI 框架,各种 UI 框架已经有很多的版本了,各有千秋,有的功能虽然写的完善,但用起来太复杂,有的框架功能不完善,搞个课程就上架了,还有什么 MVC 框…...

2025 5 月 学习笔记
计算高斯半径,用于生成高斯热图 这个的意义是什么 有什么作用? 14 核心意义:平衡定位精度与检测鲁棒性 在基于热图的目标检测方法(如CenterNet、CornerNet等)中,计算高斯半径的核心意义在于在精确…...

Windows安装docker desktop
Windows 版本: Windows 10/11(64位)专业版、企业版或教育版(家庭版需手动配置)。 版本号需 ≥ 1909(建议更新到最新系统) 打开程序 启动服务后点点点 重启生效(没有的话 安装WSL…...
亚马逊站内信规则2025年重大更新:避坑指南与合规策略
亚马逊近期对Buyer-Seller Messaging(买家-卖家站内信)规则进行了显著收紧,明确将一些曾经的“灰色操作”列为违规。违规操作轻则收到警告,重则导致账户暂停或绩效受限。本文为您全面解析本次规则更新的核心要点、背后逻辑&#x…...

iTunes 无法备份 iPhone:10 种解决方法
Apple 设备是移动设备市场上最先进的产品之一,但有些人遇到过 iTunes 因出现错误而无法备份 iPhone 的情况。iTunes 拒绝备份 iPhone 时,可能会令人非常沮丧。不过,幸运的是,我们有 10 种有效的方法可以解决这个问题。您可以按照以…...

MS1023/MS1224——10MHz 到 80MHz、10:1 LVDS 并串转换器(串化器)/串并转换器(解串器)
产品简述 MS1023 串化器和 MS1224 解串器是一对 10bit 并串 / 串并转 换芯片,用于在 LVDS 差分底板上传输和接收 10MHz 至 80MHz 的并行字速率的串行数据。起始 / 停止位加载后,转换为负载编 码输出,串行数据速率介于 120Mbps…...

『React』组件副作用,useEffect讲解
在 React 开发中,有时候会听到“副作用”这个词。特别是用到 useEffect 这个 Hook 的时候,官方就明确说它是用来处理副作用的。那什么是副作用?为什么我们要专门管控它?今天就聊聊 React 中的组件副作用。 📌 什么是“…...

Spring Boot养老院管理系统源码分享
概述 基于Spring Boot开发的养老院管理系统,该系统通过智能化管理模块,为养老机构提供高效运营解决方案。 主要内容 后台管理功能 系统后台功能完善,左侧导航栏涵盖首页、安全巡查管理、设备管理等模块。设备管理界面以表格形式清晰展示设…...

Axure 基础入门
目录 认识产品经理 项目团队* 基本概述 认识产品经理 A公司产品经理 B公司产品经理 C公司产品经理 D公司产品经理 产品经理工作范围 产品经理工作流程* 产品经理的职责 产品经理的分类 产品经理能力要求 产品工具 产品体验报告 原型设计介绍 原型设计概述 为…...

vscode使用“EIDE”和“Cortex-Debug”插件利用st-link插件实现程序烧写以及调试工作
第一步:安装vscode插件“EIDE”EIDE和“Cortex-Debug”。 第二步:配置EIDE 2.1安装“实用工具”: 2.2 EIDE插件配置:根据安装的keil C51 keil MDK IAR的相关路径设置 第三步:配置Cortex-Debug插件 点击settings.jso…...
嵌入式Linux系统中的启动分区架构
在嵌入式Linux系统架构中,Linux内核、设备树(Device Tree)与引导配置文件构成了系统启动的基础核心。如何安全、高效地管理这些关键文件,直接影响到系统的稳定性与可维护性。近年来,越来越多的嵌入式Linux开发者选择将启动相关文件从传统的“混合存放”方式,转向采用独立…...