51单片机的一个延时,我问下这个延时是具体怎么执行延时的?

void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--);
{
DelayUs2x(245);
DelayUs2x(245);
}
}

    需要延时的时候,在程序中带参数调用DelayMs,参数传递给DelayMs的形式参数“unsigned char t”,t就有了数值。

    “while(t--);”执行t个循环后退出,t个循环用了若干时间。

    连续执行两条“DelayUs2x(245);”,原理同第1,2步,也用了若干时间。

    以上执行用的时间就是你延时的时间。

    问题点:程序有失误,DelayMs里的while(t--)后边不能有分号,这样t个循环才能作用到下边的两条“DelayUs2x(245);”

追问

能讲下怎么算这个延时时间不?

追答

延时时间的精确计算只能通过汇编语言来看,通过晶振频率算出每条指令的时间,然后计算指令数。

如果想用C语言实现精确延时,可以用定时器中断来做。

你的这种方法,可以做不是特别精确的延时,原因主要在于while(t--)在编译成机器指令后的不确定性(基本指令是确定的,但是涉及到编译器差异,其他中断影响等因素),还有函数调用过程中的其他处理,导致了指令数的相对不确定。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-09-24
void DelayUs2x(unsigned char t)
{
while(--t);//t不等于0就t-1并执行一次空指令,直到t=0;
}

void DelayMs(unsigned char t)
{
while(t--);//按我的理解这个你写错了,分号不应在这里。现在这么写,就只执行t次空操作
{
DelayUs2x(245);//执行一次245x2us延时
DelayUs2x(245);//;//执行一次245x2us延时
}//分号应该在这里,
}追问

恩,对了,分号应该去掉,能顺便问下,这延时具体是延时多少时间,怎么计算的?

追答

具体延时多少时间跟什么单片机,多少频率的晶振,单片机的配置。都有关系。。。按程序的字面意思DelayUs2x(unsigned char t)就是说t多少就t*2us的意思。。。。
同理DelayMs(unsigned char t)这个延时t毫秒的意识,那在里面为什么不是250呢?因为这个是C语言,有那么点不准(编译后会发现,另有些耗时的语句),所以写的人校正了一下这个值,改为245

第2个回答  2014-09-24
指令执行需要时间 所以通过这个延时追问

void DelayMs(unsigned char t)
{
while(t--);
{
DelayUs2x(245);
DelayUs2x(245);
}
}
我是问具体怎么执行延时

追答

通过不停的循环,直到满足跳出循环 前面不是说过指令执行需要时间嘛
就这样延时的