如图所示的延时函数是怎么算的,执行第二个for用了多久,12mhz的12m晶振延时1ms

C语言单片机中延时函数的问题_百度知道
C语言单片机中延时函数的问题
}这是我在视屏教程中看见的延时函数;x--)
for(y=z;y&x&gtvoid delay(uchar z){y--);1;1,不懂原理,怎么知道延时多久 比如说delay(10),不知道怎么能写出精确地延时函数,delay(5)是延时多久,现在学到一些要用时序的程序,y;
for(x=1000
提问者采纳
果采用12Mhz的晶振,一条语句运行一次约为1us,很多单片机的书中都有讲到。如果要写精确的延时函数,你这个函数延时应该是Z ms,就要采用单片机中的定时器,可以去查相关资料,delay(10)就是10 ms,不是很精确
其他类似问题
按默认排序
其他1条回答
时钟频率是直接相关的。。,及不同的CPU工作。要写出精确的延时函数。这里说的CPU,对于商业电脑CPU。就delay(10)和delay(5)来说,主要是对于单片机或ARM等微型处理器来说的,那计算方式就会完全不一样了,前者延时时间不一定就是后者的2倍,可能是2倍多一点或少一点,用汇编语言编写。这个跟CPU是直接相关的,需要在非常清楚硬件的情况您好!延时时间的长短跟不同的CPU
您可能关注的推广
延时的相关知识
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁单片机中,每执行一步的时间是多少?即,延时函数是怎么算出来的?_百度知道
单片机中,每执行一步的时间是多少?即,延时函数是怎么算出来的?
提问者采纳
这个看你所用单片机的晶振频率以及单片机型号
例如51系列单片机
其机器频率等于晶振频率12分频 即除以12,用12MHz的晶振时机器频率一MHz
处理一条指令的时间是1us ,用C语言的话时间不太精确,大致一条指令1Us
10^6分之一秒
提问者评价
太给力了,你的回答完美解决了我的问题!
其他类似问题
按默认排序
其他2条回答
取决于单片机所连接的内部或外部时钟源,以及时钟部分的相关设置。
单片机不同 执行时间不同 例如 有1T的单片机 还有12T的,在相同的时钟源下
执行时间也是不同的,还有就是时钟源以及时钟的分频设置。
延时的相关知识
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁一个单片机晶振为12MHZ,要让单片机延时100ms怎么计算_百度知道
一个单片机晶振为12MHZ,要让单片机延时100ms怎么计算
一个单片机晶振为12MHZ,要让单片机延时100ms怎么计算采用汇编语言要具体步骤
#X ;1us 1 DEL1,这个子程序的全部执行时间为(2+3×200+2×200×250)=100;1us X DJNZ R6: MOV R6: MOV R7。这样f=12MHZ时。 对于延时时间为100ms的延时程序.62ms,#Y ,$ 。 当然X、Y值选择恰当;2us X×Y DJNZ R7,一个机器周期为1us DEL,Y=250,DEL1 ;2us 全部指令执行时间为 1+X+2XY +2X+2=3+3X+2XY个机器周期,能更好地满足精度要求,可以选择X=200;2us X RET
其他类似问题
您可能关注的推广
晶振的相关知识
其他3条回答
以下是程序DELAY100MS
MOVLW D'
MOVWF 21HLOOP2
DECFSZ 21H;
MOVWF 20HLOOP1
MOVLW D&#39指令周期T=4*时钟周期=4*1/3us采用2重循环比较好;251'44'12=1&#47,1
GOTO LOOP2
DECFSZ 20H
一个机器周期=12时钟周期 不管时钟多少,都按一个机器周期=12时钟周期计算 //**** 关键 ****// 12MHZ时钟换过来就是1M机器周期(1M/S) 1ms就是1000机器周期; 6MHZ时钟换过来就是0.5M机器周期(0.5M/S) 1ms就是500机器周期 8位计数器最高范围是65536, 如果我们要记时1s,可以以10ms为单位,循环记时100次 现在就是初始化,10ms为例 TL0=-10000; //对T0计数初始化赋值,用12M的JT,10ms也就是机器周期计数10000 TH0=-10000&&8; 这就是初始化,一次溢出10ms (若用6M的JT,10ms也就是机器周期计数5000) 当然这只是其中一部分,具体还有比如TR0(1)的设置 溢出中断允许等! 上面两句等价于 TL0=55536;//() TH0=55536&&8; 相当于从55536开始数, 数10000次(10ms)后溢出,为一个记数周期 10次后就是100ms100ms,delay延时程序为:DELAY:
MOV R3,#64H延时子程序DEL2:
MOV R4,#07BHDEL1:
DJNZ R4,DEL1
DJNZ R3,DEL2
我举得用2的溢出计数计时是比较好的。。
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁请问,用C编写单片机的软件延时程序应该怎么计算延时大小? - 维库电子市场网
请问,用C编写单片机的软件延时程序应该怎么计算延时大小?
作者:kevin_neu 栏目:
请问,用C编写单片机的软件延时程序应该怎么计算延时大小?比如有如下语句:for(i=53;i&0;i--){&&&for(j=13;j&0;j--)&&&&&_nop_();}Fosc=请大家帮帮我,最好能给我一个公式,也就是说对于利用FOR延时,每判断一个条件要耗掉多少个机器周期(12分频);这是一个困扰了我很长时间的问题,由于延时一般都用定时器做,可是最近我遇到了编写虚拟串口的问题。请大家帮帮我。谢谢!
作者: zsmbj 于
22:19:00 发布:
看汇编语句,然后根据汇编语句计算!&
作者: cspdsy 于
23:38:00 发布:
..你要精确的定时还是用TIMER吧...用子程序延时本身就是在那种不是很精确的条件下的呀..精确到1条指令的时间...感觉用这个延时就不合理嘛
作者: fjzwf 于
9:57:00 发布:
现在软件几乎有软件仿真,设好主频,加上断点,看看运行了多少时间就知道了,更本不需要去算
作者: kkyou 于
10:18:00 发布:
的C51编程:51单片机 Keil C 延时程序的简单研究 [isjfk] [417次]
21:50:0851单片机 Keil C 延时程序的简单研究[原创]by: InfiniteSpace Studio/isjfk, 1.21.2004任何人都可以在注明原作者和出处的前提下随意转载这篇文章,但不得用于商业目的。&&&&应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计时器甚至已经全部派上了别的用途。这时就需要我们另想别的办法了。&&&&以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要:&&&&&&&&mov&&&&&r0, #09hloop:&&&djnz&&&&r0, loop51单片机的指令周期是晶振频率的1/12,也就是1us一个周期。mov r0, #09h需要2个极其周期,djnz也需要2个极其周期。那么存在r0里的数就是(20-2)/2。用这种方法,可以非常方便的实现256us以下时间的延时。如果需要更长时间,可以使用两层嵌套。而且精度可以达到2us,一般来说,这已经足够了。&&&&现在,应用更广泛的毫无疑问是Keil的C编译器。相对汇编来说,C固然有很多优点,比如程序易维护,便于理解,适合大的项目。但缺点(我觉得这是C的唯一一个缺点了)就是实时性没有保证,无法预测代码执行的指令周期。因而在实时性要求高的场合,还需要汇编和C的联合应用。但是是不是这样一个延时程序,也需要用汇编来实现呢?为了找到这个答案,我做了一个实验。&&&&用C语言实现延时程序,首先想到的就是C常用的循环语句。下面这段代码是我经常在网上看到的:void delay2(unsigned
i){&&&&for(; i != 0; i--);}到底这段代码能达到多高的精度呢?为了直接衡量这段代码的效果,我把 Keil C 根据这段代码产生的汇编代码找了出来:&&&&&&&&&&&&&; FUNCTION _delay2 (BEGIN)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&; SOURCE
# 18;---- Variable 'i' assigned to Register 'R7' ----&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&; SOURCE
# 19&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&; SOURCE
# 200000&&&&&&&&&?C0007:0000 EF&&&&&&&&&&&&&&&&MOV&&&&&A,R70001 &&&&&&&&&&&&&&JZ&&&&&&?C0010 1F&&&&&&&&&&&&&&&&DEC&&&&&R70004 80FA&&&&&&&&&&&&&&SJMP&&&&?C0007&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&; SOURCE
# 210006&&&&&&&&&?C0010:0006 22&&&&&&&&&&&&&&&&RET&&&&&&&&&&&&&&&&&&; FUNCTION _delay2 (END)真是不看不知道~~~一看才知道这个延时程序是多么的不准点~~~光看主要的那四条语句,就需要6个机器周期。也就是说,它的精度顶多也就是6us而已,这还没算上一条 lcall 和一条 ret。如果我们把调用函数时赋的i值根延时长度列一个表的话,就是:i&&&&delay time/us0&&&&61&&&&122&&&&18...因为函数的调用需要2个时钟周期的lcall,所以delay time比从函数代码的执行时间多2。顺便提一下,有的朋友写的是这样的代码:void delay2(unsigned
i){&&&&&&&&for(a = a != 0; a--);}可能有人认为这会生成更长的汇编代码来,但是事实证明:&&&&&&&&&&&&&; FUNCTION _delay2 (BEGIN)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&; SOURCE
# 18;---- Variable 'i' assigned to Register 'R7' ----&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&; SOURCE
# 19&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&; SOURCE
# 21;---- Variable 'a' assigned to Register 'R7' ----0000&&&&&&&&&?C0007:0000 EF&&&&&&&&&&&&&&&&MOV&&&&&A,R70001 &&&&&&&&&&&&&&JZ&&&&&&?C0010 1F&&&&&&&&&&&&&&&&DEC&&&&&R70004 80FA&&&&&&&&&&&&&&SJMP&&&&?C0007&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&; SOURCE
# 220006&&&&&&&&&?C0010:0006 22&&&&&&&&&&&&&&&&RET&&&&&&&&&&&&&&&&&&; FUNCTION _delay2 (END)其生成的代码是一样的。不过这的确不是什么好的习惯。因为这里实在没有必要再引入多余的变量。我们继续讨论正题。有的朋友为了得当更长的延时,甚至用了这样的代码:void delay2(unsigned
i){&&&&for(; i != 0; i--);}这段代码产生的汇编代码是什么样子的?其实不用想也知道它是如何恐怖的$#^%&%$......让我们看一看:&&&&&&&&&&&&&; FUNCTION _delay2 (BEGIN)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&; SOURCE
# 18&&&&&&&&R&&&&&MOV&&&n
作者: cspdsy 于
23:26:00 发布:
作者: NE5532 于
21:26:00 发布:
楼上“极好”我来个“土”办法:口线做方波,示波器打。例如while(1){ PORTA^=0xFF; delay_function();} * - 本贴最后修改时间: 21:31:19 修改者:
讨论内容:
Copyright &
浙ICP证030469号Author&:&wyl_e.&QQ&:&.&..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
C51 精确延时函数的编写及调试方法
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 js延时函数 的文章

 

随机推荐