打印

浅谈软件延时

[复制链接]
9161|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
渤海三叠浪|  楼主 | 2009-3-9 21:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
很多的单片机的真高手和假高手 都不喜欢用  软件延时 !

我不是高手,所以我还用!!!

我只用过keil编译器 !


KEIL 编译器的优化级别 对我写得下面这些函数是有影响的..

Keil V8.02 中第0-3级   是一个档

           4-5级是  一个档

      6-9级是一个档

===========================

例如下的这些例子在 0-3的级别下还是很精确的


注意:INT8U  你用 unsigned char 替代就可以用了


/*------------------------
    软件延时(单位:秒)   KEIL 优化级别为0-3时
-------------------------*/
/*------------------------
    最长延时时间255秒 晶振12Mhz
         
        若count=0,实际延时0.000014秒
        若count=1,实际延时1.000024秒
        若count=2,实际延时2.000034秒
        若count=3,实际延时3.000044秒
        若count=n,实际延时n + 0.000014 + (0.00001 * n)秒
//---------------------------------------------
void Delay_Sec(INT8U count)
{
    long int i;
    INT8U j;
    for (j = 0; j < count; j++) {
        for (i = 0; i < 16666; i++) {
            ;
        }
    }
}



/*------------------------
    软件延时(单位:秒)  KEIL 优化级别为0-3时
-------------------------*/
/*------------------------
    最长延时时间255秒 晶振11.0592Mhz
         
        若count=0,实际延时0.00001519秒
        若count=1,实际延时1.00006945秒
        若count=2,实际延时2.00012369秒
        若count=3,实际延时3.00017795秒

        若count=n,实际延时n + 0.00001519 + (0.0000542 * n)秒
//------------------------
void Delay_Sec(INT8U count)
{
    long int i;
    INT8U j;
    for (j = 0; j < count; j++) {
        for (i = 0; i < 15360; i++) {
            ;
        }
    }
}
-------------------------*/


/*------------------------
    软件延时(单位:秒)   KEIL 优化级别为0-3时

-------------------------*/
/*------------------------
    最长延时时间255秒 晶振22.1184Mhz
         
        若count=0,实际延时0.00000760秒
        若count=1,实际延时1.00041667秒
        若count=2,实际延时2.00082574秒
        若count=3,实际延时3.00123481秒

        若count=n,实际延时n + 0.00000760 + (0.00040907 * n)秒
//---------------------------------
void Delay_Sec(INT8U count)
{
    INT16U i;
    INT8U  j;
    for (j = 0; j < count; j++) {
        for (i = 0; i < 47275; i++) {
            ;
        }
    }
}
-------------------------*/

==========================================================

========================

==========================

/*------------------------
    软件延时(单位:毫秒)  KEIL  v8.02  优化级别 0-3好用
-------------------------*/
/*------------------------
    最长延时时间255毫秒 晶振22.1184Mhz
         
        若count=0,实际延时0.00760毫秒
        若count=1,实际延时1.00966毫秒
        若count=2,实际延时2.01172毫秒
        若count=3,实际延时3.01378毫秒

        若count=n,实际延时n + 0.00760 + (0.00206 * n)毫秒
//---------------------------------
void Delay_Ms(INT8U count)
{
    INT8U i;
    INT8U j;
    for (j = 0; j < count; j++) {
        for (i = 0; i < 229; i++) {
            ;
        }
    }
}


/*------------------------
    软件延时(单位:毫秒)  keil V8.02 优化级别 0-3好用
-------------------------*/
/*------------------------
    最长延时时间255毫秒 晶振11.0592Mhz
         
        若count=0,实际延时0.01519毫秒
        若count=1,实际延时1.02105毫秒
        若count=2,实际延时2.02691毫秒
        若count=3,实际延时3.03277毫秒

        若count=n,实际延时n + 0.01519 + (0.00586 * n)毫秒
//---------------------------------
void Delay_Ms(INT8U count)
{
    INT8U i;
    INT8U j;
    for (j = 0; j < count; j++) {
        for (i = 0; i < 114; i++) {
            ;
        }
    }
}
-------------------------*/


/*------------------------
    最长延时时间255毫秒     晶振12Mhz  (优化级别 0-3好用)
                                 
    软件延时(单位:毫秒)    (若count=0,实际延时0.014毫秒
       若count=1,实际延时1.021毫秒
       若count=2,实际延时2.028毫秒
       若count=3,实际延时3.035毫秒
       若count=4,实际延时4.042毫秒
       若count=5,实际延时5.049毫秒)
             若count=n,实际延时n + 0.014 + (0.007 * n)毫秒
//---------------------------------
void Delay_Ms(INT8U count)
{
    INT8U i;
    INT8U j;
    for (j = 0; j < count; j++) {
        for (i = 0; i < 124; i++) {
            ;
        }
    }
}
-------------------------*/

以上 这些函数 如果你将keil 优化级别设置为  4 或者是5 也是 可以用的  ,不过  就不是很精确了 !!

就是说我那些 计算 延时的公式 就不是非常非常准确了,不过也可以凑合着用  !! 就是那些 若 Count  =    ,,, 实际延时 是  ...........的 那些公式。


