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--)在编译成机器指令后的不确定性(基本指令是确定的,但是涉及到编译器差异,其他中断影响等因素),还有函数调用过程中的其他处理,导致了指令数的相对不确定。
恩,对了,分号应该去掉,能顺便问下,这延时具体是延时多少时间,怎么计算的?
追答具体延时多少时间跟什么单片机,多少频率的晶振,单片机的配置。都有关系。。。按程序的字面意思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);
}
}
我是问具体怎么执行延时
通过不停的循环,直到满足跳出循环 前面不是说过指令执行需要时间嘛
就这样延时的