51单片机基础:定时器

1.定时器介绍

51单片机通常有两个定时器:定时器 0/1好一点的可能有定时器3。

在介绍定时器之前我们先科普下几个知识:

1,CPU 时序的有关知识
①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡
周期)。
②状态周期:2 个振荡周期为 1 个状态周期,用 S 表示。振荡周期又称 S 周
期或时钟周期。
③机器周期:1 个机器周期含 6 个状态周期,12 个振荡周期。
④指令周期:完成 1 条指令所占用的全部时间,它以机器周期为单位。
例如:外接晶振为 12MHz 时,51 单片机相关周期的具体值为:
振荡周期=1/12us;
状态周期=1/6us;(2个振荡周期)
机器周期=1us;(12个振荡周期)
指令周期=1~4us;
2,学习定时器前需要明白的几点
①51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之
为定时器/计数器。
②定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程
是自动完成的,不需要 CPU 的参与。
③51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信
号对寄存器中的数据加 1。
有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加 1 的
工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以实
现精确定时作用。我们之前写的延时函数都给大概的时间,是不精确的。但是定时器是精确的。

2. 单片机定时器原理

定时/计数器的实质是加 1 计数器(16 位),由高 8 位和低 8 位两
个寄存器 THx 和 TLx 组成。它随着计数器的输入脉冲进行自加 1,也就是每来一
个脉冲,计数器就自动加 1,当加到计数器为全 1 时,再输入一个脉冲就使计数
器回零,且计数器的溢出使相应的中断标志位置 1,向 CPU 发出中断请求(定时
/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;
如果工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数
初值才是加 1 计数器的计数值。
上图中的 T0 和 T1 引脚对应的是单片机 P3.4 和 P3.5 管脚。51 单片机定时/
计数器的工作由两个特殊功能寄存器控制。TMOD 是定时/计数器的工作方式寄存
器,确定工作方式和功能;TCON 是控制寄存器,控制 T0、 T1 的启动和停止及
设置溢出标志

1,工作方式寄存器 TMOD

工作方式寄存器 TMOD 用于设置定时/计数器的工作方式,低四位用于 T0,高
四位用于 T1。其格式如下:

》GATE 是门控位, GATE=0 时,用于控制定时器的启动是否受外部中断源信号
的影响。只要用软件使 TCON 中的 TR0 或 TR1 为 1,就可以启动定时/计数器工作;
GATA=1 时,要用软件使 TR0 或 TR1 为 1,同时外部中断引脚 INT0/1 也为高电平
时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了 INT0/1 引脚
为高电平这一条件。

》 C/T :定时/计数模式选择位。C/T =0 为定时模式;C/T =1 为计数模式。

M1M0:工作方式设置位。定时/计数器有四种工作方式。

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 类同。

3.定时/计数器的工作方式

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(13)表示 2 的 13 次方。
2:方式 1

方式 1 的计数位数是 16 位,由 TL0 作为低 8 位,TH0 作为高 8 位,组成了 16 位加 1 计数器。其结构图如下所示:

计数初值与计数个数的关系为:X=2(16)-N。

3:方式 2(串口通信)

方式 2 为自动重装初值的 8 位计数方式。工作方式 2 特别适合于用作较 精确的脉冲信号发生器。其结构图如下所示:

4:方式 3 
方式 3 只适用于定时/计数器 T0, 定时器 T1 处于方式 3 时相当于 TR1=0,
停止计数。工作方式 3 将 T0 分成为两个独立的 8 位计数器 TL0 和 TH0。其
结构如下所示

这几种工作方式中应用较多的是方式 1 和方式 2。定时器中通常使用定时器
方式 1,串口通信中通常使用方式 2。

4.定时器配置

在使用定时器时,应该如何配置使其工作?其步骤如下(各步骤顺序可任
意):
①对 TMOD 赋值,以确定 T0 和 T1 的工作方式,如果使用定时器 0 即对 T0 配
置,如果使用定时器 1 即对 T1 配置。
②根据所要定时的时间计算初值,并将其写入 TH0、TL0 或 TH1、TL1。
③如果使用中断,则对 EA 赋值,开放定时器中断。(TCON)
④使 TR0 或 TR1 置位,启动定时/计数器定时或计数。(与GATE一起使用的)
上述中有一个定时/计数器初值的计算,下面我们来看下如何计算定时/计数
器初值。
前面我们介绍过机器周期的概念,它是 CPU 完成一个基本操作所需要的时间。
其计算公式是:机器周期=1/单片机的时钟频率。51 单片机内部时钟频率是外部
时钟的 12 分频,也就是说当外部晶振的频率输入到单片机里面的时候要进行 12
分频。比如说你用的是 12MHZ 晶振,那么单片机内部的时钟频率就是 12/12MHZ,
当你使用 12MHZ 的外部晶振的时候,机器周期=1/1M=1us。如果我们想定时 1ms
的初值是多少呢?1ms/1us=1000。也就是要计数 1000 个,初值=65535-1000+1
(因为实际上计数器计数到 66636(2 的 16 次方)才溢出,所以后面要加 1)
=64536=FC18H,所以初值即为 THx=0XFC,TLx=0X18。
知道了如何计算定时/计数器初值,那么想定时多长时间都可以计算出,当
然由于定时计数器位数有限,我们不可能直接通过初值定时很长时间,如果要实
现很长时间的定时,比如定时 1 秒钟。可以通过初值设置定时 1ms,每当定时 1ms
结束后又重新赋初值,并且设定一个全局变量累计定时 1ms 的次数,当累计到
1000 次,表示已经定时 1 秒了。需要其他定时时间类似操作,这样我们就可以
使用定时器来实现精确延时来替代之前的 delay 函数。
这里以定时器 0 为例介绍配置定时器工作方式 1、设定 1ms 初值,开启定时
器计数功能以及总中断,如下:
void Timer0Init()
{
TMOD|=0X01;//选择为定时器 0 模式,工作方式 1,仅用 TR0 打开启动。
TH0=0XFC; //给定时器赋初值,定时 1ms
TL0=0X18;
ET0=1;//打开定时器 0 中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
对于定时器 1 的使用方法是一样的,只是将上述的 0 变为 1 即可,具体可参
考我们定时器 1 实验例程。

5.实例

1.通过定时器 0 中断控制 D1 指示灯间隔 1 秒闪烁。

代码如下:

#include <REGX51.H>
typedef unsigned char u8;
typedef unsigned int u16;sbit LED1=P2^0;void Timer0Init()
{TMOD|=0X01;//选择为定时器 0 模式,工作方式 1,仅用 TR0 打开启动。TH0=0XFC; //给定时器赋初值,定时 1msTL0=0X18;ET0=1;//打开定时器 0 中断允许EA=1;//打开总中断TR0=1;//打开定时器
}void main()
{Timer0Init();while(1){}}void Timer0() interrupt 1
{{static u16 i;TH0=0XFC; //给定时器赋初值,定时 1msTL0=0X18;i++;if(i==1000){i=0;LED1=~LED1;}}
}
2.按键控制LED流水灯模式
#include <REGX51.H>#include <INTRINS.H>
typedef unsigned char u8;
typedef unsigned int u16;u8 LEDMode;//延时子函数
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}void Timer0Init()
{TMOD|=0X01;//选择为定时器 0 模式,工作方式 1,仅用 TR0 打开启动。TH0=0XFC; //给定时器赋初值,定时 1msTL0=0X18;ET0=1;//打开定时器 0 中断允许EA=1;//打开总中断TR0=1;//打开定时器
}void main()
{P2=0xfe;Timer0Init();while(1){if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);LEDMode++;if(LEDMode>=2)LEDMode=0;}}}
void Timer0() interrupt 1
{	static u16 i;TH0=0XFC; //给定时器赋初值,定时 1msTL0=0X18;i++;if(i==500){i=0;if(LEDMode==0){P2=_crol_(P2,1);}if(LEDMode==1){P2=_cror_(P2,1);}}  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode无法启动:Waiting for server log...

问题基本情况 [13:30:20.720] > code 1.86.0 (commit 05047486b6df5eb8d44b2ecd70ea3bdf775fd937) [13:30:20.724] > Running ssh connection command... /var/fpwork/reiss/vscdata/server/cplane/.vscode-server/code-05047486b6df5eb8d44b2ecd70ea3bdf775fd937 comman…

Linux系统调试课:Linux错误码介绍

文章目录 一、错误码二、错误码返回案例三、使用 goto 语句沉淀、分享、成长,让自己和他人都能有所收获!😄 📢错误代码由内核或用户空间应用程序(通过errno变量)解释。错误处理在软件开发中非常重要,而不仅仅是在内核开发中。幸运的是,内核提供的几种错误,几乎涵盖了可…

6.1810: Operating System Engineering 2023 <Lab9: mmap>

一、本节任务 二、Lab: mmap (hard) 2.1 mmap 介绍 mmap(2) 系统调用能将文件或者设备映射到内存中&#xff0c;返回映射区域的起始地址。 #include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset); int munmap(void …

【Mysql】整理

Mysql整理与总结 整理Mysql的基本内容供回顾。 参考&#xff1a; [1]. 掘金.MySQL三大日志(binlog,redolog,undolog)详解 [2]. Javaguide.MySQL三大日志(binlog、redo log和undo log)详解

c语言贪食蛇游戏

演示视频 目录 一.概述 二.游戏开始前 修改控制台程序标题和大小 Win32 API GetStdHandle函数 GetConsoleCursorInfo函数和SetConsoleCursorInfo函数 SetConsoleCursorPosition函数 游戏开篇界面处理 创建地图 蛇身节点以及食物节点初始化 蛇身的初始化 整体蛇节点…

【学习笔记】TypeScript学习笔记1 --TypeScript中的类型

文章目录 TS总的变量类型References TS总的变量类型 备注&#xff1a; 如果一个变量设置为了any 类型之后相当于变量关闭了TS的类型检测 let d: any; d 10; d hello;//unknown表示的是未知类型&#xff0c;实际是上一个安全的any,unknown类型的变量不能直接赋值给其他变量le…

【Linux】基于管道进行进程间通信

进程间通信 一、初识进程间通信1. 进程间通信概念2. 进程间通信分类 二、管道1. 管道概念2. 管道原理3. 匿名管道4. 匿名管道系统接口5. 管道的特性和情况6. 匿名管道的应用&#xff08;1&#xff09;命令行&#xff08;2&#xff09;进程池 7. 命名管道&#xff08;1&#xff…

Linux------命令行参数

目录 前言 一、main函数的参数 二、命令行控制实现计算器 三、实现touch指令 前言 当我们在命令行输入 ls -al &#xff0c;可以查看当前文件夹下所有文件的信息&#xff0c;还有其他的如rm&#xff0c;touch等指令&#xff0c;都可以帮我们完成相应的操作。 其实运行这些…

【语音合成】中文-多情感领域-16k-多发音人

模型介绍 语音合成-中文-多情感领域-16k-多发音人 框架描述 拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用&#xff0c;故此处仅涉及参数法。 参数TTS系统可分为两大模块&#xff1a;前端和后端。 前端包含文本正则、分词、多音字预…

【C++】构造函数、初始化列表,析构函数,拷贝构造函数,运算符重载

注&#xff1a;本博客图片来源于学习笔记: 学习笔记https://gitee.com/box-he-he/learning-notes 完整思维导图请前往该博主码云下载。 目录 注&#xff1a;本博客图片来源于学习笔记: 学习笔记https://gitee.com/box-he-he/learning-notes 完整思维导图请前往该博主码云下载…

2024无参考图像的清晰度评价方法

无参考图像质量评价算法 无参考图像质量评价是指参考图像不存在的情况下&#xff0c;直接计算失真图像的视觉质量。根据无参考图像质量评价模型在计算图像视觉质量时是否需要图像的主观分数来进行训练&#xff0c;无参考图像质量评价算法可分为基于监督学习的无参考图像质量评价…

2024-02-06 TCP/UDP work

1. 画出TCP三次握手和四次挥手的示意图&#xff0c;并且总结TCP和UDP的区别 三次握手&#xff1a; 4次挥手&#xff1a; tcp/udp区别 TCP 1. 稳定&#xff0c;提供面向连接的&#xff0c;可靠的数据传输服务 2. 传输过程中&#xff0c;数据无误、数据无丢失、数据无失序、…

IDEA 配置以及一些技巧

1. IDEA设置 1.1 设置主题 1.2 设置字体和字体大小 1.3 编辑区的字体用ctrl鼠标滚轮可以控制大小 1.4 自动导包和优化多余的包 1.5 设置编码方式 1.6 配置 maven 1.7 设置方法形参参数提示 1.8 设置控制台的字体和大小 注意&#xff1a;设置控制台字体和大小后需要重启IDEA才会…

第1章 认识Flask

学习目标 了解Flask框架&#xff0c;能够说出Flask框架的发展史以及特点 熟悉隔离Python环境的创建方式&#xff0c;能够独立在计算机上创建隔离的Python环境 掌握Flask的安装方式&#xff0c;能够独立在计算机上安装Flask框架 掌握PyCharm配置隔离环境的方式&#xff0c;能…

【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 命名空间 命名空间的定义 命名空间的使用 命名空间的嵌套使用 C输入&输出 std命名空间的使用惯例&…

C语言第二十弹---指针(四)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1、字符指针变量 2、数组指针变量 2.1、数组指针变量是什么&#xff1f; 2.2、数组指针变量怎么初始化 3、⼆维数组传参的本质 4、函数指针变量 4.1…

Rust开发WASM,浏览器运行WASM

首先需要安装wasm-pack cargo install wasm-pack 使用cargo创建工程 cargo new --lib mywasm 编辑Cargo.toml文件&#xff0c;修改lib的类型为cdylib&#xff0c;并且添加依赖wasm-bindgen [package] name "mywasm" version "0.1.0" edition "…

二进制安全虚拟机Protostar靶场(8)heap3 Fastbins unlink exploit

前言 这是一个系列文章&#xff0c;之前已经介绍过一些二进制安全的基础知识&#xff0c;这里就不过多重复提及&#xff0c;不熟悉的同学可以去看看我之前写的文章 heap3 程序静态分析 https://exploit.education/protostar/heap-three/#include <stdlib.h> #include …

故障诊断 | 一文解决,TCN时间卷积神经网络模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,TCN时间卷积神经网络模型的故障诊断(Matlab) 模型描述 时间卷积神经网络(TCN)是一种用于序列数据建模和预测的深度学习模型。它通过卷积操作在时间维度上对序列数据进行特征提取,并且可以处理可变长度的输入序列。 要使用TCN进行…

3D室内虚拟灭火体验为预防火灾提供全新方案

室内火灾常见于充电器未拔、电动车、油锅起火及煤气泄露等原因&#xff0c;由于室内空间小、易燃物多&#xff0c;因此极易造成较大的人员财产损失&#xff0c;3D仿真还原技术、通过1&#xff1a;1模拟还原火灾发生全过程&#xff0c;火灾VR安全培训提供全方位、真实感强的模拟…