1. 绪论
本文是对定时计数器的初值设置相关介绍,要想了解入门内容,点击超链接即可。本文回答了为什么要计算计数器初值,为什么不从零开始计数,如何计算定时器初值等疑问。
本文有时会称为计数器又称为定时器,其实两者是一个东西,超链接文章2.2里面有更详细的介绍。
2. 计数器的最大值
方式0:是由TLX(X=0,1)中的低5位与THX的高8位构成的13位计数器。即213=23*1024=8192,也就是方式0可以记8192次数据。
方式1:是由TLX与THX构成16位计数器。即216=26*1024=65536,也就是方式1可以记65536次数据。
方式2:为常数重装置模式,THX中存放重装载初值,TLX进行计数操作。即28=256,也就是方式2可以记256次数据。
方式3:(仅T0)将T0分为两个8位计数器(TL0与TH0)。即28=256,也就是方式3的高低8位分别可以记256次数据。
3. 为什么要进行计数器的初值设置
我们为什么不直接从零开始计数呢?为什么要设置一个定时器初值?
若从零开始计数那么我们需要在程序中多次对TLX与THX查询数值并且对比,这种行为存在着误差,所以不推荐从零开始计数。由于计数器在溢出时,是由CPU自动将溢出标志位(TFX)置1,那么我们只要设置好计数器初始值,若计数器溢出则说明定时时间到再由中断响应,这种方式显然比从零开始计数好的多。
4. 计时器初值的设置
虽然这种方式好,但我们又引入了一个新的问题,就是如何计算计数器的初值。我们要得到计数器的初值来设置一个定时功能,那么了解定时器最大值是必不可少的。
如何得到定时器的最大值,他是由计数器的最大计数次数决定的。第2部分我们了解了计数器在不同方式下的最大计数次数为多少,若我们也知道外接晶振的频率就可以得出一个机器周期的时间为多少,即可以得出最大定时时间为多少。
所以我们在本部分首先要了解一个机器周期是多久、接着计算出定时器在不同工作方式下最大定时时间为多少,然后根据给的定时要求来选取相应的工作方式并且计算初始值。
4.1 一个机器周期的时间计算
1个机器周期=12个时钟周期
1个时钟周期=晶振频率的倒数
例:外接12MHz晶振,一个机器周期时间为多少?
时钟周期 = 1/12MHz = 1/12 us
机器周期 = 12 * 时钟周期 = 1 us
例:外接6MHz晶振,一个机器周期时间为多少?
时钟周期 = 1/6MHz = 1/6 us
机器周期 = 12 * 时钟周期 = 2 us
依次类推
4.2 定时器的最大值
外接12MHz晶振:即1us为一个机器周期。
方式0:TMAX=8192us = 8.192ms
方式1:TMAX=65536us = 65.536ms
方式2、3:TMAX=256us = 0.256ms
当然不同的外接晶振,一个机器周期的时间是不同的,那么得到的定时器最大值也是不同的,我们计算定时器的最大值是要根据外接晶振的频率来计算的。
4.3 设置定时器初值
外接12MHz晶振情况下,若我们需要一个1ms的定时,拿定时器的最大定时时间来判断,那么选方式2,3显然是不合理的,选取方式1可以是可以但是不是最佳选择,显然选取方式0最合适。
1ms=1000us也就是要计数1000个机器周期。方式0计数最大值为8192次,8192-1000=7192,那么初始值就设为7192,将其化为16进值为1C18H=1110000011000B。
因为选取方式0所以将初始值低5位放入TLX中,高8位放入THX中。其TLX写入00011000B=18H,其THX写入11100000B=E0H。
所以要设计一个定时功能,我们首先要了解外接晶振频率,紧接着算出经过一个机器周期所需要的时间,按定时要求选取合适的工作方式并且算出需要多少个机器周期,然后用选取的工作方式最大值减需要的机器人周期即位定时器初始值,将其转化为2进制方便观察更容易往TLX与THX写数值。