【51单片机 】定时器的初始值计算 详解

2023-11-17

首先值得一提的是:51单片机定时器与主程序是并行工作的,就是主程序在运行的时候,定时器也在计数,计数溢出后定时器中断主程序的运行,转而执行中断服务程序。此外还有串行口、中断系统…,都独立的工作,不用 CPU 干预。

正文部分:

好了,我们先来看初始值计算公式:

公式:(216 X)× 12 ÷ 晶振频率 = 定时时间(默认单位us
—————————————————————————————————
X是未知量
—————————————————————————————————
216是根据方式选择的,可以自行选择,方式1为16位
方式0 :213 (少用)
方式1 :216 (最常用)
方式2 :28 (常用)

假设:

定时器T0工作在方式一,晶振频率为11.0592MHZ,需要定时时间0.5s

那么计算思路是这样的:
1. 首先要知道1s=1000ms,1ms=1000us。
2. 由公式可得:(216-0)× 12 ÷ 11.0592=71ms,定时时间最大只能算到71ms,而0.5s=500ms,距离需要的时间还差429ms,剩下的怎么办?
3. 所以,这个时候我们需要退一步计算,算个5ms再循环个100次,这样就可以得到5ms*100=500ms(0.5s)。

5ms的定时时间先换算成us单位就是5000us
公式:(216-X)× 12 ÷ 11.0592=5000(us)
得 X=60928
把十进制60928转换为16进制=0xee00,分配高8位TH=0xee,低8位TL=0x00,
初始值这样就算好了。

转换进制不熟练的同学可以用win10自带的计算器进行转换。

#include<reg51.h>
   char i=100;    //用来循环100次,5ms*100=500ms,500ms=0.5s
   
  void Timer0Init(void)	 //5毫秒@11.0592MHz 定时器T0 子程序
{
	TMOD &= 0xF0;  //设置定时器模式
	TMOD |= 0x01;  //设置定时器模式
	
	TL0 = 0x00;	   //低8位
	TH0 = 0xEE;	   //高8位
	    //高8位与低8位共同组成初始值
	
	TF0 = 0;	   //清除TF0标志
	TR0 = 1;       //定时器0开始计时
	ET0 = 1;      //允许定时器T0开启中断
	EA = 1;		  //开启总中断
}

  void main()			//主程序
{
        P2=0Xff;         //led初始化  
        Timer0Init();	//调用定时器的初始化子程序
		while(1);      //等待定时器进入中断
}

  void T0_timer0() interrupt 1       //定时器0 进入中断程序
{
		TH0=0xEE;   //这里需要重新赋初始值,保证每次进入中断函数都是5ms
		TL0=0x00;
     	i--;           //i=100开始循环自减
	      if(i<=0)    //判断(i从100减到0的时候就执行下面程序)
		{
			i=100;   //进来就重置循环次数,保证出去可以重新开始计算
		   P2=~P2;    //取反,i从100减到0刚好是0.5s,取反亮一次
		}	     //亮完后i已经等于100,不满足if判断条件,重新开始定时
}
//end 

当然,有更方便的计算方式,在烧录软件找到定时计算器,选好定时器、工作方式、时钟以及定时长度(初始值),就能自动得到初始值了
在这里插入图片描述

上图四个疑问
1、

定时长度:
看上面公式,我们用到定时器方式一是16位,既216,最大只能算出71ms,我们定时单位是ms的话超出71是没有办法计算的,所以这就是为什么不直接输入500ms的原因。
我们可以输入5ms算出初始值然后循环100次再运行
也可以输入50ms得到初始值循环10次再运行,结果都是一样的。

2、

选择定时器:
定时器0和定时器1都可以选择,只是有优先级设置——通过IP寄存器设定,但只有高和低两种,同等优先级时,先响应定时器0。
只使用一个定时器时,随便选一个就行。

3、

定时器模式:
1.模式分8、13、16位(具体看下表 定时器模式表),因为我们选择了方式一(216),所以在模式中选择16位。
2.自动重载与无自动重载区别:无自动重载(下表方式0和方式1)特点是计数溢出后计数器全为0,在使用循环定时/计数时会影响精度。自动重载就是为了解决该问题而设计的。

注意:89c52是没有 16位重载 的,选择的时候具体要看单片机手册,这里选 16位 即可。

4、

定时器时钟:
标准8051单片机为12T。
STC12系列有1T和12T,具体看芯片手册,这里不多赘述。

另外,软件里面的程序也是可以直接使用的,只是要稍微修改一下。
删除不用的(AURX)
加入开启条件:
ET0 = 1; //允许定时器T0中断。选择定时器1时改为ET1=1;
EA = 1; //开启总中断
(具体可看上面的代码)
在这里插入图片描述

用软件里的定时功能计算减去了我们自己写和计算的步骤,方便快捷准确,没用过的可以试一下哦。
定时器模式表:
定时器方式
选择相应的方式:
方式0 :213,(不常用)
方式1 :216 ,(最常用)
方式2 :28,(常用)
方式3 :现在基本上没人用了,稍微了解下即可

补充内容:关于定时器为什么进入中断后需要再次赋初始值?

首先, 8051的定时器只有方式二为自动重载,意思进中断后出去会自动重新开始计数,如果你使用的是方式二,那么就不用重新赋值。(虽然方便,但定时器的每次最大定时时间变短了,计数器到达255us就会溢出)。
其次,如果你采用的是其它方式,如:方式三的16位模式。在开始时,定时器减去初始装载值然后刚好达到需要的时间便溢出(这时候已经从65535跳为0了)进入中断。那么进入中断后TH0和TL0已经不是你在外面赋的初值了,出去会重新从0开始计算,这样会大大影响精度,所以需要在中断里重新赋初始值,保证出去后从上次的地方开始计数,这样就保证了精度。

举个例子:你有一个计数器,从0-100s的,只有归0后才会响。但是你想设置10s就响一次,那么你并不需要等待0~100s这么长的时间,这个时候就需要给它一个初值了,设置从90s开始计数,达到100s后刚刚好为10s,这个时候计数器会响一次,但是响完后它已经是0了,想要重新响需要100s后才能响,所以,最好的办法就是响铃后自动给它重新定一个从90s开始的计数,这样就能实现每10s响一次了。

定时器的原理便是如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【51单片机 】定时器的初始值计算 详解 的相关文章

随机推荐

  • Unity3D 使用TextMeshPro中文字体

    这一篇简单描述一下如果使用unity的一个强大的文字组件或者插件 开始 第一步 如果你是unity2018版本的话 在编辑器里面的AssetPackgeManager找到这个插件 没有的话就在搜索框里面搜索下载 如果你是低于2018的版本
  • Xilinx ISE系列教程(8):读取FPGA芯片唯一ID号

    文章目录 toc 应用场景 方法1 通过JTAG读取 方法2 调用原语读取 DNA PORT原语的使用 DNACLK频率注意 本文是Xilinx ISE系列教程的第8篇文章 用过单片机的朋友都知道 单片机芯片内部都有一串序列号 比如STM3
  • OkHttp库简介

    一直以来 Java并没有什么比较好用的HTTP库 JDK自带的HTTP类又非常旧 难以使用 今天我发现了一个使用比较广泛的OkHttp库 它在安卓和Java领域都有使用 在Github上的星数有两万多 所以我们可以放心的使用 安装 先来看看
  • linkToDeath机制了解和使用

    转自 http www jianshu com p e38f08e34686 在学习Binder和AIDL的过程中遇到的一些有意思的事情 linkToDeath机制 我们先看看官网如何介绍 When working with remote
  • pytorch:参数pin_memory=True和non_blocking=True的作用

    目录 一 pin memory 二 non blocking 一 pin memory pin memory是dataloader 的参数 默认值为False 其作用是是否把把数据存放在锁页内存中 主机的内存根据物理内存 内存条 与虚拟内存
  • 服务器2012系统截屏,Windows Server 2012 R2 Preview界面截图

    微软将在BUILD大会上公开发布Windows 8 1 预览版 Windows 8 1是Windows Blue升级项目的一部分 那么一直以来与Windows客户端如影随形的Windows Server呢 是的 Blue项目并非仅为Wind
  • 微信小程序和APP优劣势大对比

    小程序的优势 1 无需下载 随走随关 2 功能丰富 体验更简便 3 接口众多 可以进行不断的开发 4 流量入口大 背靠日活9 6亿的微信 5 有强大的微信生态环境 小程序对比APP的好处 1 开发成本低 2 开发门槛低 3 获客成本低于Ap
  • 星星之火-47: 5G的八大组网方案

    目录 1 5G组网方案概述 2 选项3系列 4G LTE接入网 5G NR 接入网 4G LTE核心网 3 选项2 5G NR 5G 核心网 4 选项7系列 4G LTE接入网 5G NR接入网 5G核心网 5 选项4系列 4G LTE接入
  • Qt进程间通信

    进程是操作系统的基础之一 一个进程可以认为是一个正在执行的程序 我们可以把进程当做计算机运行时的一个基础单位 关于进程的讨论已经超出了本章的范畴 现在我们假定你是了解这个概念的 在 Qt 中 我们使用 QProcess 来表示一个进程 这个
  • .getClass.getClassLoader.getResourceAsStream的方式加载文件,总是为null加载不到数据

    记录一个问题 我在用如下的代码加载配置文件的时候 总是加载不到数据 文件位置的对的 SparkSessionBase getClass getClassLoader getResourceAsStream spark conf proper
  • Unity之脚本API笔记一(Transform详解及使用方法)

    一 什么是Transform 场景中的每一个物体都有一个Transform 用于存储和操作对象的位置 旋转和缩放 存在层级关系 父级和子级 二 常用变量与属性 位置 1 位置 position 世界坐标 localposition 相对坐标
  • https通讯过程,常见的状态码,DNS解析过程

    一 https通讯过程 1 客户端发起HTTPS请求 然后连接到服务器的443端口 2 传送服务器的证书给客户端 自己颁发的证书需要客户端验证通过 才可以继续访问 而使用受信任的公司申请的证书则不会弹出提示页面 3 客户端收到服务器端的证书
  • JDBC入门

    JDBC 1 JAVA DATABASE CONNECTION 导入jar包 驱动 加载驱动类 Class forName 类名 给出url username password 其中url背下来 jdbc 使用DriverManger来得到
  • Tensorflow学习笔记(一)拟合线性平面 逐句解析

    TensorFlow Python API 依赖 Python 2 7 版本 Python 程序生成了一些三维数据 然后用一个平面拟合它 import tensorflow as tf import numpy as np 使用 NumPy
  • 基于CentOS 7.6安装及配置APISIX 3.0环境

    最近一直在研究微服务相关内容 通过对比各大API网关 发现新起之秀 APISIX无论从开源程度上来讲还是功能上 都拥有很大的优势 经历了几天折磨一样的学习 目前在本地环境中配置成功了一套 以供自己留存吧 实在是网上的很多文章要么太老了 要么
  • 小程序项目实战(二)

    此文章用于总结自己的知识点 有这个项目有兴趣的伙伴可以点击下方链接购买学习 小程序音乐项目开发实战 大神coderwhy新课 学习视频教程 腾讯课堂课程简介https ke qq com course 4162214 一 了解小程序中的基础
  • 自己创建下拉框数组

    自己创建1 8的数组供下拉框选择 this scanPositions new Array 8 fill null map i index gt return label index 1 车 value index 1
  • 2023年第1季社区Task挑战赛开启,等你来战!

    社区Task挑战赛是面向社区开发者开展的代码或教程征集活动 该挑战赛为社区中热爱FISCO BCOS及周边组件的开发者提供了探索区块链技术 挑战技术难题的舞台 该挑战赛去年在社区成功举办了3季 共吸引了数百名开发者报名 前3季都有哪些有趣的
  • Java多态

    关于引用的进一步理解 交换值 因为Java方法在传递参数的时候都是值传递 那么如何通过方法实现2个数的值交换 明确 在传引用的时候 到底拿引用干了个啥 class Value public int a public class Test p
  • 【51单片机 】定时器的初始值计算 详解

    首先值得一提的是 51单片机定时器与主程序是并行工作的 就是主程序在运行的时候 定时器也在计数 计数溢出后定时器中断主程序的运行 转而执行中断服务程序 此外还有串行口 中断系统 都独立的工作 不用 CPU 干预 正文部分 好了 我们先来看初