51单片机的延时程序,用的而是12M晶振,延时了大约多久呢。只需要大概

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-06-28
51单片机延时函数的问题。晶振是12MHz..需要延时1秒

很简单, for循环也是需要时间的.
当你使用仿真的时候,通常可以在编译器里面查看这段代码的汇编指令.
你可以看书它的用到了多少个汇编指令, 然后在你的芯片手册上查询,每一个汇编指令执行需要多少个最小指令周期. 最小指令周期才是你说的1um, 全部加起来, 你就知道你这句话用掉了多少个最小指令.
很明显 远远超过了1个最小指令.9秒的的误差算少的了...
所以说,假如你要做1s的延迟, 最好使用内部时钟中断来做,直接在程序内部delay延时的话,占用系统资源还算不准...
具体解释下上图, 为了拿这5分还真不容易...
首先, 进入函数就需要5个汇编指令, 这些指令主要是入栈,备份指针的操作, 不同的编译器指令不同,但都差不多.... 当然 这5个指令是进入函数只跑一次, 占用时间不多, 消耗时间最多的是你for循环内部的指令, 一个for循环需要8条汇编指令才能实现, 而每个汇编指令通常都需要消耗1-2个最小指令循环,具体那个指令消耗几个循环我懒的查手册, 不同的芯片不一样, 你自己看看你用的芯片手册把....
以上... 应该清楚了把.. 不明白追问, 我要是再次无聊的话, 会修改回答.

错了应为
void Delay15us(uint i )
{
do
{ _nop_();
}while(--i);
}
51 单片机的指令周期是晶振频率的1/12,也就是1us一个指令周期。
有 _nop_();
while(--i);两条指令
延时2*i us

告诉你一个很容易的办法,要想知道这段程序用了多少指令周期就把这段程序放在KEIL C51里面调用,在调用前记住机器周期数,调用完之后会产生一个新的周期数,这两个周期数的差值就是这段程序执行完所需要的周期数了,然后再根据使用晶振频率计算出周期的时间,这个方法对精确延时调试很管用的,多少可以用NOP空指令补,希望能采纳

大概延时了4毫秒多点。

  • 51单片机 晶振为12Mhz,求算精确的延时时间 要是给出详细的计算过程的话...
    答:应该是2mS左右 1void delay1(int x){while(--x);} delay(1)是14us 接下来执行--每个需8us delay1(50)为406us 2void delay2(int t){ int i;for(i=0;i<t;i++);} for(i=0;i<t;i++);这句需要36us ,每个循环需要16us ,delay2(100);=36+99*16=1620us delay1(50);delay...
  • 51单片机延时一秒函数,晶振12MHZ
    答:我这有个函数自己实验出来的,在KEIL里看差不多就是延时1毫秒 void delay1ms(unsigned int t){ unsigned x,y;for(x=t;x>0;x--)for(y=124;y>0;y--);} 把t 改为你要延时的数就可以了,1毫秒就把t改为1 500毫秒就把t改为500 ...
  • 哪位单片机高手详细的告诉我一下:单片机中的延时程序的延时时间怎样计算...
    答:比如 c51单片机的定时器1 是16位定时器 那么就是最大是65536 如果晶振频率是12MHZ 那么 最大定时时间是65.536毫秒 你定时一秒 就可以把定时器装初值 是15536 15536加到65536 正好是50毫秒 经过20次50毫秒 那么就是1s 了
  • 12M晶振,89S51单片机的一秒延时程序,请高手帮忙
    答:L2:MOV R5,#10 设定内循环次数10,本条指令用时1us,可忽略 L3JNZ R5,L3 内循环语句,本条指令用时2us DJNZ R6,L2 中循环语句,本条指令用时2us DJNZ R7,L1 外循环语句,本条指令用时2us RET 本条指令用时1us,可忽略 延时10×250×200×2us+4us=1s 详细请到QQ群:5729033讨论 ...
  • 1,若某一51单片机系统的晶振频率为6MHz(12MHz),试编一个延时1s(2s)的...
    答:;本程序所用晶振为12MHz,12周期模式 ;定时时间为0.5秒的延时器 nop LCALL DELAY ;4uS ;执行上句的时间:4+499995+1(ret时间)=0.5秒 NOP ;===包含LCALL DELAY是0.5秒=== DELAY:MOV R7,#9 ;1uS DELAY1:MOV R6,#128 ;1uS DELAY2:MOV R5,#215 ;=215*2=4...
  • 速回8051单片机的晶振为12MHz,下面是一段延时子程序,计算出该延时子程序...
    答:DEL1:MOV R6,#125; 单周期1s ②这里循环20次,20T DEL2:DJNZ R6,DEL2; 双周期2s ③这里循环20*125次,1000T DJNZ R7,DEL1; 双周期2s ④这里循环20次,40T RET; 单周期1s ⑤这里没有循环,1T 总共延时周期数=①+②+③+④+⑤=1062T 12M晶振时1T=1us,所以总延时时...
  • MCS-51单片机的编程题:已知系统晶振频率为12MHZ,采用定时器T0的方式1...
    答:DELAY1S: MOV TMOD,#01H MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW(65536-50000) SETB TR0 MOV R2,#20LOOP: JNB TF0,$ CLR TF0 CLR TR0 MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW(65536-50000) SETB TR0 DJNZ R2,LOOP RET ...
  • 怎样用51单片机实现小时级延时
    答:说明还没到100次 { TR=1;j=3600;} else { flag_1hour=0; //循环了3600000次10ms,关闭延时标志位。。} } } ET0=1;} 调用程序:void delay1hour(){ delay_1hour=1;i=100;j=3600;TR0=1;}//在任意你想开始延时一小时的地方加这个函数。在延时期间,单片机还可以干其他指令。
  • 单片机延时子程序流程图
    答:延时程序是如何 实现的呢?下面让我们先来了解一些相关的概念。 一、机器周期和指令周期 1.机器周期是指单片机完成一个基本操作所花费的时间,一般使用微秒来计量单片机的运行速度, 51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行 一个机器周期就只需要1μs;如果采用...
  • MCS-51单片机的编程题:已知系统晶振频率为12MHZ,采用定时器T0的方式1...
    答:TH0=(65536-50000)/256;TL0=(65536-500000)%6;EA=1;ET0=1;TR0=1;} 这样初始化就没问题了,另外要实现1S延时,需要在中断函数里加个变量自增,因为我定义的是50ms中断一次,那么这个变量值自增到20后就代表1s时间到,清零这个变量之后方可写你的服务程序。希望我的回答能帮助到你。