单片机里的for循环延时函数怎样理解

void delay(unsigned int delay_time) //延时函数
{
unsigned int j=0;
for(delay_time > 0;delay_time--)
{
for(j=0;j < 200;j++);
}
}

第一个for完成对delay_time参数的控制,即共循环多少次内部循环
第二个for(内部循环),完成对j从0到199的控制,共循环200次。
翻译成汇编就是:
(R0为传递参数)
DELAY:
MOV R1,#200
DJNZ R1,$
DJNZ R0,DELAY
RET追问

那第一个for语句与第二个for语句之间是第一包含第二的关系吗?他是怎样实现延时的?

追答

是的,第一个包含第二个,至于怎么实现延时的就更好理解了,单片机每执行一步都要花费一定时间的,第二个循环里for(j=0;j < 200;j++); 共执行了200个空操作,也就是要花200*T的时间,这里的T是一次空操作需要的时间,注意这里的“空”操作与单片机的“NOP”不要等同来看,对51而言你哥“NOP”只花一个机器周期,但C的一个空循环操作则不然,至少包含一个跳转指令,所以时间要长一些。第一个循环共循环delay_time次,所以延时时间大概为:delay_time*200*T.

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-11-19
第一个for完成对delay_time参数的控制,即共循环多少次内部循环
第二个for(内部循环),完成对j从0到199的控制,共循环200次。
翻译成汇编就是:
(R0为传递参数)
DELAY:
MOV R1,#200
DJNZ R1,$
DJNZ R0,DELAY
RET
第2个回答  2012-04-01
你的第一个for是条件语句吧for(delay_time > 0;delay_time--)!第二个forfor(j=0;j < 200;j++); 是一个计数循环!可以这么理解:j的初值为0,如果小于200,则j加一。当j=200时,跳出循环。。。。。。。。。。。仅供参考
第3个回答  2012-03-30
就是一个死等待执行完一个时间段,类似N个NOP即可
相似回答