关于C语言延时时间的问题

来源:互联网 发布:linux怎么写shell脚本 编辑:程序博客网 时间:2024/05/22 02:13

回答了一个关于C语言延时时间的问题,题目给出延时函数如下:
delay(unsigned int x) {while(x--);}
delay(unsigned int x) {for (i =0, i < x; i++);}
单片机的晶振为12M。
要求说出他们所延迟的时间分别是X的多少倍?怎么计算的。
====================================
最佳答案:
C语言的执行时间,从来就没有计算公式。
C程序的执行时间,和操作系统有很大的关系,和编译软件也有关。
在单片机中,更和变量的存储类型有关(如单字节变量、两字节变量)。
因为有如此多的不确定因素,所以,从来就没有办法计算C的执行时间。
只是可以在仿真调试的时候,进行实际测量,得到一些(难以通用的)经验数据。
楼主要想准确的控制时间,应该研究使用汇编语言,或者使用硬件定时器。
C语言,只能干些粗活。
原题网址:http://zhidao.baidu.com/question/225783032.html
====================================
很多网友在C语言延时函数的延时时间方面,做出了很大的努力。
在网上找到的一篇文章,其中给出了一些经验数据,摘录一些主要内容如下。
=============================================
文章转自 Proteus仿真社区    作者:liaoguobao00
未作验证,如有问题请和原作者联系:
=============================================
用C语言写程序,是非常的简练,不足之处是它的延时很不好控制。
很难知道一段延时程序的精确延时到底是多少,这和汇编延时程序无法相比。
通过测试,给大家提供一个延时子程序模块,并以此给出一个延时的数据表格。

延时模块:
void Delay()
{
    unsigned char a,b,c;
    for(a = 0; a < ?; a++)
      for(b = 0; b < ?; b++)
        for(c = 0; c < ?; c++);
}

其中问号代表要填的数,要延时多少,到下面的表格中去找数据,然后填上就OK!

                  数据表如下
/******************************************************/
延时时间     a的值    b的值    c的值    误差(us)
  10us        1        1        1         -0.5      
  20us        1        1        8          0 
  30us        1        1       15         +0.5
  40us        2        1        9          0 
  50us        1        1       28          0 
  60us        1        1       35         +0.5
  70us        1        1       42         +1
  80us        1        1       48          0
  90us        1        1       55         +0.5 
 100us        1        1       61         -0.5 
 200us        1        1      128          0 
 300us        3        1       63         +1.5 
 400us        2        1      129          0 
 500us        5        1       63         +0.5 
 600us        6        1       63          0 
 700us        7        1       63         -0.5 
 800us        1        3      175         +0.5 
 900us        9        1       63         -1.5 
   1ms        1        3      219         -1.5
   2ms        2        3      220         +3
   3ms        3        3      220         +3
   Xms        X        3      220         +3         
         (X的范围为2到255)
/******************************************************/
注意:表格中的数据只适合上述延时模块。

这篇文章里面,也没有写清楚系统晶振是多少,所以做而论道也未进行实验,希望网友们进行测试。

0 0
原创粉丝点击