单片机循环延时函数

void delay02s(void) //延时0.2秒子程序
{
unsigned char i,j,k; //定义3个无符号字符型数据。
for(i=20;i>0;i--) //作循环延时
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
这个延时函数是怎么工作的啊? 高手详细分析下(刚学单片机 不太懂)

这个延时是通过三个for循环数数实现的,数了20*20*248次,时间刚好是0.2秒,因为单片机每执行一条指令,需要一定的时间。其实,根据不同的晶振产生的时钟,执行每条指令的时间会不一样,用keil软件进行仿真调试能得到一些较精确的延时!
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-04
理论计算是这样的,执行每条自减指令是1us(对于12M的晶振来说的),那么执行以上程序应该是20*20*248=99200,差不多是0.1s。当然这个只是理论上来说,C语言指令的执行时间还是得看软件调试,看上面执行了多久就是多久。按照我的经验,像上面的程序你按着每条自减指令执行是2us来算,然后时间就为20*20*248*2=19840us差不多就是0.2s....我记得汇编计算的时候好像是得乘以2 .....
第2个回答  2011-07-15
根据你所说的、最开根据你所说的、最开始i,j,k,都赋予了初始值,分别是始i,j,k,都赋予了初始值,分别是20、20、248在执行程序是,首先第一次for循环,就是循环i的值,接下来一次循环的就是j、k,每次否循环的时间是8微秒,所以这个程序循环的时间就是20*20*248*8微秒。
第3个回答  2011-07-04
其实就是不做任何操作的循环而已,循环本身是需要时间的,因为要判断条件,增减循环的控制变量。再者,这个程序是在某一特定频率的单片机下的0.2s延迟,时钟频率不一样的单片机还要修改i,j,k的初值才能保证也延迟0.2s
第4个回答  2019-04-02
一个时钟周期=晶振的倒数
51单片机的一个机器周期=6个状态周期=12个时钟周期
一个单周期指令包括一个机器周期,即12个时钟周期,所以12m晶振的话一条单周期指令执行的时间为12*(1除12m)=1us
延时更多的话往上乘就是了

单片机里的for循环延时函数怎样理解
是的,第一个包含第二个,至于怎么实现延时的就更好理解了,单片机每执行一步都要花费一定时间的,第二个循环里for(j=0;j < 200;j++); 共执行了200个空操作,也就是要花200*T的时间,这里的T是一次空操作需要的时间,注意这里的“空”操作与单片机的“NOP”不要等同来看,对51而言你哥“NOP”只花一个机器周...

单片机C语言中,怎么通过循环次数计算延迟函数的延迟时间?
首先你要知道一个指令周期是几秒 算法是1\/(晶振频率除以12)然后你要知道循环究竟执行了几个指令周期 你可以用keil里在线反汇编命令看看你的循环编译成机器语言后到底是几个指令周期 这样就知道了延迟时间 当然你取近似值也可以的 比如 for(i=0,i<255,i++){x=2} 这里x=2是一个指令周期 而执...

单片机延时函数怎么写
用循环指令就可以实现延时了。比如:DELAY:MOV R2,#100 DLY:MOV R3,#250 DJNZ R3,DJNZ R2,DLY RET

当单片机LED灯一亮一灭间隔1秒时怎么办?
当单片机LED灯一亮一灭间隔1秒时,可以使用以下代码实现:\/\/ 初始化IO口 P1 = 0xFF; \/\/ 设置延时时间 while (1) { P1 = 0x00; \/\/ 延时1秒 for (int i = 0; i < 10000; i++) { \/\/ 空循环 } P1 = 0xFF; \/\/ 延时1秒 for (int i = 0; i < 10000; i++) { \/\/ 空循...

51单片机使用汇编语言循环延迟时间怎么算?
第一步:在延时程序没行后边标注该指令执行的机器周期第二步:在机器周期后边乘以该指令循环的次数第三步:计算总共用的机器周期数第四步:计算总延时时间。 本回答由网友推荐 举报| 答案纠错 | 评论(4) 10 1 zhxiufan | 高级工程师 向TA咨询 擅长: IT ...

keil单片机编写的延时函数,第二个for循环没起作用?
你的延时函数所传递的参数定义为一个字节;那么 而你要传递的参数为1000,已经超过一个字节所能表达的最大值了;

单片机 汇编语言有关延时函数时间的计算
1、DJNZ R7,$ :单句执行时间2us,100次就是2*100us,这个循环完成的时长是:200us 2、DJNZ R6,DELAY2 :此层每循环1次,实际时长为200us+2us,所以这一层执行完成的时间是100*(2 + 200)us = 20200us;这个循环判断的执行时长2*100us,与最内层是加的关系,不是乘!3、DJNZ R...

单片机延时函数
第一个函数,比如你输入1000,则a=1000,while(--a==0)这句表示,先判断a是不是等于0,不是就进行循环,是的话就结束循环,判断之后,a进行自减,for()这句实质也就循环一次,什么都不做。延时就是不断循环,什么都不做,如果你要记的话,推荐你记这个:想延时0.5s就输500 void yanshi(...

80c51单片机120秒延时程序怎么编写
为了编写一个80C51单片机的120秒延时程序,需要遵循以下步骤。首先,我们需要创建一个名为“delay”的函数,用于实现延时功能。该函数接收一个参数“z”,即所需延时的周期数。在函数内部,我们使用两个嵌套的循环结构,分别用变量“x”和“y”作为循环计数器。外层循环的次数由参数“z”决定,即循环“z...

stm32中Delay()函数延时的时间是怎么计算的?
)和毫秒级delay_ms()。1.普通延时法这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。\/\/粗延时函数,微秒 void delay_us(u16 time){ u16 i=0;while(time--){ i=10; \/\/自己定义...

相似回答