单片机延时delay()函数为什么里面变量填5000却是5000ms而不是500ms

一条语句是一条指令吗,如果是,那一个机器周期是1/12*12个振荡周期
*10^-6s,延时函数里5000*110差不多是5*10^5,两个想抵,还有0.5s,也就是500ms,然而实际情况却是5000ms

“一条语句是一条指令吗”
不一定,取决于编译后的结果。
所以你需要了解一下这个110是怎么回事……了解一下编译后的指令为什么是9个周期……
温馨提示:内容为网友见解,仅供参考
第1个回答  2018-08-12
没有具体的延时函数,不知道是多少。那500ms你是怎么计算的?是C语言的程序吗?还是汇编程序?追问

C语言写的,延时函数嵌套两重for循环,一条执行5000次,另一条执行110次

追答

根据你所说,延时函数应该是这样的:
void delay()
{
unsigned int x,j;
for(x=5000;x>0;x--)
for(j=110;j>0;j--);
}
两条for 循环语句编译后可不是一条指令的。按你的计算,一个机器周期是1us,就内循环一条语句 for(j=110;j>0;j--); 编译后就是这些指令的,
;---- Variable 'j?041' assigned to Register 'R4/R5' ----
MOV R5,#06EH ;1us ,这是j=110; 赋初值
MOV R4,#00H ;1us
;--------------------------
;开始内循环110次,共需要990+2=992us
?C0004: ;循环110次,延时110*9=990us
MOV A,R5 ;1us
DEC R5 ;1us
JNZ ?C0011 ;2us
DEC R4 ;1us
?C0011:
MOV A,R5 ;1us
ORL A,R4 ;1us
JNZ ?C0004 ;2us
内循环就是7条指令,每条后有执行的时间,内循环一共需要9us,加上赋初值 j=110 赋初值 的2 us ,内循环110次,共需992us ,再加上外循环一次的时间,需要11us,可见,外循环一次的实际时间是992us+11us=1003us=1ms。
所以,变量填5000却是5000ms,是对的,这时间已经是很准确了。

本回答被网友采纳

单片机延时程序是怎么实现的?
延时是靠CPU执行无关指令,把时间浪费掉。具体来说,DJNZ指令需要2个周期,循环250次就是500个周期,两层循环就是500*500个周期,你调用一次DELAY子程序,CPU就空转250000个周期(注意这个计算不精确),如果晶振是12MHz,那就意味着时间过去了250ms,也就是延时250ms ...

这延时函数怎么理解void Delay1ms
这个delay函数就是通过i,j,k的自减运算来达到延迟效果 一直减到ijk都为0才执行下一段函数 delay(10)就是让单片机进行 i(10) * j(10) * k(50)=5000次的自减运算,时间大约为5000\/8 000 000=0.625ms 自己可以根据这个算法来简单测算出延迟时间 ...

谁帮我看下51单片机流水灯怎么不能正常流水闪亮
你程序最后的运行结果是不是所有LED都亮了,如果是这样的话,就是可能你P0口没有加上拉电阻,单片机P0不加上拉电阻的话,是输出不了高电平的。还有,楼主以后问程序问题的同时,最好也把硬件电路图给出,这样大家也才好回答。。。希望可以帮到你。。。

单片机秒表程序 80C51
delay(5000\/125); \/\/为什么要延时?延时5000us = 5 ms 大概 P0=0x3f; \/\/ Set Function: 8位接口,两行显示,5*10点阵 0x3f LCD_STROBE(); lcd_cmd(0x38);\/\/8 bits interface,2 lines display.5×点阵7\/\/但是这块东西最多支持5*8所以5*10没意义 lcd_cmd(0x0f);\/\/Display On(整体显示), Cursor...

一个单片机晶振为12MHZ,要让单片机延时100ms怎么计算
(若用6M的JT,10ms也就是机器周期计数5000)当然这只是其中一部分,具体还有比如TR0(1)的设置 溢出中断允许等!上面两句等价于 TL0=55536;\/\/(65536-10000)TH0=55536>>8;相当于从55536开始数,数10000次(10ms)后溢出,为一个记数周期 10次后就是100ms 100ms,delay延时程序为:DELAY: ...

用c语言为单片机STC12C2052写一段简单的延时程序!
500ms延时子程序程序: (12MHZ)void delay500ms(void){ unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);} 下面是用了8.0000MHZ的晶振的几个延时程序(用定时0的工作模式1):(1)延时0.9MS void delay_0_9ms(void){ TMOD=0x01; \/*定时器0...

单片机晶振为12MHZ,要让单片机延时100ms怎么计算
晶振为12M,说明一个机器周期为1微秒,100毫秒就是100 000个机器周期。mov r7,#X;3周期 loop:mov r6,#Y;3X周期 djnz r6,$;2XY周期 djnz r7,loop;2X周期 也就是3+5x+2xy=100 000。可取x=194,y=255。此时共延时99 913,即99.913毫秒。

怎样用C8051F单片机的定时器做准确的5MS的延时呢
系统时钟是11.059MHz 那么定时器每走一次是1\/11.059us,那么5ms就要n=5000\/(1\/11.059)次,向定时器(若是16位)初值就是65536-n.外部晶振很准的,程序写好后在用示波器观察,再做细调.

延时5秒加1如何实现,单片机c语言,高手进来,谢谢
中间就什么都不能做了 延时函数 例子:void delay(unsigned char t){ int i=0,m=xxx;for(i;i<t;i++){ \/\/xxx,yyy是一个常量值 跟晶振有关 使得 下面的循环能够达到1s \/\/当然也可以用for循环 while(m--){ n =yyy;while(n--);} } 再main函数调用的时候 delay(5) 就是5s ...

用c语言编写单片机流水灯程序,(8个发光二极管从左至右循环点亮)
voiddelay(void){ unsignedinti,j;for(i=0;i<200;i++)for(j=0;j<1000;j++);} voidmain(void){ while(1){ P3=0xfe;\/\/第一个灯亮 delay();\/\/延时 P3=0xfd;\/\/第二个灯亮 delay();P3=0xfb;\/\/第三个灯亮 delay();P3=0xf7;\/\/第四个灯亮 delay();P3=0xef;\/\/第五个灯亮...

相似回答