这种“试管”有65535个刻度的型号,也有255个刻度的型号,不过我们的导管水流流速是永远不变的。
如果我们用的是大试管(65535个刻度),那么溢出时间我们可以控制的长一些,也就是定时时间可以多一点。我们要是想定时36个单位刻度的时间,那就先往试管装好65500个刻度的水量先,这样等到水位到达65535那个刻度时,再加一个刻度就溢出了,这时溢出的就是36个单位刻度的时间。
“试管”每次水溢出,试管里的水就会消失不见(归0),如果我们还想定时36个单位刻度的时间,还需要重新把65500个刻度的水量再次装好给“试管”。
如果我们用的是小试管(255个刻度),虽然它的定时时间远远没有大试管的定时时间长,但是只要我们第一次装好水量,每次它溢出之后,不会马上归0,而是试管里的水重新归为我们第一次那个时候装好的水量,所以只要在第一次确定了水量,也就确定了以后的所有定时时长。
这种叫做“试管”的东西就是我们单片机内部的另一个寄存器,51单片机有两个定时器,分别叫做定时器0和定时器1,跟外部中断有 0和1的两个硬件资源一样。这里我们先拿定时器0来讲解,定时器1大体原理都一样。
而我们想选用哪个“试管”作为定时时长,首先需要初始化寄存器TMOD相对应的位的值。先看到下面这张图
可以看到圈出来的左右两个紫色框,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
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程