找回密码
 注册
查看: 1400|回复: 4
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-11-21 10:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
我这个程序期望功能是输出频率不同的方波波形,但是使用定时器计时的结果跟理想的结果差异很大,比如默认输出频率为100Hz的波形,那周期就应该是10ms,但是我用我的程序仿真出来周期大概是15ms,问题出在哪。
2 D" f5 N, f' p  D2 P( @
  • #include
  • unsigned int F,X = 3;//F是频率(Hz)
  • unsigned int count = 0;
  • unsigned int time,Time1;
  • ***it start = P2^0;
  • ***it output = P1^0;
  • void Frequence_Choice(X)
  • {
  •         switch(X)
  •         {
  •                 case 0: F = 10;break;
  •                 case 1: F = 20;break;
  •                 case 2: F = 50;break;
  •                 case 3: F = 100;break;
  •                 case 4: F = 200;break;
  •                 case 5: F = 500;break;
  •                 case 6: F = 1000;break;
  •         }
  •         Time = 10000 / F;//计算周期
  •         Time1 = Time / 10 * 3;
  • }
  • void out()
  • {
  •         TR0 = 1;
  •         if(count <= Time)
  •         {
  •                 if(count <= Time1)
  •                 output = 1;
  •                 else
  •                 output = 0;
  •         }
  •         else count = 0;
  • }
  • void initialize( void )
  • {
  •         EA = 1;
  •         EX0 = 1;
  •         EX1 = 1;//外部中断开启
  •         IT0 = 1;
  •         IT1 = 1;//设置外部中断触发方式
  •         ET0 = 1;//定时器中断打开
  •         TR0 = 1;//启动定时器0
  •         TH0 = 0xFF;//0xD8;
  •         TL0 = 0x9C;//0xEF;//重置定时器初值(100us)
  • }
  • main()
  • {
  •         initialize();//初始化
  •         Frequence_Choice(X);
  •         while(1)
  •         {
  •         if(start == 0) out();
  •         }
  • }
  • void timer0() interrupt 1
  • {
  •         count++;//计数
  •         TH0 = 0xFF;//0xD8;
  •         TL0 = 0x9C;//0xEF;//重置定时器初值
  • }
  • void add() interrupt 0
  • {
  •         if(X < 6) X = X + 1;
  •         else X = 6;
  •         Frequence_Choice(X);
  • }
  • void subtract() interrupt 2
  • {
  •         if(X > 0) X = X - 1;
  •         else X = 0;
  •         Frequence_Choice(X);
  • }% s( B2 G4 H; n6 @( u- h

% Q8 ^0 q! B( n9 f) Y! h3 y4 }  I- G2 i# s
% }9 V. T# d$ {# h5 g2 f

6 q  `8 _. q6 a2 b# F5 c  w6 b, ^. o

该用户从未签到

2#
发表于 2022-11-21 11:07 | 只看该作者
proteus里面晶振是默认接上的,可以直接设置晶振频率,所以图中没有晶振。

该用户从未签到

3#
发表于 2022-11-21 13:07 | 只看该作者
定时中断那里,计算公式再重新算算,一个不注意就弄错了

该用户从未签到

4#
发表于 2022-11-21 13:51 | 只看该作者
定时器初始化要改,有参考程序。

该用户从未签到

5#
发表于 2022-11-24 09:55 | 只看该作者
根据公式计算单个定时时间,再根据需要的时间定多少个单位时间,就是你需要的时间,如果不准,可能是单位时间的定时定的不准
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-5-29 04:59 , Processed in 0.078125 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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