求单片机软件延时精确计算公式。C编程,for语句。好像与单片机、晶振有关的啊,希望详细回答

如题所述

在不同单片机中,有不同的单片机指令。每个指令都占用不同的时钟周期。一般延时程序就是通过循环去达到延时的作用。下面以最基础的51单片机去做说明:我这边用我之前debug过的2个延时程序,晶振使用12M:void delay_us_fun (unsigned int i) //us延时
{
while (i--);
}这个是用来微秒级延时的,他在不同的参数i下,延时时间分别为实际为(9*i+16)us,这些延时的实际时间一般可以通过开发环境keil C51中模拟一下,看下时钟就知道了。汇编好点的话也可以直接看汇编计算或者直接写汇编程序。 这时我们可以使用下面宏去调用上面的接口#define _delay_us(i) delay_us_fun((i)/9)这边显然有点误差的。但是数值越大,误差就相对小点。仅仅需要几us的延时,使用_NOP_();下面ms级延时一样。void delay_ms_fun (unsigned int mDelay1) //ms延时
{
unsigned int mDelay2; for (; mDelay1 > 0; mDelay1--)
{
for (mDelay2 = 0; mDelay2 < 123; mDelay2++)
{
}
}
} #define _delay_ms(i) delay_ms_fun((i*1000L)/998L) //实际为(i*1000-13)/998 总而言之,就是根据单片机的指令,还有每个指令占用的时钟周期计算出相对应的精确延时。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-27
软件延时的话用C语言是不能做到精确的。因为C语言都要经过编译器变成汇编语言的,然后单片机才能执行。要精确的话只能用汇编语言。然后去数指令的执行时间。 没办法计算,要计算的话,只能看它的反汇编

求单片机软件延时精确计算公式。C编程,for语句。好像与单片机、晶振有关...
void delay_ms_fun (unsigned int mDelay1) \/\/ms延时 { unsigned int mDelay2; for (; mDelay1 > 0; mDelay1--){ for (mDelay2 = 0; mDelay2 < 123; mDelay2++){ } } } #define _delay_ms(i) delay_ms_fun((i*1000L)\/998L) \/\/实际为(i*1000-13)\/998 总而言之,就是根...

请教关于单片机C语言中用while延时的问题
晶振频率Fosc=12MHz,则机械周期 T=12\/Fosc=1us;程序中 的 自加(++)、自减(--) 的执行周期为1个机械周期,即1us;若为 理想状态,则delay(500000)的时间应该是:500000×1us=500ms;但是,编译软件 要把 函数调用、for 语句转换成 机器指令,这是需要一定周期的,周期长短 视不同的编译软件...

单片机C语言中,怎么通过循环次数计算延迟函数的延迟时间?
for(i=0,i<255,i++){x=2} 这里x=2是一个指令周期 而执行了255次 假如你的晶振是12MHZ的 则你执行一个指令周期是1us 255次是0.255ms

单片机C程序 里面何如灵活的使用空指令,for循等环延时
这两者应该是一个平衡取舍,一个是以时间换空间,一个是以空间换时间。延时多长时间,一般要根据实际情况作出计算,应该取一个有一定冗余的值。

单片机延时程序,延时时间计算 for(m=20;m>0;m--) for(n=20;n>0;n...
我结合了你的for循环软件延时来给你简单讲解一下,软件延时是单片机在执行一条空指令耗费的时间,当程序执行到Delay_ms();延时后,先执行M减一次for(m=20;m>0;m--) 接着再执行N减一次for(n=20;n>0;n--),最后是 for(s=248;s>0;s--);这是一个嵌套语句 for(m=20;m>0;m--)m...

哪位高手知道 单片机精确延时1秒得C语言子程序 谢谢了
软件延时:(asm)晶振12MHZ,延时1秒 程序如下:DELAY:MOV 72H,#100 LOOP3:MOV 71H,#100 LOOP1:MOV 70H,#47 LOOP0:DJNZ 70H,LOOP0 NOP DJNZ 71H,LOOP1 MOV 70H,#46 LOOP2:DJNZ 70H,LOOP2 NOP DJNZ 72H,LOOP3 MOV 70H,#48 LOOP4:DJNZ 70H,LOOP4 定时器延时:晶振12MHZ,延时1s,...

请教一下单片机的C语言延时
include <reg52.h> \/ 晶振为12MHZ \/ void DelayS(unsigned int w){ unsigned int i;while(w--){ for(i=45400;i>0;i--){ } } } void main(){ DelayS(2); \/\/这是1秒延时 DelayS(10); \/\/这是5秒延时 DelayS(20); \/\/这是10秒延时 } \/\/刚打的,不懂再问 ...

单片机延时时间程序怎么编程
2、计算延时需要的机器周期。比如采用12M晶振,CPU采用通用8051,那么一个机器周期为1US,50毫秒为50*1000=50000US,需要的机器周期=50000\/1=50000。3、试编程,如下:程序代码 指令时间总共时间 DELAY50MS:;22 MOV R7,#A;1 1 DELAY1:MOV R6,#B;11*A DJNZ R6,$;22*B*A DJNZ R7,DELA...

51单片机C语言for循环延时程序时间计算
不可能的,是不是你的编译有错的啊 我改的晶振12M,在KEIL 4.0 里面编译的,为你得出的结果最大也就是40ms,这是软件的原因,不可能出现100ms那么大的差距,是你的软件的原因。不信你实际编写一个秒钟,利用原理计算编写一个烧进单片机和利用软件测试的秒程序烧进单片机,你会发现原理计算的程序...

求一个严格的单片机c语言延迟函数 要求延迟0.5s 单片机晶振为11.0592...
晶振为12Mhz,z=1,大约为1ms。 专家说治疗早泄,最好采用比较保守和安全的药物治疗,即使采用物理治疗、行为治疗、心理治疗,最好也要结合药物治疗,

相似回答
大家正在搜