回答了一个关于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)
/******************************************************/
注意:表格中的数据只适合上述延时模块。
这篇文章里面,也没有写清楚系统晶振是多少,所以做而论道也未进行实验,希望网友们进行测试。