定时和计数的基本概念
中国古代先贤发明过一种通过流水计时的器皿,名为“滴漏”。它通过固定孔令水滴入容器,每滴3下为一秒,每滴180下为一分,每滴10800下为一时,以此形成了早的计时器。
计数是指对事件或事物的数量进行统计,常以1为单位进行累加,如统计水滴的数量。当被统计事件的产生存在时间规律的时候,计数的结果乘以事件发生的时间间隔,就变成了计时。
在单片机中,对应的“水滴”由时钟源提供。假设时钟源为12MHz,时钟周期为1/12 μs,则可以通过编程设置单片机按照1个时钟周期的速度或者是按照12个时钟周期的速度进行加1统计。
2.STC15W4K32S4单片机的定时器/计数器
STC15W4K32S4系列单片机内部设置了5个16位定时器/计数器:T0,T1,T2,T3和T1。
这5个16位定时器/计数器都具有计数和定时两种工作方式。对定时器/计数器10和T1而言,用它们在特殊功能寄存器TMOD中相对应的控制位C/T)来选择10或1为定时器还是计数器。
对定时器/计数器T2,用特殊功能寄存器AUXR中的控制位(T2C/ī)来选择T2为定时器还是计数器。
定时器/计数器的核心部件是一个加法计数誓,其本质是对脉冲进行计数,计数和定时的区别只在于计数脉冲的来源:如果计数来冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟或者每1个时钟得到了个计数脉冲,计数值加1;如果计数脉冲来自单片机外部引脚(TO为P3.4,T1为F5.5.12为F3.1,T3为Po.5,T4为P0.7),则为计数方式,每来1个脉冲加工。
溢出和溢出标志
当水滴持续滴入时,因为容器大小有限,盛满了就会溢出,就需要清空容器。对单片机而言,就是通过定时器/计数器溢出标志(查询方式下)/中断请求标志(中断方式下)对单片机进行提醒,通知单片机定时时间到,或者是计数次数到。
设置定时器/计数器的初值
STC15W4K32S4单片机的定时器/计数器的核心是一个16位的加法计数器,其本质是对脉冲进行计数,其取值范围是0~65535。运行的过程一旦开始,就不再需要CPU的关注而独立运行,直到对应的溢出标志位的状态发生了改变,进而通过软件查询的方式进行处理,或是通过触发中断来让CPU执行中断服务子程序。
因此,在实际应用中用户需要采用预设初值的方式,让定时器/计数器在达到合理的时间或计数值的时候产生溢出。
现在假设时钟源为12MHz,分别有如下要求:
(1)计数到10800溢出
定时器/计数器大计数值为65 535,即计数到65536时会产生溢出。如果需要计数到10800时产生溢出,则应该设置计数器初始值:
X=65 =54 736=D5D0H
(2)定时10000 μs溢出
定时器/计数器大定时值为65 536次×1 μs/次=65 536 μs。若需定时10 000 μs之后产生溢出,则需要统计计数脉冲10000次,此时设置定时器初始值:
X=65 =55 536=D8F0H
单片机中定时器通常要求不断地重复定时,溢出以后需要再次把初
始值送入到定时器中,如此来保证下一轮的定时时间还是10000μs。
定时器/计数器TO,T1的特殊功能寄存器
STC15W4K32S4系列单片机内部定时器/计数器TO,T1的工作方式和控制主要由TCON,TMOD和AUXR三个特殊功能寄存器进行管理。
利用定时器/计数器T 作方式0)控制流水灯
由于采用的是软件查询方式,因此每1s定时时间到触发溢出标志后,必须用软件清零溢出标志。定时器的具体设置如下:
TMOD =0x00;
AUXR=0x00; //设置T1作为定时器工作在方式0,可省
//设置T1为12T模式,可省
TH1=()/256;//设置定时器初值,单次定时50ms
TI1=()256;
//启动 T1
TR1=1;
while(!TF1); //软件查询TF1的状态,等待50ms定时时间到
TF1=0;//清零溢出标志,为循环定时做准备
通过软件编程的方式反复查询溢出标志TF1的状态。当定时时间到后,TF1会被置
1.因此,只需要查询TF1是否等于1即可得知定时时间是否到,所以程序中用“while
(!TF1)”这一循环语句来查询判断,等待50 ms定时时间到。
利用定时器/计数器T1中断方式(工作方式0)控制流水灯
由于定时器工作在中断模式下,每一次50 ms定时时间到均会触发中断标志位TF1,单片机响应中断后,内部硬件电路会自动将TF1清零,因此在编写程序时不需要使用软件对TF1清零。定时器的具体设置如下:
TMOD= 0x00; //设置T1作为定时器工作在方式0,可省
TH1=()/256; //设置定时器初值,定时50ms
TL1=()号256;
EA=1; //使能中断允许总控制位
ET1=1; //使能T1中断允许控制位
TR1=1; //启动 T1
T1工作在中断方式时,当定时时间50 ms到后,会自动触发中断执行中断服务子程序。