打印
[PIC®/AVR®/dsPIC®产品]

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

[复制链接]
1375|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvsezhidu|  楼主 | 2025-4-17 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   因测试示波器需要,用51单片机产生方波,为了精准,决定用定时器,结果波形未达到要求,不知为何?代码如下:
#include <reg51.h>                        //51单片机头文件
#define LED P0

#define  T0_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-18 10:47 | 只看该作者
ai89c51u有示波器例程啊。

使用特权

评论回复
5
喂什么玩意| | 2025-4-25 17:10 | 只看该作者
51单片机的定时器是基于系统时钟频率工作的。你提到使用12 MHz的晶振,这意味着系统时钟频率为12 MHz,时钟周期为 1 / 12 MHz = 83.3ns。

使用特权

评论回复
6
gra22ce| | 2025-5-8 16:13 | 只看该作者
51单片机定时器为16位可编程计数器(由THx和TLx组成),通过预装载值实现定时。所以不准也算是正常吧

使用特权

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

使用特权

评论回复
8
nqty| | 2025-5-8 18:33 | 只看该作者
ISR中的代码(如翻转GPIO、计算重装载值)会占用额外时间,导致实际定时偏差。

使用特权

评论回复
9
teaccch| | 2025-5-8 19:21 | 只看该作者
普通晶振的频率偏差通常为±20ppm~±50ppm,12MHz晶振在25℃下可能偏差±240Hz~±600Hz。

使用特权

评论回复
10
yuliangren| | 2025-5-8 20:43 | 只看该作者
晶振频率随温度变化,典型温度系数为±30ppm/℃,高温或低温环境下误差可能扩大。

使用特权

评论回复
11
hhdhy| | 2025-5-8 22:45 | 只看该作者
以500μs定时为例,若ISR耗时1μs,则单次定时误差为0.2%,多次叠加后误差显著

使用特权

评论回复
12
nuan11nuan| | 2025-5-9 09:11 | 只看该作者
中断优先级冲突,若其他高优先级中断(如外部中断)频繁触发,可能延迟定时器中断响应。

使用特权

评论回复
13
清芯芯清| | 2025-5-9 10:17 | 只看该作者
标准51单片机定时器时钟为系统时钟的1/12,若系统时钟非整数分频(如外部晶振非12MHz倍数),则定时器计数周期存在微小偏差。

使用特权

评论回复
14
pe66ak| | 2025-5-9 12:04 | 只看该作者
51单片机指令执行时间可能为1~4个机器周期,复杂逻辑(如条件判断、循环)可能增加ISR耗时。

使用特权

评论回复
15
suiziq| | 2025-5-9 14:39 | 只看该作者
若通过浮点数计算重装载值(如重装载值=65536-T/12),编译器可能截断小数部分,导致定时偏差。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

24

帖子

0

粉丝