我们已经懂得怎么选用“试管”了,如何装多大的“水量”来决定定时的时长呢。首先我们先拿“大试管”来说,定时器0有两个寄存器分别是TH0和TL0,大家再次粗浅的把TH0和TL0认为是两个8位的变量先吧。因为我们用的是“大试管”,这两个8位的变量相当于组合成了16位的变量,TH0是高8位(H:High),TL0是低8位(L:Low)。假如此时再过一个刻度的时间就溢出,
那么此时会有“TH0等于255”,“TL0等于255”,因为二进制的1111111111111111等于十进制的65535。65535再加1就溢出嘛。
可是我们还不知道增加一个刻度的水花费的时间是多少。
这里笔者直接告诉答案给大家,因为我们用的是11.0592M的晶振,所以每增加一个刻度的水花费的时间是(12/11059200)秒。
上面的“(12/11059200)”知识点,如果笔者要全部讲解出原理给大家,需要很多笔墨,建议大家寻找相关的一些机器周期、时钟周期等知识资料和视频讲解来更加深入的理解定时器吧,又或者参考《手把手教你学51单片机》文档5.2节。
不过我们尽量多做几道题目,慢慢知其然先,等大家去涉猎更多的相关知识之后自然会知其所以然,这也是本教程的一个教学特点,鼓励大家多去寻找相关知识混合学习。
如果我们用“大试管”定时20毫秒后触发中断该怎么实现呢?
首先我们先往这两个寄存器填充数值(装好一定的水量)
可以看到,两个“8位的变量”从高到低合起来成为16位的变量,至于定时20ms为什么是这样填充,我们先用反推法给大家演示。
十六进制的0XB800换算成十进制的值为47104,于是定时的时长为(65536-47104)=18432个刻度的单位时间。
18432*(12/11059200)=0.02秒=20毫秒。
我们再正推,要定时50毫秒怎么给TH0和TL0赋初值?
设距离溢出还剩x个刻度,x*(12/11059200)=0.05
解得x=46080。
所以需要提前给“大试管”装好65536-46080=19456个刻度的水量。
也就是填充给TH0和TL0合成的“16位的变量”的值就是19456。
19456换算成十六进制为0x4C00。
所以要定时50毫秒,那么“TH0=0x4C;”、“TL0=0x00;”。
我们这样总结,要定时的时间设为x秒,那么填充给TH0和TL0合成的“16位的变量”的初值就为65536-( x/(12/11059200) )。
因为(12/11059200)代表一个刻度的时间,如果我们要定时的是0.05秒,那么( 0.05/(12/11059200) )就代表要多少个刻度。
而65536-( 0.05/(12/11059200) )就是我们提前要装好的水的刻度。
如果看到这,读者对这三讲的内容还是无法理解定时器的原理的话,就先放一下理论知识上的理解,通过后面我们的几道题目来模糊认识这个硬件模块的功能,往后自己多去了解别人对这个知识点的全面解析,这样才会彻底弄懂这些知识。
这里感慨一句,数学在我们的生活中所发挥的作用是有多大啊!
本文固定URL:https://www.dotcpp.com/course/374
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程