首先值得一提的是: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.5svoid 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;   //这里需要重新赋初始值,保证每次进入中断函数都是5msTL0=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响一次了。

定时器的原理便是如此。

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

  1. STM8单片机定时器1编码器功能使用详解

    ​​​​​​​目录 编码器简介 硬件接线图 编码器接口模式介绍 编写代码 寄存器简介 初始化代码 仿真调试 添加实时观察变量 观察变量值变化 编码器用法总结 查询方式读取 中断方式读取 编码器简介 这 ...

  2. 51单片机中串口波特率的计算方法详解

    首先,波特率并不是指每秒传送多少个字节,而是指每秒能够传送多少个二进制.举例:波特率为9600代表每秒能够传送9600个二进制,而一个字节=8个二进制. 那么,串口是按照什么时间标准来发送数据的? 其 ...

  3. 51单片机入门——动态数码管显示详解

    51单片机:动态数码管显示 - 模块图 - 显示原理 – 消抖 静态数码管技术 + 人眼视觉停留 显示原理类似于以前的 胶片机放影视,也就是只要我切换的速度足够快你就看不出来其实我是一次次显示的(滑稽 ...

  4. 51单片机摇摇棒改字原理详解

    https://blog.csdn.net/qq_43367031/article/details/83095583?tdsourcetag=s_pctim_aiomsg

  5. 51单片机定时器频率计算

    频率是周期的倒数 51单片机定时器中TH与TL可以改变周期来改变频率. 举例如下 3000us=3ms=0.003s   T=0.003s频率=333HZ    2000us=2ms=0.002s   ...

  6. 51单片机定时器及其应用(1)(时钟功能)

    51单片机定时器及其应用(1)(时钟功能)   STC89C51单片机有2个定时器,叫做定时器0和定时器1,可以用作普通定时器,计数器.普通定时器可以用来进行中断定时,波特率发生等,计数器可以用来对脉 ...

  7. c语言单片机定时器的应用程序,51单片机定时器中断程序(C语言)

    51c程序 51单片机定时器中断程序(C语言) 用C语言实现的,先要定义好定时器的初值 不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期 机器周期=12/n(n指晶 ...

  8. 基于51单片机定时器计数+2片74HC595联级+8位数码管时钟+按键修改时间

    基于51单片机定时器计数+2片74HC595联级+8位数码管时钟+按键修改时间 Proteus仿真 实例代码 #include "at89x52.h" /**74hc595引脚定义 ...

  9. 大唐无双零武将经验计算机,大唐无双武将初始值计算加守护计算选择技能分享...

    大唐无双武将初始值计算加守护计算选择技能分享 很多小伙伴刚玩大唐无双,不清楚武将怎么养成.下面小编就为大家带来了大唐无双武将初始值计算加守护计算选择技能分享,有需要的小伙伴一起来看看吧. BB属性如上 ...

最新文章

  1. MySQL中使用innobackupex、xtrabackup进行大数据的备份和还原
  2. a good approach to make demonstrations at the baidu netdisk
  3. oracle导入报错39002,oracle impdp ORA-39002
  4. 计算机电子琴弹奏怎么打开,怎么打开电脑键盘电子琴软件
  5. rocketmq--push消费过程
  6. mysqludf_json将关系数据以JSON编码
  7. MyBatis官方文档-简介
  8. TBase环境部署过程及使用一
  9. Paper:《Pre-Trained Models: Past, Present and Future大规模预训练模型的发展历史、最新现状和未来发展三个方向》翻译与解读
  10. 读书分享《The art of CRM》--CRM的艺术
  11. L1、L2正则regularization和weight decay
  12. 【SSDT】SSDT hook技术
  13. Merriam-Webster's Vocabulary Builder 学习笔记 Unit 19
  14. [导入]阿里妈妈广告牌生成器
  15. 【深入理解RabbitMQ】RabbitMQ exclusive和mandatory的理解
  16. ssh localhost失败:Permission denied (publickey).
  17. linux ps结果解析,Linux笔记-ps -aux的结果解析
  18. DaoCloud Rest API 体验
  19. Unity3D游戏制作——人物移动逻辑
  20. Java实现播放Mp3的功能

热门文章

  1. 信息网络传播中的服务器标准,信息网络传播行为的界定标准研究
  2. 《C#网络编程高级篇之网页游戏辅助程序设计(扫描版)》
  3. 【工业4.0】深度报告:独家解密工业4.0真正图谋?
  4. 计算机地图制图的过程,第四章计算机地图制图过程.ppt
  5. 卡西欧G-SHOCK 5146/5425使用说明书
  6. 4年翻4倍年薪30W+的测试工程师个人成长之路
  7. Rust初学者环境搭建(非Viatual Studio ,自定义安装目录)
  8. 工业智能网关在物联网系统中扮演什么角色?
  9. win10系统下帝国时代罗马复兴修改流程
  10. Win下批处理获取系统版本号