• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

单片机延时问题

瞎折腾 2017-09-08 浏览量:1293
void DelayMS(unsigned int ms)
{
     unsigned int i;
         do{
              i = MAIN_Fosc / 13000;
                  while(--i);
     }while(--ms);

}

这里边的i=13000的13000是什么意思?怎么来的?
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 虽说网上说什么自动适应主时钟延时。但无非就多个宏定义而已,说白了就是什么样的单片机执行一条指令要多久,然后多次执行。

    从您的程序上来看,这是51单片机且晶振为12M(也有可能是11.0592M,12T单片机),假设为12M的话,一个机器周期时间就是12 * 1/12 = 1us;

    所以总共执行13000次,即就是13000*1us = 1.3ms  大致1ms,不知道我这样解释楼主赞同不?但是我猜的是11.0592M,因为这样更接近1ms,就这样了吧。



    • 发布于 2017-09-09
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:10

  • 外循环体执行一次1ms的话,内循环是为了执行完有1ms的延时。这个得根绝你的时钟周期 和指令周期计算,假设你的时钟周期是1/12M,指令周期是时钟周期的4倍,那么执行3M条指令是1S。3000条指令是1ms。
    • 发布于2017-09-08
    • 举报
    • 评论 0
    • 1
    • 0

  • 什么单片机stc的吗,说清楚,而且如果是stc单片机,还会有12T和1T模式,问题描述清楚了,才能具体问题具体分析
    • 发布于2017-09-08
    • 举报
    • 评论 0
    • 0
    • 0

  • 这应该是主时钟的分频值吧。

    如果 是13M的时钟,结果是1000,也就是1us时间,1000*1us就是1ms了

    • 发布于2017-09-08
    • 举报
    • 评论 0
    • 0
    • 0

  • 楼主,这估计是根据时钟频率做的一个较简单的延时接口;不推荐这么玩,因为代码没有可移植性,建议延时采用定时器分频做,精度很高。
    • 发布于2017-09-08
    • 举报
    • 评论 0
    • 0
    • 0

  • 时钟的分频值,具体怎么来应该还要看单片机的型号
    • 发布于2017-09-08
    • 举报
    • 评论 0
    • 0
    • 0

  • 和晶振有关,机械周期 = 12*(1/晶振),这个运行1300个机械周期
    • 发布于2017-09-08
    • 举报
    • 评论 0
    • 0
    • 0

  • 应该是和单片机的时钟频率有关,具体还要看单片机型号才行

    • 发布于2017-09-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 这种延时方法,只要一有中断就不准了。不如用定时器
    • 发布于2017-09-20
    • 举报
    • 评论 0
    • 0
    • 0

  • 自动适应主时钟的延时
    • 发布于2017-09-08
    • 举报
    • 评论 0
    • -1
    • 0

相关问题

问题达人换一批

单片机延时问题