单片机编程中,定时器(Timer)的本质是计数器,它对固定的机器周期或外部脉冲进行计数。设置定时时间的关键在于计算出计数初值,并将该初值写入定时器的计数寄存器,同时配置好工作模式与中断使能。定时时间的通用计算公式为:定时时间 = 计数值 × 计数周期,其中计数值 = 定时器溢出值(如8位为256,16位为65536)减去初值。

以经典的51单片机为例,其定时器工作在方式1(16位定时)时,定时时间计算公式为:T = (65536 - 初值) × 12 / Fosc,其中Fosc为晶振频率。若晶振为12MHz,则机器周期为1μs,想要定时10ms,需要的计数值为10000,初值 = 65536 - 10000 = 55536,转换为十六进制为0xD8F0。程序初始化时需写入:TH0 = 0xD8; TL0 = 0xF0; 并配置TMOD = 0x01(定时器0,方式1),启动定时器用TR0 = 1。若开启中断,还需设置ET0 = 1和EA = 1,中断服务函数中需重新装载初值并清除中断标志。
对于STM32单片机,定时器时间计算基于预分频值(PSC)和自动重载值(ARR)。定时时间公式为:T = (PSC + 1) × (ARR + 1) / 定时器时钟频率。例如使用TIM2,时钟频率为72MHz,要定时1ms,可选择预分频系数为71(即PSC = 71),则计数频率为1MHz,即计数周期为1μs,那么ARR = 999。配置时使用标准库函数:TIM_TimeBaseInitTypeDef结构体设置TIM_Prescaler、TIM_Period等参数,最后调用TIM_Cmd使能定时器。若产生更新中断,还需配置TIM_ITConfig和NVIC。
在编程中,定时器设置的完整流程通常为:1. 使能定时器时钟;2. 设置预分频系数和重载值;3. 设置计数模式(向上、向下、中央对齐);4. 配置中断优先级并使能中断;5. 启动定时器;6. 在中断服务函数中执行周期任务并重装初值(或使用硬件自动重载)。不同单片机的寄存器名称与位数不同,但核心逻辑均为计数初值 = 目标时间 / 计数周期。实际开发中要注意误差累积、晶振精度以及中断处理时间。对于高精度定时,应选择硬件定时器而非软件延时,并使用自动重载模式避免频繁重装初值带来的误差。
此外,定时器的定时时长上限取决于计数器位数和预分频范围。例如16位定时器在最低预分频下,最大定时时间较短;若要实现长时间定时(如1秒),通常采用计数器级联、软件扩展(计数溢出次数累加)或RTC实时时钟。设置定时器时还需区分定时器模式与计数器模式:定时器对内部时钟计数,计数器对外部脉冲计数。编程时务必确认寄存器地址和位定义,参考对应芯片的数据手册,避免因时钟树配置错误导致时间偏差。正确设置定时器后,单片机即可按预期周期执行中断任务,实现精确的延时、采样、波形输出等功能。

查看详情

查看详情