lvsezhidu 发表于 2025-4-17 10:58

51单片机的定时器定时为何不精准?

   因测试示波器需要,用51单片机产生方波,为了精准,决定用定时器,结果波形未达到要求,不知为何?代码如下:
#include <reg51.h>                        //51单片机头文件
#define LED P0

#defineT0_CNT   1    //定时时间1us,12MHZ晶振
// =========主程序==========================
void main(void)
{       
   TMOD = 0x02;                                     //T0模式2,定时
   //IE = 0x82;                                     //使能T0中断
   EA = 1; ET0 = 1;                               //使能T0中断
       TH0 = 256-T0_CNT ;      //载入定时初值
   TL0 = 256-T0_CNT ;      //载入定时初值
   TR0 = 1;                                             //启动T0
   while(1);                                         //等待中断
}
//======== T0中断=========================
void T0_zd (void) interrupt 1        //中断编号1
{       
           LED = ~LED;      //   
}
Proteus 8.6软件仿真,结果是高低电平各10us的方波,把T0_CNT一直增加到10,结果都是一样,怀疑是Proteus仿真软件的问题,下载到单片机里用示波器检测,结果仍是如此。把T0_CNT一直增加到11,则产生低电平10us,高电平12us的矩形波,下载到单片机里用示波器检测也是如此;把T0_CNT一直增加到12,则产生周期为24us的方波,下载到单片机里用示波器检测也是如此;把T0_CNT一直增加到13,则产生12us+14us的矩形波,下载到单片机里用示波器检测基本是周期24us方波;把T0_CNT一直增加到14,则产生接近周期28us的方波,高低电平持续时间略有差异,下载到单片机里用示波器检测也是如此;把T0_CNT一直增加到15,则产生接近周期30us的方波,高低电平持续时间略有差异,下载到单片机里用示波器检测也是如此;把T0_CNT一直增加到16,则产生接近周期32us的方波,高低电平持续时间基本相同,下载到单片机里用示波器检测也是如此;把T0_CNT一直增加到19,则产生接近周期38us的方波,高低电平持续时间还是有差异,下载到单片机里用示波器检测也是如此;把T0_CNT一直增加到20,则产生接近周期40us的方波,高低电平持续时间相同,下载到单片机里用示波器检测也是如此;T0_CNT大于20,则是稳定的方波,开发板单片机型号STC89C52RD,看来51单片机的定时器也不是很准确,不知何故?请高手解答一下。

稳稳の幸福 发表于 2025-4-17 16:17

可以用定时器做,定时器中断实现翻转输出。

coody 发表于 2025-4-17 22:23

定时器是一个数字外设,本身不会导致误差,其精度跟你的主频一样的。
你应该使用STC这种51,定时器能自动取反IO高速输出的,不需要中断,因为进出中断需要时间。

喂什么玩意 发表于 2025-4-25 17:10

51单片机的定时器是基于系统时钟频率工作的。你提到使用12 MHz的晶振,这意味着系统时钟频率为12 MHz,时钟周期为 1 / 12 MHz = 83.3ns。

gra22ce 发表于 2025-5-8 16:13

51单片机定时器为16位可编程计数器(由THx和TLx组成),通过预装载值实现定时。所以不准也算是正常吧

canfeil 发表于 2025-5-8 17:20

定时器溢出触发中断标志位(TFx)。CPU检测中断并跳转至中断向量表。执行中断服务程序(ISR),清除标志位并重装载定时器。延迟来源:指令周期:51单片机为单周期指令架构,但中断响应仍需3~8个机器周期(如保存现场、跳转指令等)。

nqty 发表于 2025-5-8 18:33

ISR中的代码(如翻转GPIO、计算重装载值)会占用额外时间,导致实际定时偏差。

teaccch 发表于 2025-5-8 19:21

普通晶振的频率偏差通常为±20ppm~±50ppm,12MHz晶振在25℃下可能偏差±240Hz~±600Hz。

yuliangren 发表于 2025-5-8 20:43

晶振频率随温度变化,典型温度系数为±30ppm/℃,高温或低温环境下误差可能扩大。

hhdhy 发表于 2025-5-8 22:45

以500μs定时为例,若ISR耗时1μs,则单次定时误差为0.2%,多次叠加后误差显著

nuan11nuan 发表于 2025-5-9 09:11

中断优先级冲突,若其他高优先级中断(如外部中断)频繁触发,可能延迟定时器中断响应。

清芯芯清 发表于 2025-5-9 10:17

标准51单片机定时器时钟为系统时钟的1/12,若系统时钟非整数分频(如外部晶振非12MHz倍数),则定时器计数周期存在微小偏差。

pe66ak 发表于 2025-5-9 12:04

51单片机指令执行时间可能为1~4个机器周期,复杂逻辑(如条件判断、循环)可能增加ISR耗时。

suiziq 发表于 2025-5-9 14:39

若通过浮点数计算重装载值(如重装载值=65536-T/12),编译器可能截断小数部分,导致定时偏差。

小岛西岸来信 发表于 2025-8-29 12:01

51 单片机定时器定时不精准,主要因:系统时钟源精度不足,受外部晶振误差影响大;定时器溢出后需软件重装初值,存在指令执行延迟;部分型号无自动重装载功能,且中断响应有额外耗时,累计误差明显,尤其在高频定时时更突出。

野玫瑰 发表于 2025-9-16 16:09

51 单片机定时器定时不精准,主要因:1. 采用 RC 振荡或外部低频晶振,频率稳定性差,受温度、电压影响大;2. 定时器计数时,中断响应有延迟;3. 程序执行占用定时器周期,尤其复杂逻辑会导致偏差;4. 部分型号无自动重装载,重载值计算误差累积。高精度场景需外接高频晶振并优化代码。
页: [1]
查看完整版本: 51单片机的定时器定时为何不精准?