为什么51单片机的定时器计时不准确?

2019-07-15 15:02发布

  1. #include<reg51.h>
  2. int time;
  3. unsigned char code duan[10]={
  4. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  5. 0x7f,0x6f};
  6. //0、1、2、3、4、5、6、7、8、9的显示码
  7. void timer_init()
  8. {
  9.     TMOD=0x02; //定时器工作方式2
  10.         TL0=0x9c;  //初值为156,256溢出,定时100*1us=0.1ms
  11.         ET0=1;
  12.         EA=1;
  13.         TR0=1;
  14. }
  15. void timer0_mod2() interrupt 1         //定时器0的中断编号是1
  16. {
  17.     time++;
  18. }
  19. main()
  20. {
  21.     char i=0;
  22.     P0=0xff;
  23.         i=0;
  24.         timer_init();
  25.         while(1)
  26.         {
  27.             P0=~duan[i];//我用共阳数码管
  28.                 if(time==1000) { time=0;i++; }//理论上0.1秒显示一个数字,实际上慢很多
  29.                 if(i==10)       i=0;
  30.         }
  31. }

复制代码我选择了定时器0的工作方式2
单片机STC90C51
烧录后观察到数码管的数字变化为什么明显比0.1秒慢

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
小小书生NO.1
1楼-- · 2019-07-15 15:37
应该是代码在执行过程中还有什么的中断函数调用中另外消耗了时间吧, 最佳答案
零tot
2楼-- · 2019-07-15 18:21
跟晶振有关把?
福华
3楼-- · 2019-07-15 23:48
零tot 发表于 2016-1-28 22:27
跟晶振有关把?

不会啊。工作方式1定时1秒就正常
twx_1994
4楼-- · 2019-07-15 23:53
有这种问题,我用STC89C52RC单片机的定时器0来计时NEC(红外)脉冲时也出现过这种现象。计时1.125ms的脉冲时,明显定时器TL0、TH0中的数据小于理论计算值,而且还相关比较大(200~300个定时器周期)。但当计时13.5ms的脉冲时,定时器TL0、TH0中的数据与理论计算值接近。不知道是什么原因,有测试过晶振波形,平均是11.079MHZ

一周热门 更多>