定时器工作模式

点击打开在线编译器,边学边练

1.两种“试管”

这种“试管”有65535个刻度的型号,也有255个刻度的型号,不过我们的导管水流流速是永远不变的。

如果我们用的是大试管(65535个刻度),那么溢出时间我们可以控制的长一些,也就是定时时间可以多一点。我们要是想定时36个单位刻度的时间,那就先往试管装好65500个刻度的水量先,这样等到水位到达65535那个刻度时,再加一个刻度就溢出了,这时溢出的就是36个单位刻度的时间。

“试管”每次水溢出,试管里的水就会消失不见(归0),如果我们还想定时36个单位刻度的时间,还需要重新把65500个刻度的水量再次装好给“试管”。

如果我们用的是小试管(255个刻度),虽然它的定时时间远远没有大试管的定时时间长,但是只要我们第一次装好水量,每次它溢出之后,不会马上归0,而是试管里的水重新归为我们第一次那个时候装好的水量,所以只要在第一次确定了水量,也就确定了以后的所有定时时长。

这种叫做“试管”的东西就是我们单片机内部的另一个寄存器,51单片机有两个定时器,分别叫做定时器0和定时器1,跟外部中断有 0和1的两个硬件资源一样。这里我们先拿定时器0来讲解,定时器1大体原理都一样。

 

2.“试管”的选择

而我们想选用哪个“试管”作为定时时长,首先需要初始化寄存器TMOD相对应的位的值。先看到下面这张图

8.1.png

可以看到圈出来的左右两个紫色框,4~7位是管定时器1的,0~3位是管定时器0的。

第2和第3位我们还没学到,此时不需要理会,主要看第0和第1位,这两个位决定的是我们该选用哪个“试管”。

如果M1=0,M0=1,选用的是“大试管定时模式”。

如果M1=1,M0=0,选用的是“小试管定时模式”。

因为我们暂时没有使用到定时器1,所以4~7位(俗称高4位)可以全置为0,2~3位用不到,也是置为0,我们先选择大试管作为定时时间先,所以TMOD这个寄存器初始化就是“TMOD=0x01;”

这里要注意,因为“M1”和“M0”在“#include<reg52.h>”头文件中并没有“sbit M0=TMOD^0;”的内容,所以我们初始化只能是“TMOD=0x01;”一次操作8个位,而在程序里书写“M1=0;”和“M0=1;”是错误的。

我们把使用“大试管”称为定时器的工作模式1,使用“小试管”称为定时器的工作模式2。


本文固定URL:https://www.dotcpp.com/course/372

上一课:定时器概念 下一课:定时时长的作法
第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)