51单片机学习笔记———5.定时器的认识与使用(查询法)
我们日常的生活离不开秒表的计时,它提醒着我们什么时刻该干什么,单片机也一样,通过单片机内置的晶振来计时,首先让我们认识一下针对单片机几个基本概念:
- 时钟周期:
时钟周期 T 是时序中最小的时间单位,具体计算的方法就是 1/时钟源频率,如果晶振是 11.0592M,那么对于我们这个单片机系统来说,时钟周期=1/11059200 秒。
- 机器周期:
我们的单片机完成一个操作的最短时间。机器周期主要针对汇编语言而言,在汇编语言下程序的每一条语句执行所使用的时间都是机器周期的整数倍,而且语句占用的时间是可以计算出来的,而 C 语言一条语句的时间是不确定的,受到诸多因素的影响。 51单片机系列,在其标准架构下一个机器周期是 12 个时钟周期,也就是 12/11059200 秒。现在有不少增强型的 51 单片机,其速度都比较快,有的 1 个机器周期等于 4 个时钟周期,有的 1个机器周期就等于 1 个时钟周期,也就是说大体上其速度可以达到标准 51 架构的 3 倍或 12倍。
- 定时器:
打开定时器后,定时器"存储寄存器"的值经过一个机器周期自动加1,也就是说,机器周期是定时器的计数周期。
我们用水桶灌水的方法来类比计时定时器的用法和基本原理:
-
假设我们单片机的晶振是12MZ
所以有以下结论:时钟周期为1/12000000,机器周期为12/12000000
-
假设我们的定时间隔是20ms
可以这样理解定时间隔:就像手表上有秒,分,时,而这个定时间隔就是类似手表中的最小计时周期,每次计数相同的值:20ms,40ms,60ms,80ms,100ms..........等假设我们想要计时1s,所以我们可以循环定时间隔50次(1s=1000ms=20ms*50)
接下来我们计算定时20ms时水桶里面要装载多少初始水量
通常的做法是用桶的体积减去我们要定时的时间对应的灌水的次数,剩下的就是我们要往水通里装载的水的初始量,于是我们开始往水桶里面灌水,
-
假设我们灌水X次
X*(12/12000000) = 0.2X = 20000;
-
水的初始量
65536-20000=45536
因为采用定时模式1
,将45536转化为十六进制装载到寄存器TH0和TL0中,45536/256 = 177,45536%256 = 244,将177转化为十六进制0XB1装载到TH0,将244转化为十六进制0XF4装载到TL0;
代码如下:
#include<reg52.h>
sbit LED = P0^4;
void main()
{unsigned char cnt = 0;TMOD&=0XFC;//使用定时模式1TMOD|=0X01;TH0 = 0XB1;//装载初始值,定时20msTL0 = 0XF4;TR0 = 1;//启动定时器while(1){if(TF0==1)//检测有无溢出{TF0 = 0;//溢出则置为0TH0 = 0XB1;//重新装载初始值TL0 = 0XF4;cnt++;//计数if(cnt>=50)//计数达到50次意味着到达1s{LED = ~LED;//}}}
}
- 设置定时模式1---------等价于确定容器大小
TMOD&=0XFC;//使用定时模式1TMOD|=0X01;
- 装载初始值--------等价于装载初始的水
TH0 = 0XB1;//装载初始值,定时20msTL0 = 0XF4;
- 启动定时器--------等价于启动倒水
TR0 = 1;//启动定时器
- 时间检测---------等价于水溢出检测
if(TF0==1)//检测有无溢出{TF0 = 0;//溢出则置为0TH0 = 0XB1;//重新装载初始值TL0 = 0XF4;cnt++;//计数if(cnt>=50)//计数达到50次意味着到达1s{LED = ~LED;//}}
还可以理解为:
定时器的寄存器分类:
- 定时值存储寄存器:存储定时器的计数值的。
- 定时器控制寄存器
TCON
- 定时器模式寄存器
TMOD
总结
图片禁止转载,都是博主挨个画的。
发布评论