发 帖  
原厂入驻New
[问答]

51单片机怎么才能让定时器计时时间足够准确?

1603 单片机 定时器
分享
我这个程序期望功能是输出频率不同的方波波形,但是使用定时器计时的结果跟理想的结果差异很大,比如默认输出频率为100Hz的波形,那周期就应该是10ms,但是我用我的程序仿真出来周期大概是15ms,问题出在哪。




  1. #include <reg51.h>

  2. unsigned int F,X = 3;//F是频率(Hz)
  3. unsigned int count = 0;
  4. unsigned int time,Time1;

  5. sbit start = P2^0;
  6. sbit output = P1^0;

  7. void Frequence_Choice(X)
  8. {
  9.         switch(X)
  10.         {
  11.                 case 0: F = 10;break;
  12.                 case 1: F = 20;break;
  13.                 case 2: F = 50;break;
  14.                 case 3: F = 100;break;
  15.                 case 4: F = 200;break;
  16.                 case 5: F = 500;break;
  17.                 case 6: F = 1000;break;
  18.         }
  19.         Time = 10000 / F;//计算周期
  20.         Time1 = Time / 10 * 3;
  21. }

  22. void out()
  23. {
  24.         TR0 = 1;
  25.         if(count <= Time)
  26.         {
  27.                 if(count <= Time1)
  28.                 output = 1;
  29.                 else
  30.                 output = 0;
  31.         }
  32.         else count = 0;
  33.        
  34. }

  35. void initialize( void )
  36. {
  37.         EA = 1;
  38.         EX0 = 1;
  39.         EX1 = 1;//外部中断开启
  40.        
  41.         IT0 = 1;
  42.         IT1 = 1;//设置外部中断触发方式
  43.        
  44.         ET0 = 1;//定时器中断打开
  45.         TR0 = 1;//启动定时器0
  46.         TH0 = 0xFF;//0xD8;
  47.         TL0 = 0x9C;//0xEF;//重置定时器初值(100us)
  48. }

  49. main()
  50. {
  51.         initialize();//初始化
  52.        
  53.        
  54.         Frequence_Choice(X);
  55.         while(1)
  56.         {
  57.         if(start == 0) out();
  58.         }
  59. }

  60. void timer0() interrupt 1
  61. {
  62.         count++;//计数
  63.         TH0 = 0xFF;//0xD8;
  64.         TL0 = 0x9C;//0xEF;//重置定时器初值
  65. }

  66. void add() interrupt 0
  67. {
  68.         if(X < 6) X = X + 1;
  69.         else X = 6;
  70.         Frequence_Choice(X);
  71. }

  72. void subtract() interrupt 2
  73. {
  74.         if(X > 0) X = X - 1;
  75.         else X = 0;
  76.         Frequence_Choice(X);
  77. }

复制代码



电路.PNG
0
2021-5-19 10:42:12   评论 分享淘帖 邀请回答
5个回答
2021-5-20 08:42:01 6 评论

举报

6 条评论
怎么可能,误差不会这么大
2021-5-20 09:18:55 1 评论

举报

1 条评论
2021-5-20 09:36:46 1 评论

举报

1 条评论
定时器初始化要改,有参考程序。
2021-5-22 16:48:05 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表