51单片机学习笔记 ——(三)定时器

目录

概述

定时器的作用

对(2)的补充说明

STC89C52定时器资源

定时器原理

配置定时器会用到的寄存器

定时器工作模式

模式1的工作框图

时钟部分

计数部分

控制部分

中断部分

实际操作

选择定时器0的模式1

设定定时间隔

初始化中断系统标志

控制定时器0开始计数


概述

定时器属于51单片机的内部资源,不同于前面的外设。

定时器的核心部件就是一个计数器,通过脉冲信号来进行计数,所以也可以看成计数器。

脉冲信号来自系统时钟时,为定时器;脉冲信号来自外部时钟时,为计数器。

定时器的作用

(1)用于计时系统,实现软件计时,使程序每隔一段时间完成一项固定操作。

(2)替代长时间的Delay,提高CPU的运行效率和处理速度。

对(2)的补充说明

因为在Delay的时候,CPU要一直等待,不能进行其他操作,效率很低。

如果使用定时器,CPU就可以在等待的过程中处理其他操作,效率得到了提高。

这就相当于原来用Delay的时候CPU得自己数数计时,有了定时器就相当于CPU有了个闹钟

(3)操作系统的任务切换

STC89C52定时器资源

在使用内部资源时,要学会查找数据手册,数据手册是最详细最权威的解释。

定时器个数:3个(T0、T1、T2),T0和T1与传统51单片机兼容,T2是此型号单片机增加的资源。

定时器原理

正如前面所说,定时器的核心就是计数。我们的系统时钟会一直产生周期性的脉冲信号,定时器就会根据它来进行计数(比如说当上升沿到来时计数值+1)。

光是计数是不够的,我们还需要设置一个计数上限,假设我们设定上限为100,当定时器计数到99之后,下一次计数就会向中断系统发出中断申请,使程序跳转到中断服务函数进行。

打个比方:把定时器看成我们定的闹钟,到达响铃时间之后,闹钟就会打断你现在的工作,提醒你去做另一件事。

配置定时器会用到的寄存器

 

 

 

定时器工作模式

T0和T1均有4种工作模式:

        模式0:13位定时器/计数器

        模式1:16位定时器/计数器(常用)

        模式2:8位自动重装模式

        模式3:2个8位计数器

接下来以模式1为例具体说明定时器原理。

模式1的工作框图

时钟部分

可以看到定时器的时钟有两个来源:SYSclk和T0Pin。

SYSclk就是系统自带的晶振,也就是前面提到的内部时钟。本开发板上的晶振频率为11.0592MHz。

T0Pin对应着单片机的P3_4引脚,也就是前面提到的外部时钟。

选择是外部时钟还是系统时钟是通过C/\overline{T}开关来完成的。C/\overline{T}对应的是TMOD.6。

C/\overline{T}的含义为:如果是高电平(1),那么就是Counter(计数器);如果是低电平(0),那么就是Timer(定时器)。(在数字电路中上面加一横杠代表低电平有效)

如果使用系统时钟,注意到之后还接了两个东西,÷12和÷6。这是分频的意思,也就是说我们需要选择分频模式,如果是12分频,那么最后到达计数部分的脉冲频率就是(11.0592÷12)MHz。

计数部分

TL0(Timer 0 Low Byte)和TH0(Timer 0 High Byte)就是两个8位寄存器,用于存放计数值。

每个脉冲到来都会在TL0里面计数(+1),TL0的8位溢出后向TH0进位,TH0计数溢出之后置位TCON中的溢出标志位TF0(Timer 0 Flag),此时就会向中断系统申请中断。

因为只有16位寄存器,所以最大计数范围是0~2^16-1,也就是0~65535。

控制部分

分析控制部分的门电路,我们可以得到以下结论:

当GATE为0或者\overline{INTO}为1,且TR0为1,开关才会打下。也就是说我们如果想让定时器0的模式1正常工作,我们就必须这样配置寄存器。

中断部分

当定时器16位全满,置位TF0时,中断系统就会接到信号,进行具体的中断操作。

详细内容会在下一章学习笔记里面记录。

实际操作

接下来,假设我们想使用定时器0的模式1,以系统时钟作为脉冲信号,进行每一毫秒一次的中断操作,应该如何配置寄存器呢?

选择定时器0的模式1

首先我们要使用的是定时器0的模式1,所以我们应该配置TMOD.5/TMOD.4为 1 1 ,停用定时器1,既然已经停用了定时器1,我们将定时器1的其他寄存器配置为多少都不会产生影响,所以TMOD的高四位置1。

然后TMOD.1/TMOD.0设置为 0 1 ,启用定时器0的模式1。

令GATE(TMOD.3)= 0 ;使定时器可以正常工作。

C/\overline{T}(TMOD.2)= 0;以系统时钟为信号源。

综上,我们应该写下这样的代码,配置TMOD寄存器。

//这两行是STC-ISP自带的定时器生成器生成的
TMOD = 0xF0 ;//选中定时器0
TMOD |= 0x01 ;//选择定时器0的模式1
//当然也可以直接写一行
//TMOD = 0xF1 ;

设定定时间隔

定时器的上限是固定的,计数到65535就一定会发出中断请求,所以我们如果想改变定时时间,我们就要改变它的起点 。

想要将1毫秒作为定时间隔,首先我们要确定计数一次的时间:1/(11.0592/12)= 1/921600 

然后再计算计数多少次能达到1毫秒:0.001/1/921600 \approx 921 ;

所以初始化定时器的值为:65535 - 921 = 64614 =0xFC66 ;

也就是

TL0 = 0x66;		
TH0 = 0xFC;		

当然在进行中断操作之后,要记得再次令初始值为0xFC66,否则就会只有第一次的定时间隔为1毫秒。

初始化中断系统标志

同时在初始化定时器时,令TF0 = 0 ;这样能保证第一次循环与后面一样。

控制定时器0开始计数

最后令TR0 = 1 ;使定时器可以正常工作。

至于12T和6T模式,STC89C52似乎只能在12T模式下工作。(如有不对请指正,感谢!)

结合上述内容,得到最终初始化定时器的代码:

	TMOD &= 0xF0;		//设置定时器模式(选择定时器0)
	TMOD |= 0x01;		//设置定时器模式(选择定时器0的模式1)
	TL0 = 0x66;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值