如果优化级别是6-9那么这些公式就非常不准确了!!!至于为什么不准确,你看看优化级别的说明就清楚了!!

=========================

再次强调  这些公式都是我自己推推导出来的 所以很有可能存在问题  
这些公式的推导 (在优化级别0-3时 ) 考虑的是 count =0 到 255的这256种情况下的准确性 。而不仅仅是其中的一种情况。


======================================================

那么在所有的优化级别下的通用的 延时函数应该怎么写呢?

应该是用那个 _nop_(); 吧  这样编译器就不会优化掉这些_nop_();了。调用那个叫 strings。h ,差不多是这个名字。这个你肯定比我清楚 !

相关帖子

沙发
xiaoaihua| | 2009-3-9 21:07 | 只看该作者

不懂!哎

使用特权

评论回复
板凳
渤海三叠浪|  楼主 | 2009-3-9 21:09 | 只看该作者

楼上肯定是高手了!!

我一般是不懂装懂!!

使用特权

评论回复
地板
ayb_ice| | 2009-3-9 21:23 | 只看该作者

即使要用软件延时

也最好用混合编程,这样可以不受优化的影响,另外注意写法,C也可以不受优化的影响.

使用特权

评论回复
5
渤海三叠浪|  楼主 | 2009-3-9 21:30 | 只看该作者

混合编程

混合编程 是降龙十八掌的第18掌,可以作为你的独门绝技,   还是不要轻易使用 ,用了会伤元气的!!!

使用特权

评论回复
6
HotC51| | 2009-3-9 21:32 | 只看该作者

汇编数组是“降龙十九掌”~~~

使用特权

评论回复
7
渤海三叠浪|  楼主 | 2009-3-9 21:41 | 只看该作者

一个子函数 用了3个goto,1个continue,2个break 是 第20掌

使用特权

评论回复
8
HotC51| | 2009-3-9 21:50 | 只看该作者

超过1mS就别软件延时了~~~

使用特权

评论回复
9
E007| | 2009-3-9 22:16 | 只看该作者

同意楼上~

我的程序一般会用一个自动重载定时器实现 1ms 中断,在很多地方都能派上用场,在超过 1ms 的延时时,用毫秒计数器,这个计数器在每次中断时是+1或-1的,程序只要循环检测或在大循环里加入检测这个值是否达到预定值即可.更复杂的延时也可以用这个定时器来实现子延时,只要根据需要定义相关的计数器就行了,比较容易.对于uS级的延时才用软件延时,比如读写18B20这样的芯片等,一般如果没有这样的设备的话,只使用定时器就可以了,只要定时器的溢出时间设置好,剩下的工作就只是计数.

使用特权

评论回复
10
5880527| | 2009-3-10 10:47 | 只看该作者

一字可以写成一横,二字可以写成两横,三字也可以

万字就不太适合那样写了

使用特权

评论回复
11
ayb_ice| | 2009-3-10 20:46 | 只看该作者

混合编程没有那么可怕

KEIL里其实很简单.

使用特权

评论回复
12
渤海三叠浪|  楼主 | 2009-3-10 22:16 | 只看该作者

回11楼!

穿着雨鞋,就可以走过那片泥沼!

使用特权

评论回复
13
ayb_ice| | 2009-3-11 21:47 | 只看该作者

回12L

搞不好,雨鞋要进水的.

使用特权

评论回复
14
平常人| | 2009-3-11 23:20 | 只看该作者

软件延时的技术可以用,但不要定量

需要较为精确延时的时候不要用。

使用特权

评论回复
15
soso| | 2009-3-12 00:01 | 只看该作者

精确的定时还是靠硬件

使用特权

评论回复
16
McuIsp| | 2009-3-12 01:18 | 只看该作者

Cortex-M3采用Systick,零资源占用软件延时。

使用特权

评论回复
17
machunshui| | 2009-3-12 08:25 | 只看该作者

超过10ms延时,用软件延时,不好.

超过10ms延时,用软件延时,不好.

低于10ms的延时,
用个for循环,
for前后读定时器,
得到循环的延时时间,
根据需要调整即可.
误差很小.

用不着死记硬背这些东西.

使用特权

评论回复
18
cooperate| | 2009-3-12 13:04 | 只看该作者

运用之秒 存乎一心

    ms以下的短延时,while循环、定时器计数、NOP叠加等等都能精确实现。对于长延时,恐怕是共行一道各行其妙了,谈什么高手不高手的纯粹扯鸟蛋。
    对于LZ的2层for循环的方法实现延时,鄙人不反对,也不提倡。吹毛求疵地说,LZ的for代码是新手级的。
    理由:(1)用常数比较而不是非零比较,代码烦琐,且不利于计算精确延时;(2)实现长延时的情况下,CPU的利用效率太低。

使用特权

评论回复
19
luoozd| | 2009-3-12 14:26 | 只看该作者

不错!!!

使用特权

评论回复
20
yysmcu| | 2009-3-12 14:35 | 只看该作者

真不懂的看过

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

637

帖子

1

粉丝