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);
}
}
展开
 我来答
heluozhijian
2014-09-24 · TA获得超过587个赞
知道小有建树答主
回答量:630
采纳率:100%
帮助的人:258万
展开全部
  1. 需要延时的时候,在程序中带参数调用DelayMs,参数传递给DelayMs的形式参数“unsigned char t”,t就有了数值。

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

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

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

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

追问
能讲下怎么算这个延时时间不?
追答
延时时间的精确计算只能通过汇编语言来看,通过晶振频率算出每条指令的时间,然后计算指令数。

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

你的这种方法,可以做不是特别精确的延时,原因主要在于while(t--)在编译成机器指令后的不确定性(基本指令是确定的,但是涉及到编译器差异,其他中断影响等因素),还有函数调用过程中的其他处理,导致了指令数的相对不确定。
jmhyys
2014-09-24 · TA获得超过524个赞
知道小有建树答主
回答量:1052
采纳率:62%
帮助的人:286万
展开全部
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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我是猪头四
2014-09-24 · 超过32用户采纳过TA的回答
知道答主
回答量:88
采纳率:0%
帮助的人:45.2万
展开全部
指令执行需要时间 所以通过这个延时
追问
void DelayMs(unsigned char t)
{
while(t--);
{
DelayUs2x(245);
DelayUs2x(245);
}
}
我是问具体怎么执行延时
追答
通过不停的循环,直到满足跳出循环 前面不是说过指令执行需要时间嘛
就这样延时的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式