中国古代先贤发明了一种通过流水计量时间的装置,称为“滴水”。 它允许水通过固定孔滴入容器中。 每滴3次为一秒,每滴180次为一分钟,每滴10,800次为一小时。 这形成了最早的计时器。
计数是指对事件或事物的数量进行计数,常以1为单位累加,如数水滴的数量。 当所统计的事件的发生存在时间规律时,计数结果乘以事件发生之间的时间间隔就成为计时。
在单片机中,相应的“水滴”由时钟源提供。 假设时钟源为12MHz,时钟周期为1/12μs,单片机可以编程以1个时钟周期或12个时钟周期的速度进行增量统计。
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),则为计数模式,各脉冲被处理。
溢出和溢出标志
当水滴不断滴入时,由于容器尺寸有限,满了就会溢出,需要将容器清空。 对于单片机来说,就是通过定时器/计数器溢出标志位(查询模式下)/中断请求标志位(中断模式下)来提醒单片机,通知单片机计时时间到了,或者计数次数到了。
设置定时器/计数器的初始值
STC15W4K32S4单片机的定时器/计数器的核心是16位加法计数器。 其本质是对脉冲进行计数,其取值范围为0~65535。 运行进程一旦启动,就不再需要CPU的关注,独立运行,直到相应的溢出标志的状态发生变化,然后通过软件查询进行处理,或者通过触发中断让CPU执行中断服务子程序。 程序。
因此,在实际应用中,用户需要使用预设的初始值,以允许定时器/计数器在达到合理的时间或计数值时溢出。
现假设时钟源为12MHz,要求如下:
(1)计数到10800溢出
定时器/计数器的最大计数值为65 535,即计数到65536时会发生溢出。如果需要计数到10800时溢出,则应设置计数器的初始值:
X=65 536-10 800=54 736=D5D0H
(2) 定时10000μs溢出
定时器/计数器的最大计时值为 65 536 次 × 1 μs/次 = 65 536 μs。 如果计时10000μs后发生溢出,则需要对脉冲进行10000次计数。 此时设置定时器的初始值:
X=65 536-10 000=55 536=D8F0H
微控制器中的定时器通常需要重复计时。 溢出后,需要再次重置初始定时器。
将初始值发送给定时器,以保证下一轮计时时间仍为10000μs。
定时器/计数器TO、T1的特殊功能寄存器
STC15W4K32S4系列单片机内部定时器/计数器TO和T1的工作模式和控制主要由三个特殊功能寄存器:TCON、TMOD和AUXR来管理。
使用定时器/计数器T操作模式0)来控制行车灯
由于采用软件查询方式,每1s定时时间触发一次溢出标志后,必须通过软件清零溢出标志。 定时器的具体设置如下:
TMOD=0x00;
辅助=0x00; //设置T1为定时器工作在模式0,可以节省
//设置T1为12T模式,可以节省
TH1=(65536-50000)/256;//设置定时器初始值,单次50ms
TI1=(65536-50000)256;
//开始T1
TR1=1;
while(!TF1); //软件查询TF1的状态并等待50ms定时器超时。
TF1=0; //清除溢出标志,为循环计时做准备
通过软件编程反复查询溢出标志位TF1的状态。当定时器到时,TF1将被置位
1、因此只需检查TF1是否等于1就可以知道定时时间是否已到,所以在程序中使用“while”
(!TF1)”是一个循环语句,进行查询判断,并等待50ms定时器超时。
使用定时器/计数器T1中断方式(工作模式0)控制流水灯
由于定时器工作在中断模式,每次 50 ms 定时时间到时,中断标志 TF1 就会被触发。 单片机响应中断后,内部硬件电路会自动清零TF1,因此编写程序时无需使用软件设置TF1。 清除。 定时器的具体设置如下:
TMOD = 0x00; //设置T1为定时器工作在模式0,可以节省
TH1=(65536-50000)/256; //设置定时器初始值,定时50ms
TL1=(65536-50000)256号;
EA=1; //使能中断使能总控制位
ET1=1; //使能T1中断使能控制位
TR1=1; //开始T1
当T1工作在中断模式时,当50ms的定时时间到时,将自动触发中断,执行中断服务子程序。