论坛» 嵌入式开发» MCU

关于延时程序的求助

高工
2012-07-02 22:18 1楼
void delay(uint i) { for(;i!=0;i--); } void delay(uint i) { while(i--); } void delay(uint i) { while(--i); } 求大侠帮忙给个以上三个us级别延时函数的精确度分析,谢谢了!
菜鸟
2012-07-03 13:24 2楼
void delay(uint i)
{
for(;i!=0;i--);
}

oid delay(uint i)
{
while(i--);
}

void delay(uint i)
{ while(--i); }

你的问题,真若有大神也难以回答。
延时函数很难做大精确延时,延时时间的长短取决你CPU的主频和指令周期。

一般的计算延时函数时间的办法:
看看你的代码反汇编成汇编语言的时候,共有几条指令;
你单片机的主频是多少,再对照体系结构计算出每条指令需要几个指令周期,每个指令周期是多长时间。

知道这些才能知道精确的延时。

或者你用示波器去看个大概时间也可以。
精确地定时都是用定时器的,如果是调整时序的时候用到延时,那么精度是不需要这么高的。
高工
2012-07-03 13:36 3楼
谢谢,我就是想知道怎样用这些稍微精确点的程序,12M的晶振。传感器采集数据的情况下经常会用到us级别的延时。。
高工
2012-07-03 19:28 4楼
精确是相对的,你想要多精确?
跟51的汇编程序一样精确到一个机器周期,
这类程序基本不可能

如果只是数据通信用,延时精度应该可以不用作太多考虑

最后,数据通信也也可以用定时器的
专家
2012-07-04 16:01 5楼
i-- 与 --i ,一个是执行了在减,一个是减了再执行!!
高工
2012-07-05 12:57 6楼

一般是在一个时间范围内都能工作

菜鸟
2012-07-05 14:44 7楼

计算指令周期

助工
2012-07-11 08:59 8楼
这个很难算精确,不同编译器,结果都不同,要精确用定时器或用汇编
院士
2012-07-12 09:04 9楼
楼主 是用得什么编译器啊?!
如果是IAR,其提供了官方的库函数__delay_cycles()函数,即为一个机器周期。
菜鸟
2012-09-19 13:56 10楼
值得学习……
共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]