51单片机的一个延时,我问下这个延时是具体怎么执行延时的?
voidDelayUs2x(unsignedchart){while(--t);}voidDelayMs(unsignedchart){while(t--);{Delay...
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--);
{
DelayUs2x(245);
DelayUs2x(245);
}
} 展开
{
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--)在编译成机器指令后的不确定性(基本指令是确定的,但是涉及到编译器差异,其他中断影响等因素),还有函数调用过程中的其他处理,导致了指令数的相对不确定。
展开全部
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延时
}//分号应该在这里,
}
{
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指令执行需要时间 所以通过这个延时
追问
void DelayMs(unsigned char t)
{
while(t--);
{
DelayUs2x(245);
DelayUs2x(245);
}
}
我是问具体怎么执行延时
追答
通过不停的循环,直到满足跳出循环 前面不是说过指令执行需要时间嘛
就这样延时的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询