上一节的模块化编程,我们已经引出了定时器的影子。那这一节我们将重点讲一讲定时器的使用。
一、定时器的作用
1、首先是定时器不等于计数器,同一时间内2,这2个功能只能实现一个。2、定时器主要起到的作用时延时。和我们的延时子程序一样。但定时器的优点在于,它比延时子程序更加精确。而且最重要的是,定时器的中断不会干扰其它功能。不同于延时子程序,一旦执行,那其他功能都会停止。
二、工作原理
上图是定时期的工作原理,标准的51单片机配备2个定时器,但我的板子是多加了一个。
一、定时器工作的第一步就是启动,定时器它是一个机器,是机器就得先启动。
二、机器周期
三、初值寄存器
四、自动加一
五、溢出
我们通过上图依次解读上面五步原理。当我们给单片机通电时,TH0(高八位)和TL0(低八位)均为初值0。每经过一个机器周期,TL0就加1。(TL0加满时就开始加TH0)只到加到65535。这时高八位与第八位均位1。那么接下来在过一个机器周期,定时器就会溢出,且高低八位均为0,这就是溢出的意思。一次溢出就带表一次定时周期结束。如果我们设置机器周期为1us,那么经过65536个us一次定时结束,那就代表我们的一次定时为65.536ms。但在我们实际使用时,没有人会把一次定时周期,设为65.536ms,那假如我们像设置成50ms,又该如何操作呢。那就涉及到我们定时器初值的计算。
初值的计算、
我们知道高八位和第八位属于单片机的硬件,我们肯定无法修改。那么只能从初值考虑。也就是那65536(注意:不是65535)减去你想设置的时长,然后转换成对应的16进制。详细见上图。
最终在代码我们统一写成上述形式。
报备、
启动这一步,我们就要用到TMOD这个寄存器。前面我们说过大部分板子都有2个定时器,一个是T1,一个是T0,其中每个定时器又包含4种工作方式。至于哪种工作方式,我们主要通过操控M1和M0来实现。
方式0 便是M1,M0均位0。
方式1 M1为0,M0为1
方式2 M1为1 ,M0为0
方式3 M1为1,M0为1
至于每种方式的不同,以及各个方式的作用我们下节再讲。
启动、
启动也是很简单,如果我们想使用定时期,只要将TR0置1即可。如果想停止,那就置0。
等待、
等待即为查询定时器是否溢出。如何查询主要是观察TF0。值得注意的是TF0起始状态为0,一旦溢出则系统自动置1。所以我们通常采取手动置1。即TF0=0。(这一步又称清溢出)
重置初值、
假如我们想让定时器循环20次(如果机器周期为50ms,那循环20次就是1s),所以这就是重置初值的意义。
三、代码设计
四、总结
本节为51单片机的重点。需要了解定时器相比于延时子函数的优点。以及结合上一节的模块化编程,自己写一个定时器的模板,方便自己下次使用。