单片机第一季:零基础6——定时器和计时器

news2025/1/12 20:58:53

目录

1,单片机定时器原理

2,51单片机定时器/计数器结构

3,定时器配置 

4,示例代码-通过定时器控制LED灯间隔1s闪烁 


51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。

定时器/计数器和单片机的CPU 是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU 的参与。

51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。

有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1 的工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以实现精确定时作用。

譬如外部12MHz晶振,单片机工作在12T模式下,则内部时钟频率是1MHz,则时钟脉冲宽度为1us(1/1MHz = 1us)。如果单片机工作在6T模式下,则内部时钟频率是2MHz,则时钟脉冲宽度为0.5us(1/2MHz = 0.5us)

1,单片机定时器原理

STC89C5X 单片机内有两个可编程的定时/计数器T0、T1 和一个特殊功能定时器T2。定时/计数器的实质是加1 计数器(16 位),由高8 位和低8 位两个寄存器THx 和TLx 组成(x代表0/1/2)。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,当加到计数器为全1 时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU 发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数初值才是加1 计数器的计数值。

2,51单片机定时器/计数器结构

上图中的T0 和T1 引脚对应的是单片机P3.4 和P3.5 管脚。51 单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD 是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON 是控制寄存器,控制T0、T1 的启动和停止及设置溢出标志。

工作方式寄存器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:工作方式设置位。定时/计数器有四种工作方式。

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

 以方式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=213-N。 

3,定时器配置 

在使用定时器时,应该如何配置使其工作?其步骤如下(各步骤顺序可任意):
①对TMOD 赋值,以确定T0 和T1 的工作方式,如果使用定时器0 即对T0 配置,如果使用定时器1 即对T1 配置。

②根据所要定时的时间计算初值,并将其写入TH0、TL0 或TH1、TL1。

③如果使用中断,则对EA 赋值,开放定时器中断。

④使TR0 或TR1 置位,启动定时/计数器定时或计数。上述中有一个定时/计数器初值的计算,下面我们来看下如何计算定时/计数器初值。

前面我们介绍过机器周期的概念,它是CPU 完成一个基本操作所需要的时间。其计算公式是:机器周期=1/单片机的时钟频率。51 单片机内部时钟频率是外部时钟的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 的次数,当累计到1000 次,表示已经定时1 秒了。需要其他定时时间类似操作,这样我们就可以使用定时器来实现精确延时来替代之前的delay 函数。这里以定时器0 为例介绍配置定时器工作方式1、设定1ms 初值,开启定时器计数功能以及总中断,如下: 

void time0_init(void)
{
    TMOD|=0X01;//选择为定时器0 模式,工作方式1
    TH0=0XFC; //给定时器赋初值,定时1ms
    TL0=0X18;
    ET0=1;//打开定时器0 中断允许
    EA=1;//打开总中断
    TR0=1;//打开定时器
}

其中ET0和EA的设置是在中断允许寄存器IE中:

CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE 控制的。 

EA (IE.7), CPU 中断允许(总允许)位。

ET0(IE.1),定时/计数器T0 中断允许位。

4,示例代码-通过定时器控制LED灯间隔1s闪烁 

#include <reg51.h>

//使用T0定时器控制LED灯间隔1s闪烁
unsigned int u16 = 0;  //计数初始值
sbit led = P0^0;

void time0_ini()
{
	TMOD = 0x01; //T0工作在定时模式,工作方式1:16位定时/计数器
	TR0 = 1;     //T0 运行控制位,TR0 置1 时,T0 开始工作
	TH0 = 0xfc;
	TL0 = 0x18;		 //按一秒时间计时,先计算1ms的对应的初值65535 - 1000 + 1 = 64536
				     //对应16进制 0xFBB4
	EA = 1;		     //中断总开关
	ET0 = 1;         //T0中断开关

}

void time0_isr() interrupt 1  //定时器0中断处理程序
{
	u16++;
	TH0 = 0xfc;
	TL0 = 0x18;

	if(u16 == 1000)
	{
	  u16 = 0;
	  led = !led;
	}


}

void main()
{
	time0_ini();  //调用定时器配置函数,即打开定时器和允许定时器的中断

    while(1);   //主程序
}

