m0_63950676 2022-06-20 23:00 采纳率: 0%
浏览 90

51单片机自定义毫秒级延时函数时遇到定时不准确的问题

51单片机自定义毫秒级延时函数时遇到定时不准确的问题

编程环境keil5,语言C

不明白具体原因

1.问题描述
刚接触51单片机编程,使用C语言想实现延迟,通过官方STC-ISP软件只能自动生成指定时间的延迟函数。非常不方便每次需要修改延迟时间都要重新生产延迟函数。于是想自己设计一个可以在编程时自己控制的毫秒级延迟程序。
自动生成的一毫秒延迟函数为:

void Delay1ms()        //@11.0592MHz
{
    unsigned char i, j;

    _nop_();
    _nop_();
    _nop_();
    i = 11;
    j = 190;
    do
    {
        while (--j);
    } while (--i);
}

这个时候是没有形式参数,和返回值。于是想修改成需要一个参数的函数,参数既为具体需要延迟的毫秒数的函数:

void Delayms(unsigned int count)        //@11.0592MHz
{
    unsigned int i, j;

    _nop_();
    _nop_();
    _nop_();
    i = 11 * count;
    j = 190;
    do
    {
        while (--j);
    } while (--i);
}

将数据类型unsigned char 修改成unsigned int是因为unsigned char 最大只能存储500+的数值容易溢出于是修改为unsign int类型。结果发现实际延迟效果远远大于于其的延迟效果。

2.可能原因
51延迟是通过多次计算来实现延迟,因为每次计算的机器周期数量是固定的,调用能实现精确的延迟。所以我觉得可能是因为修改类型后每次计算所需要的机器周期数量增大,所以实际延迟效果远远大于预期效果。

3.一种解决办法,改变嵌套循环i、j的类型,将count用于外层的while循环此时延迟效果与预期效果相近。

void Delayms(unsigned int count)        //@11.0592MHz
{
    unsigned char i, j;

  while(count)
{
  count-=1;

      _nop_();
      _nop_();
      _nop_();
      i = 11 ;
      j = 190;
      do
      {
          while (--j);
      } while (--i);
}
}

4.所以到底是为什么呢

  • 写回答

5条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-06-21 06:00
    关注
    可以看下 c参考手册中的 c语言--函数
    评论

报告相同问题?

问题事件

  • 创建了问题 6月20日

悬赏问题

  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试