首页 理论教育AVR单片机定时/计数器仿真练习

AVR单片机定时/计数器仿真练习

【摘要】:TC0单次定时时间与系统时钟频率、预分频比及TCNT0初值密切相关,需要仔细考虑和计算,但向导程序可以很轻松地为我们解决这些问题。向导程序将为我们计算出合适的预分频比及定时器初值,并打开TC0中断,同时还给出了单次定时的误差。计数器溢出后本应自动从0开始计数,但在TC0中断服务程序中计数初值被更改为0x64,而且应该一进入中断服务程序立即被更改。

定时/计数器TC0仿真的硬件电路和上例中完全一样,我们要做的就是再添加一个关于定时/计数器TC0的任务。TC0的应用比较简单,定时和计数本质上都是计数。如果能确切知道计数信号源的周期或频率,就是定时。此例中,我们就用TC0来制作一个秒表。由于TC0是8位定时/计数器,系统时钟频率又较高,即便分频之后,定时计时器计满一次的时间也很难达到1 s。我们可以设置TC0单次定时20 ms,重复50次,即为1 s。TC0单次定时时间与系统时钟频率、预分频比及TCNT0初值密切相关,需要仔细考虑和计算,但向导程序可以很轻松地为我们解决这些问题。

此例中,不需要再新建项目。在原项目中再调出向导程序,按上例中设置好时钟频率(内部8 MHz)后,单击“Timers/Counters”,接着在右边“Requiements”下,“Period”后输入准备让TC0单次定时的时间,如20 ms,然后单击“Apply”。向导程序将为我们计算出合适的预分频比及定时器初值,并打开TC0中断,同时还给出了单次定时的误差。单击“Program”→“Generate”菜单命令,在右边窗口中生成预览程序,从中拷贝出关于TC0相关的函数和设置语句,然后关闭向导程序。修改后的程序如下,TC0计数器溢出中断服务程序中可得到定时秒数,在新增的tc0()函数中显示这个秒数。在当前系统时钟和分频比设置下,TC0每次从0x64开始对分频后的时钟脉冲计数,计到255后溢出,期间用时20 ms。计数器溢出后本应自动从0开始计数,但在TC0中断服务程序中计数初值被更改为0x64,而且应该一进入中断服务程序立即被更改。通常,这20 ms的定时会有微秒量级的误差,为了准确定时1 s,可以在1 s的最后一个20 ms定时过程中再重新确定一个计数初值,将前面积累的误差补偿回来。相对于delay函数,用定时/计数器定时更准确,并且不占用CPU。

由于增加了一个任务,mode取值范围为0、1、2。

TC0进一步练习:(www.chuimin.cn)

(1)用TC0精确定时控制5个发光二极管亮灭间隔时间分别为100 ms、200 ms、300 ms、400 ms和500 ms,看看它们的亮度有何不同。

(2)用TC0定时和发光二极管制作一组红绿灯,用按键能控制绿灯常亮。