内部时钟频率是1MHz,时钟周期是1us。最多能定65535(16位定时器),也就是说最大定时时间为65535*1us=65535us=65.535ms。
如果要定比较长的时间(譬如2s),定时器直接是不能满足的,解决办法是多次定时后加起来构成一个长时间。

实验目的:
(1)使用定时器来完成LED闪烁;
(2)原来实现闪烁时中间的延迟是用delay函数实现的,在delay的过程中CPU要一直耗在这里不能去做别的事情。这是之前的缺点;
(3)本节用定时器来定一个时间(譬如1s),在这个定时器定时时间内CPU还可以去做主任务,定时时间到产生中断,在中断处理程序isr中让LED闪烁即可。 

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

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

相关文章

【R语言】机器学习-手撕逻辑回归

【R语言】机器学习-手撕逻辑回归 算法原理 逻辑回归是一种常用的分类算法&#xff0c;它在机器学习领域有着广泛的应用。在介绍具体的实现细节之前&#xff0c;我们先来了解一下逻辑回归的算法原理。 sigmoid函数 逻辑回归使用sigmoid函数&#xff08;也称为逻辑函数&#…

《TCP IP网络编程》第四章

第 4 章 基于 TCP 的服务端/客户端&#xff08;1&#xff09; 根据数据传输方式的不同&#xff0c;基于网络协议的套接字一般分为 TCP 套接字和 UDP 套接字。因为 TCP 套接字是面向连接的&#xff0c;因此又被称为基于流&#xff08;stream&#xff09;的套接字。 TCP …

烧屏现象对OLED屏幕质量的影响:如何保持画面清晰度?

OLED&#xff08;Organic Light Emitting Diode&#xff09;屏幕作为一种高品质、高对比度和鲜艳色彩的显示技术&#xff0c;越来越受到消费者的青睐。然而&#xff0c;一些用户可能会担心OLED屏幕烧屏的问题。本文将探讨OLED屏幕烧屏的原因、如何预防烧屏以及如何进行正确的维…

一个完整的项目是怎么做性能测试?资深8年测试总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 突然有一天&#…

解决问题:解除HUE下载10万行的限制

解决问题&#xff1a;解除HUE下载10万行的限制 这个目录下的 vim /opt/cloudera/parcels/CDH/lib/hue/apps/beeswax/src/beeswax/conf.py可以调整数量 也可以更改为-1&#xff08;表示不限制&#xff09;

有测试媛的IT团队,产品质量更高

我们都知道&#xff0c;在绝大部分技术团队中&#xff0c;往往阳盛阴衰。而测试团队&#xff0c;可能情况要好一些&#xff0c;据部分机构调查来看男女比例在3:2左右。 根据过往经验来看&#xff0c;有测试媛的IT团队&#xff0c;往往软件质量能更好的得到保证&#xff08;强调…

【单片机】MSP430F5529单片机的Flash读写控制,MSP430 flash 读写

文章目录 内存模型程序 内存模型 https://qq742971636.blog.csdn.net/article/details/108892807 单片机的Flash里面的区域不是全都能写的&#xff1a;https://blog.csdn.net/u014470361/article/details/79297601 找一下手册看看MSP430F5529单片机哪些地址区域能写&#xf…

nginx常用命令以及安装

目录 前言&#xff1a; 安装&#xff1a; 常用命令&#xff1a; 前言&#xff1a; Nginx的设计理念是高性能、稳定性、开放性和易用性。它的并发能力优秀&#xff0c;可以处理数万个并发连接&#xff0c;并且占用较少的资源。此外&#xff0c;Nginx支持热部署&#xff0c;即…

如何将企业联系方式API接口应用于你的移动端APP?

在现代商业世界中&#xff0c;企业需要提供一种快速&#xff0c;高效的方式来让用户获取联系方式。因此&#xff0c;企业联系方式API接口应运而生&#xff0c;它是一种提供了企业联系方式的开放接口&#xff0c;在用户调用时&#xff0c;可以实现即时获取企业的联系方式信息。本…

python-计算两个矩阵的相似度。

