[原创] 快速写出“精确”的延时

weizhongc   2015-8-18 09:10 楼主
               大家都知道精确延时在很多时候是很需要的,可是对于一直用c来写程序的人很难知道自己写的delay  到底延时多久。

              举个例子吧,例如i2c的延时,有时需要delay 4个us,那我只需要写出一个delay为1us的 然后再循环几次就差不多了。虽然循环会来带误差,只要循环次数少些,也不会太大的。

              如何呢确定一个1us的延时,大家可以写一个delay;

             void  delay_us (unsigned short  n)

            {

               unsigned short  i;

                for(n;n>0n--)

                  for(i=0;i<10;i++);



            }

          接下来就是while(1)

        {

             LED = 0;

            delay_us(1);


             LED = 1;

            delay_us(1);


        }

      然后用示波器测量出IO口高低电平的时间就好了,不断修改 for(i=0;i<10;i++);中的i<10  ,直到接近1us就好了



回复评论 (14)

2推荐 huo_hu 

六楼的是,
另外,这样的程序在不同型号的51上由于指令周期不一样,程序兼容性无法保证.
点赞  2015-8-18 11:43
又学一招儿,谢谢楼主
点赞  2015-8-18 09:18
对定好的设计挺好用的,不过有时为了能准一些,来回调整调整时间也不少。还有us多和少的误差也不一样
点赞  2015-8-18 09:19
这个和晶体的频率相关,为什么不做成一个自动计算的函数,而需要自己不断去改程序代码。在avrgcc中,_delay_ms()函数就是这样的,使用方便,不用每次都是调整延时的参数。
点赞  2015-8-18 09:23
用示波器抓的话,得有一个触发源,你这么设置?设置为上升沿出发吗?
点赞  2015-8-18 09:23
用高级语言写循环延迟,是实在没有办法时的办法,因为:
①.中断响应的时机和次数难以控制,无疑这是影响时间精度的要素,如关中断执行延迟则势必使系统的实时性大打折扣;
②.实际延迟时间和编译器及所设置的优化级别有关,编译器重装或遇更新时可能会使执行代码发生变化;
③.程序维护(如修改或升级)时若身边没有可供动作确认目标机,则新产生出的代码不放心。
所以,最好还是用定时器。
点赞  2015-8-18 09:28
引用: 仙猫 发表于 2015-8-18 09:28
用高级语言写循环延迟,是实在没有办法时的办法,因为:
①.中断响应的时机和次数难以控制,无疑这是影响 ...

恩,你说的这个相对复杂的情况下了,上面基本是真对新手的。
点赞  2015-8-18 09:36
我记得有个叫单片机精灵的小工具也可以写出“精确”的延时。只不过和你的不太一样哈。
点赞  2015-8-18 10:08
用汇编应该会更精确,将汇编嵌进来就可以了,要么用定时器吧
点赞  2015-8-18 11:12
学习下。有处代码少了个分号。
坐而言不如起而行
点赞  2015-8-18 11:20
引用: sbjy3814 发表于 2015-8-18 09:23
用示波器抓的话,得有一个触发源,你这么设置?设置为上升沿出发吗?

你看待上升沿或者下降沿都行啊
点赞  2015-8-18 15:07
引用: huaiqiao 发表于 2015-8-18 10:08
我记得有个叫单片机精灵的小工具也可以写出“精确”的延时。只不过和你的不太一样哈。

以前用过啊,好像有些情况不准啊
点赞  2015-8-18 15:08
引用: 247153481 发表于 2015-8-18 11:12
用汇编应该会更精确,将汇编嵌进来就可以了,要么用定时器吧

就是在不会汇编的情况下用的啊
点赞  2015-8-18 15:08
引用: weizhongc 发表于 2015-8-18 15:08
以前用过啊,好像有些情况不准啊

也是一个大概的延时,我倒是没有用示波器看过。
点赞  2015-8-18 15:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复