余弦相似度 在pytorch中&#xff0c;有一个专门的函数用于计算相似度&#xff1a;torch.cosine_similarity() https://pytorch.org/docs/stable/nn.functional.html#cosine-similarity import torch import torch.nn.functional as F input1 torch.randn(100, 128) input2 t…

【2023,学点儿新Java-32】Java基础小练习:根据圆周率与半径求圆的面积 | 温度转换 | 计算矩形面积 | 判断奇偶数 | 年龄分类

前情提要&#xff1a; 【2023&#xff0c;学点儿新Java-31】测试&#xff1a;整型和浮点型变量的使用 | 附&#xff1a;计算机存储单位&#xff08;转换关系&#xff09;| 企业真题&#xff1a;为什么0.10.2不等于0.3【2023&#xff0c;学点儿新Java-30】变量的基本使用&#…

回归预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实…

安全不“放假”,VR安全教育等你沉浸式体验

暑期开启&#xff0c;孩子们将迎来一段丰富且快乐的时光&#xff0c;暑假虽快乐&#xff0c;但是安全不能“放假”&#xff0c;许多地方开展形式多样的暑假安全宣传活动&#xff0c;想不想沉浸式体验下VR安全教育宣传呢&#xff1f;通过VR演示&#xff0c;身临其境的了解防溺水…

MySQL-概述-数据模型SQL简介

数据库&#xff1a;DataBase&#xff08;DB&#xff09;&#xff0c;是存储和管理数据的仓库数据库管理系统&#xff1a;DataBase Management System&#xff08;DBMS&#xff09;&#xff0c;操作和管理数据库的大型软件。SQL&#xff1a;Structured Query Language&#xff0…

「提高你的CSS技能」:15个重要的CSS属性详解

这篇文章介绍了15个重要的CSS属性&#xff0c;旨在提高读者的CSS知识和技能。文章以清晰的方式解释了每个属性的作用和用法&#xff0c;并提供了相应的示例代码。通过这篇文章&#xff0c;读者可以了解到一些有趣且实用的CSS属性。 1:in-range 和:out-of-range 伪类 CSS的:in…

KafKa 3.x(三、Eagle、Kraft、压测调优,源码解析)

6. Kafka-Eagle监控 Kafka-Eagle框架用于监控Kafka集群运行状况。官网https://kafka-eagle.org 6.1 Mysql 前置mysql。 6.2 Kafka环境 关闭集群 kf.sn stop修改vim /bin/kafka-server-start.sh 并同步到其他节点 if [ "x$KAFKA_HEAP_OPTS" "x" ]; t…

vue使用html2canvas实现一键截图并赋值到剪贴板,只截取当前显示器上可视的内容

使用html2canvas 和 clipboard API实现整页截图并填充至剪切板。 访问剪切板的api只支持在https或者本地localhost上使用&#xff0c;如果是http&#xff0c;则无法使用 首先需要从npm安装html2canvas npm install html2canvas然后在代码中导入这个包&#xff1a; import ht…

git安装教程

前言 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从小到大的项目版本管理。下面详细的用图文形式介绍一下git安装过程&#xff08;记录一下git安装过程供参考&#xff09; 一、下载git 打开git官网地址&#xff1a;https://git-scm.com/进行下载&am…

适合宝妈和学生党的副业,在家就可以做的兼职,实现高质量躺平

如果工资不够高&#xff0c;那就会让人过得很拮据。因此&#xff0c;很多人都希望可以通过兼职或副业来增加收入。然而&#xff0c;找到可靠的副业却并不容易&#xff0c;还会面临各种困难。 跟大家介绍七种可行的兼职副业&#xff0c;希望能为那些想增加收入的职场人员提供一…

第四章:DeepLabV2——使用深度卷积神经网络、空洞卷积和全连接条件随机场进行语义图像分割

0.摘要 在这项工作中&#xff0c;我们使用深度学习来解决语义图像分割任务&#xff0c;并做出了三个实验证明具有实际价值的主要贡献。 首先&#xff0c;我们强调通过上采样滤波器进行卷积&#xff0c;或者称为“空洞卷积”&#xff0c;在密集预测任务中是一种强大的工具。空洞…