延时程序

合集下载

延时1us程序12mhz晶振c语言,51单片机KeilC延时程序的简单(晶振12MHz,一。。。

延时1us程序12mhz晶振c语言,51单片机KeilC延时程序的简单(晶振12MHz,一。。。

延时1us程序12mhz晶振c语⾔,51单⽚机KeilC延时程序的简单(晶振12MHz,⼀。

⼀. 500ms延时⼦程序void delay500ms(void){unsignedchari,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}产⽣的汇编:C:0x0800 7F0F MOV R7,#0x0FC:0x0802 7ECA MOV R6,#0xCAC:0x0804 7D51 MOV R5,#0x51C:0x0806 DDFE DJNZ R5,C:0806C:0x0808 DEFA DJNZ R6,C:0804C:0x080A DFF6 DJNZ R7,C:0802C:0x080C 22 RET计算分析:程序共有三层循环⼀层循环n:R5*2 = 81*2 = 162us DJNZ 2us⼆层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值1us = 3us三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值1us = 3us循环外: 5us⼦程序调⽤2us +⼦程序返回2us + R7赋值1us = 5us延时总时间=三层循环+循环外= 499995+5 = 500000us =500ms计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5⼆. 200ms延时⼦程序void delay200ms(void){unsignedchari,j,k;for(i=5;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--);}产⽣的汇编C:0x0800 7F05 MOV R7,#0x05C:0x0802 7E84 MOV R6,#0x84C:0x080C 22 RET三. 10ms延时⼦程序void delay10ms(void){unsignedchari,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--);}产⽣的汇编C:0x0800 7F05 MOV R7,#0x05C:0x0802 7E04 MOV R6,#0x04C:0x0804 7DF8 MOV R5,#0xF8C:0x0806 DDFE DJNZ R5,C:0806C:0x0808 DEFA DJNZ R6,C:0804C:0x080A DFF6 DJNZ R7,C:0802C:0x080C 22 RET四. 1s延时⼦程序void delay1s(void){unsignedcharh,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--); }对1s延时的验证:1.设置仿真的晶振为12MHz2.在延时函数设置断点3.单步运⾏程序,到达延时函数的⼊⼝4.先记下进⼊延时函数的时间5.step out跳出函数,记下此时时间,两个时间相减即为延时函数运⾏时间函数运⾏时间=1.00041400-0.00041600≈1s产⽣的汇编C:0x0808 DCFE DJNZ R4,C:0808C:0x080A DDFA DJNZ R5,C:0806C:0x080C DEF6 DJNZ R6,C:0804C:0x080E DFF2 DJNZ R7,C:0802C:0x0810 22 RET在精确延时的计算当中,最容易让⼈忽略的是计算循环外的那部分延时,在对时间要求不⾼的场合,这部分对程序不会造成影响. void mDelay(unsigned int Delay) //Delay = 1000 时间为1S{unsignedinti;for(;Delay>0;Delay--){for(i=0;i<124;i ){;}}}void waitms(inti){charm;for( ; i ;i--){for(m = 203; m ; m--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}}}延时1ms的函数时钟频率12MHzunsigned intsleepTime;unsingedchar inSleep = 0;void sleepService(void)}void isr_timer(void) //假定定时器中断1ms 中断⼀次。

单片机延时500ms程序汇编

单片机延时500ms程序汇编

单片机延时500ms程序汇编一、概述在单片机编程中,延时操作是非常常见且重要的一部分。

延时可以使程序在执行过程中暂停一段时间,以确保输入输出设备能够正常工作,或者是为了保护其他设备。

本文将介绍如何使用汇编语言编写单片机延时500ms的程序。

二、延时原理在单片机中,延时操作通常通过循环来实现。

每个循环需要一定的时间,通过控制循环次数和循环体内的指令数量,可以实现不同长度的延时。

在汇编语言中,可以使用计数器来控制循环次数,从而实现精确的延时操作。

三、汇编语言编写延时程序接下来,我们将使用汇编语言编写延时500ms的程序。

1. 设置计数器初值在程序的开头我们需要设置计数器的初值,这个初值需要根据单片机的工作频率和所需的延时时间来计算。

假设单片机的工作频率为1MHz,那么在循环500次后,就能够达到500ms的延时。

我们需要将计数器的初值设为500。

2. 循环计数接下来,我们进入一个循环,在循环中进行计数操作。

每次循环结束时,都需要检查计数器的值,当计数器减至0时,表示已经达到了500ms的延时时间,可以退出循环。

3. 优化程序为了提高程序的执行效率,可以对计数器进行优化。

例如可以通过嵌套循环的方式,减少循环的次数,从而提高延时的精度和稳定性。

四、程序示例下面是一个简单的示例程序,演示了如何使用汇编语言编写延时500ms的程序。

```org 0x00mov r2, #500 ; 设置计数器初值为500delay_loop:djnz r2, delay_loop ; 进行计数ret ; 延时结束,退出程序```五、结语通过以上的示例程序,我们可以看到如何使用汇编语言编写单片机延时500ms的程序。

当然,实际的延时程序可能会更加复杂,需要根据具体的单片机型号和工作频率进行调整,但是思路是相似的。

在实际的编程中,需要根据具体的需求和硬件环境来进行调整和优化,以实现更加稳定和精确的延时操作。

希望本文对单片机延时程序的编写有所帮助,也欢迎大家在评论区提出宝贵意见和建议。

各种延时程序

各种延时程序
DELAY2: MOV R0,#0B2H
DJNZ R0,$
DJNZ R1,DELAY2 ;延时 100 mS
DJNZ R2,DELAY1
POP R0
POP R1
POP R2
RET
(转贴)精确廷时计算公式:
延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5
另外,网上有很多计算延时的应用程序,我这也有几个,有需要的同学发邮件.
DELAY: MOV R6,#250
DL1: MOV R7,#200
DL2: DJNZ R6,DL2
DJNZ R7,DL1
RET
;延时1046549微秒(12mhz)
;具体的计算公式是:
;((((r7*2+1)+2)*r6+1)+2)*r5+1+4 = ((r7*2+3)*r6+3)
D1: MOV R6,#200;
D2: MOV R5,#248;
DJNZ R5,$
DJNZ R6,D2;
DJNZ R7,D1;
RET
;这样算下来应该是1.000011秒
T_0: MOV R7,#10;
D1: MOV R6,#200;
D2: NOP
K2: MOV R7,#80H ;1指令周期256*10=2560
K3: NOP ;1指令周期
128*256*10=327680
DJNZ R7,K3 ;2指令周期
2*128*256*10=655360
DJNZ R6,K2 ;2指令周期
*r5+5

新手常用单片机延时程序

新手常用单片机延时程序
_NOP_( );
_NOP_( );
}
/*****************11us延时函数*************************/
//
void delay(uint t)
{
for (;t0;t--);
}
1ms延时子程序(12MHZ)
void delay1ms(uint p)//12mhz
DELAY:CLR EX0
MOV TMOD,#01H ;设置定时器的工作方式为方式1
MOV TL0,#0B0H ;给定时器设置计数初始值
MOV TH0,#3CH
SETB TR0;开启定时器
HERE:JBC TF0,NEXT1
SJMP HERE
NEXT1:MOV TL0,#0B0H
MOVTH0,#3CH
DJNZ R7,HERE
CLR TR0;定时器要软件清零
SETB EX0
RET
C语言延时程序:
void delay_18B20(unsigned inti)
{
while(i--);
}
void Delay10us( )//12mhz
{
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
延时则应该注意晶振的频率是多大。
软件延时:(asm)
晶振12MHZ,延时1秒
程序如下:
DELAY:MOV 72H,#100
LOOP3:MOV 71H,#100
LOOP1:MOV 70H,#47
LOOP0JNZ 70H,LOOP0
NOP
DJNZ 71H,LOOP1
MOV 70H,#46
LOOP2JNZ 70H,LOOP2

各种汇编延时程序大集合

各种汇编延时程序大集合
MOV TH0,#3CH
MOV TL0,#0B0H
MOV R4, #10
SETB ET0
SETB EA
SETB TR0
SJMP $ ;
RET
DELAY: ;延时子程序(1秒)
MOV R0,#0AH
DELAY1: MOV R1,#00H
DELAY2: MOV R2,#0B2H
DJNZ ห้องสมุดไป่ตู้2,$
DJNZ R1,DELAY2
DJNZ R0,DELAY1
RET
MOV R2,#10 ;延时1秒
LCALL DELAY
*r5+5
DEL : MOV R5,#08H
DEL1: MOV R6,#0FFH
DEL2: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL2
DJNZ R5,DEL1
RET
;1秒延时子程序是以12MHz晶振
POP R0
POP R1
POP R2
RET
1:DEL: MOV R7, #200
DEL1: MOV R6, #123
NOP
DEL2: DJNZ R6, DEL2
D52: NOP
NOP
NOP
NOP
DJNZ R6,D52
DJNZ R7,D51
POP PSW
RET
DELAY: ;延时1毫秒
PUSH PSW
SETB RS0
MOV R7,#50
D1: MOV R6,#10
D2: DJNZ R6,$
DJNZ R7,D1

汇编延时程序讲解

汇编延时程序讲解

延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指令周期的区别和联系、相关指令的用法等用图解法的形式详尽的回答读者我们知道程序设计是单片机开发最重要的工作,而程序在执行过程中常常需要完成延时的功能。

例如在交通灯的控制程序中,需要控制红灯亮的时间持续30秒,就可以通过延时程序来完成。

延时程序是如何实现的呢?下面让我们先来了解一些相关的概念。

一、机器周期和指令周期1.机器周期是指单片机完成一个基本操作所花费的时间,一般使用微秒来计量单片机的运行速度,51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行一个机器周期就只需要1μs;如果采用的是6MHz 的晶振,那么执行一个机器周期就需要2 μs。

2 .指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。

在51 单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个机器周期),四周期指令(执行这条指令需要四个机器周期)。

除了乘、除两条指令是四周期指令,其余均为单周期或双周期指令。

也就是说,如果51 单片机采用的是12MHz 晶振,那么它执行一条指令一般只需1~2 微秒的时间;如果采用的是6MH 晶振,执行一条指令一般就需2~4 微秒的时间。

现在的单片机有很多种型号,但在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机器周期,了解以上概念后,那么可以依据单片机器件手册中的指令执行周期和单片机所用晶振频率来完成需要精确延时时间的延时程序。

二、延时指令在单片机编程里面并没有真正的延时指令,从上面的概念中我们知道单片机每执行一条指令都需要一定的时间,所以要达到延时的效果,只须让单片机不断地执行没有具体实际意义的指令,从而达到了延时的效果。

delphi 延时的方法

delphi 延时的方法

delphi 延时的方法Delphi是一种流行的编程语言,常用于Windows平台的应用程序开发。

在Delphi中,延时(Delay)是一种常用的操作,用于暂停程序的执行一段时间。

本文将介绍Delphi中常用的延时方法,并探讨其使用场景和注意事项。

一、使用Sleep函数实现延时在Delphi中,可以使用Sleep函数来实现延时效果。

Sleep函数属于Windows API,通过将当前线程挂起一段时间来实现延时。

Sleep函数的参数是以毫秒为单位的时间,表示需要暂停的时间长度。

下面是一个使用Sleep函数实现延时的示例代码:```pascalprocedure Delay(ms: Integer);beginSleep(ms);end;```在上述示例代码中,Delay过程接受一个整数参数ms,表示需要延时的毫秒数。

然后调用Sleep函数,将当前线程挂起指定的时间长度。

使用Sleep函数实现延时的优点是简单易用,代码量少。

但缺点是Sleep函数会阻塞当前线程的执行,导致程序无法响应其他操作。

因此,当需要延时的同时还需要保持程序的响应性时,应考虑其他方法。

二、使用TTimer组件实现延时Delphi中的TTimer组件可以用于实现延时效果,而不阻塞程序的执行。

TTimer组件是一个计时器,可以在指定的时间间隔内触发事件。

下面是一个使用TTimer组件实现延时的示例代码:```pascalprocedure TForm1.Delay(ms: Integer);beginTimer1.Interval := ms;Timer1.Enabled := True;end;procedure TForm1.Timer1Timer(Sender: TObject);beginTimer1.Enabled := False;// 延时结束后要执行的代码end;```在上述示例代码中,Delay过程接受一个整数参数ms,表示需要延时的毫秒数。

51单片机精确延时程序

51单片机精确延时程序

51 单片机精确延时程序51 单片机精确延时程序(晶振12MHz,一个机器周期1us.)几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响.一. 500ms 延时子程序程序:.(晶振12MHz,一个机器周期1us.)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--);}计算分析:程序共有三层循环一层循环n:R5*2 = 81*2 = 162us DJNZ 2us二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5 赋值1us = 3us 三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6 赋值1us = 3us 循环外: 5us 子程序调用2us + 子程序返回2us + R7 赋值1us = 5us延时总时间= 三层循环+ 循环外= 499995+5 = 500000us =500ms计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5二. 200ms 延时子程序程序:void delay200ms(void){unsigned char i,j,k;for(i=5;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--);}三. 10ms 延时子程序程序: void delay10ms(void){unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--);}四. 1s 延时子程序程序:void delay1s(void){unsigned char h,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}void delay1s(void)//12M 晶振,延时999999.00us {unsigned char i,j,k;for(i=46;i>0;i--)for(j=152;j>0;j--)for(k=70;k>0;k--);}扩展阅读:单片机延时问题20 问。

延时程序

延时程序
RET ;双周期指令(2uS)
;50毫秒延时程序(12M晶振)
YS05S: MOV R7,#200 ;单周期指令(1uS)
D1: MOV R6,#125 ;单周期指令(1uS)
DJNZ R6,$ ;双周期指令(2uS)该指令自身执行R5次
DJNZ R7,D1 ;双周期指令(2uS)D1执行R7次
RET ;双周期指令(2uS)
;0.1秒延时程序(12M晶振)
YS01S: MOV R7,#200 ;单周期指令(1uS)
D1: MOV R6,#250 ;单周期指令(1uS)
DJNZ R7,D1 ;双周期指令(2uS)D1执行R7次
RET ;双周期指令(2uS)
;1秒延时程序(12M晶振)
YS1S: MOV R7,#100 ;单周期指令(1uS)
D1: MOV R6,#100 ;单周期指令(1uS)
D2: MOV R5,#47 ;单周期指令(1uS)
NOP
DJNZ R5,$ ;双周期指令(2uS)该指令自身执行R5次
DJNZ R6,D2 ;双周期指令(2uS)D1执行R6次
DJNZ R7,D1 ;双周期指令(2uS)D1执行R7次
DJNZ R6,D1 ;双周期指令(2uS)D1执行R6次
DJNZ R7,D1 ;双周期指令(2uS)D1执行R7次
NOP
RET ;双周期指令(2uS)
RET ;双周期指令(2uS)
;1秒延时程序(12M晶振)
YS1S: MOV R7,#08H ;单周期指令(1uS)
D1: MOV R6,#0F4H ;单周期指令(1uS)
D2: MOV R5,#0FFH ;单周期指令(1uS)

单片机延时程序

单片机延时程序

要想随心所欲地编写自己需要的延时程序,你首先必须了解延时程序每行代码的运行次数,再结合具体单片机的机器周期来计算。

比如,传统的MSC-51系列单片机(如89S51、89C2051等),如果晶体为12MHz,那么机器周期为1uS-------------------------------------------程序分析例1 50ms 延时子程序:DEL:MOV R7,#200 ①DEL1:MOV R6,#125 ②DEL2:DJNZ R6,DEL2 ③DJNZ R7,DEL1 ④RET ⑤精确延时时间为:1+(1*200)+(2*125*200)+(2*200)+2=(2*125+3)*200+3 ⑥=50603µs≈50ms由⑥整理出公式(只限上述写法)延时时间=(2*内循环+3)*外循环+3 ⑦详解:DEL这个子程序共有五条指令,现在分别就每一条指令被执行的次数和所耗时间进行分析。

第一句:MOV R7,#200 在整个子程序中只被执行一次,且为单周期指令,所以耗时1µs第二句:MOV R6,#125 从②看到④只要R7-1不为0,就会返回到这句,共执行了R7次,共耗时200µs第三句:DJNZ R6,DEL2 只要R6-1不为0,就反复执行此句(内循环R6次),又受外循环R7控制,所以共执行R6*R7次,因是双周期指令,所以耗时2*R6*R7µs。

例2 1秒延时子程序:DEL:MOV R7,#10 ①DEL1:MOV R6,#200 ②DEL2:MOV R5,#248 ③DJNZ R5,$ ④DJNZ R6,DEL2 ⑤DJNZ R7,DEL1 ⑥RET ⑦对每条指令进行计算得出精确延时时间为:1+(1*10)+(1*200*10)+(2*248*200*10)+(2*200*10)+(2*10)+2=[(2*248+3)*200+3]*10+3 ⑧=998033µs≈1s由⑧整理得:延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+3 ⑨此式适用三层循环以内的程序,也验证了例1中式⑦(第三层循环相当于1)的成立。

单片机 延时 计算

单片机 延时 计算

单片机延时计算
在单片机编程中,延时是一种常用的控制方法。

延时的基本原理是利用单片机内部的计时器来实现时间的计算。

以下是一个简单的延时计算程序的中文代码:
1. 定义延时时间
首先需要定义需要延时的时间,例如下面的代码定义了一个需要延时10毫秒的时间:
unsigned int delay_time = 10;
2. 计算延时时间
接下来需要编写延时计算的函数,在这个函数中需要使用单片机内部的计时器来实现时间的计算。

以51单片机为例,我们可以使用定时器和定时器中断来实现延时计算。

具体代码如下:
void delay(unsigned int time) // time为需要延时的时间(单位:毫秒)
{
unsigned char i, j;
while (time--)
{
i = 10;
j = 120;
do
{
while (--j);
} while (--i);
}
}
3. 调用延时函数
最后,在需要进行延时的地方调用延时函数即可,例如下面的代
码在执行delay函数后会延时10毫秒:
delay(delay_time);
以上就是一个简单的中文延时计算程序,希望能对你有所帮助。

visual basic延时语句

visual basic延时语句

visual basic延时语句Visual Basic是一种编程语言,它提供了许多实现延时的方法。

下面列举了十个不同的Visual Basic延时语句,以帮助您实现所需的延时效果。

1. 使用Thread.Sleep方法:Thread.Sleep(1000) '延时1秒2. 使用Timer控件:Dim delayTimer As New Timer()delayTimer.Interval = 1000 '设置延时时间为1秒delayTimer.Start()delayTimer.Stop()3. 使用DoEvents函数:Dim startTime As DateTime = DateTime.NowDo While DateTime.Now.Subtract(startTime).TotalMilliseconds < 1000Application.DoEvents()Loop4. 使用Stopwatch类:Dim stopwatch As New Stopwatch()stopwatch.Start()Do Until stopwatch.ElapsedMilliseconds >= 1000Application.DoEvents()Loopstopwatch.Stop()5. 使用System.Threading命名空间中的Timer类:Dim delayTimer As New System.Threading.Timer(AddressOf DelayHandler, Nothing, 1000, Timeout.Infinite)6. 使用Task.Delay方法:Await Task.Delay(1000) '延时1秒7. 使用System.Timers命名空间中的Timer类:Dim delayTimer As New System.Timers.Timer(1000) '设置延时时间为1秒delayTimer.AutoReset = FalsedelayTimer.Start()AddHandler delayTimer.Elapsed, AddressOf DelayHandler8. 使用Async/Await关键字和Task.Delay方法:Private Async Sub Delay()Await Task.Delay(1000) '延时1秒End Sub9. 使用Sleep API函数:Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer) Sleep(1000) '延时1秒10. 使用自定义的延时函数:Sub Delay(ByVal milliseconds As Integer)Dim stopwatch As New Stopwatch()stopwatch.Start()Do Until stopwatch.ElapsedMilliseconds >= millisecondsApplication.DoEvents()Loopstopwatch.Stop()End Sub以上是十个用于实现延时效果的Visual Basic语句。

单片机延时子程序

单片机延时子程序

单片机延时子程序下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是和的晶振,而在AVR单片机上常用的有和的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的频率是多大。

软件延时:(asm)晶振12MHZ,延时1秒程序如下:DELAY:MOV 72H,#100LOOP3:MOV 71H,#100LOOP1:MOV 70H,#47LOOP0:DJNZ 70H,LOOP0NOPDJNZ 71H,LOOP1MOV 70H,#46LOOP2:DJNZ 70H,LOOP2NOPDJNZ 72H,LOOP3MOV 70H,#48LOOP4:DJNZ 70H,LOOP4定时器延时:晶振12MHZ,延时1s,定时器0工作方式为方式1DELAY1:MOV R7,#0AH ;; 晶振12MHZ,延时秒AJMP DELAYDELAY2:MOV R7,#14H ;; 晶振12MHZ,延时1秒 DELAY:CLR EX0MOV TMOD,#01H ;设置定时器的工作方式为方式1MOV TL0,#0B0H ;给定时器设置计数初始值MOV TH0,#3CHSETB TR0 ;开启定时器 HERE:JBC TF0,NEXT1SJMP HERENEXT1:MOV TL0,#0B0HMOV TH0,#3CHDJNZ R7,HERECLR TR0 ;定时器要软件清零SETB EX0RETC语言延时程序:10ms延时子程序(12MHZ)void delay10ms(void){unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--); }1s延时子程序(12MHZ)void delay1s(void){unsigned char h,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--); }200ms延时子程序(12MHZ)void delay200ms(void){unsigned char i,j,k;for(i=5;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--); }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--);}下面是用了的晶振的几个延时程序(用定时0的工作模式1):(1)延时void delay_0_9ms(void){TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/ TH0=0xfd;TL0=0xa8;TR0=1; /*启动定时器*/while(TF0==0);TR0=0;}(2)延时1MSvoid delay_1ms(void){TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/TH0=0xfd;TL0=0x65;TR0=1; /*启动定时器*/while(TF0==0);TR0=0;}(3)延时void delay_4_5ms(void){TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/TH0=0xf4;TL0=0x48;TR0=1; /*启动定时器*/while(TF0==0);TR0=0;}在用定时器做延时程序时如果懒得计算定时器计数的初始值可以在网上找一个专门用来做延时的小软件。

java延时执行方法

java延时执行方法

java延时执行方法在Java中,延时执行方法是一种常见的需求,它允许我们在程序中暂停一段时间后再执行某些操作。

这种延时执行的方法在很多实际场景中都很有用,比如在游戏中设置敌人的出现时间间隔,或者在任务调度中设置定时任务的执行时间。

本文将介绍几种常用的延时执行方法。

1. 使用Thread.sleep()方法Thread.sleep()方法是Java中最常用的实现延时执行的方法之一。

它可以使当前线程暂停执行一段指定的时间。

我们可以通过在代码中调用该方法来实现延时执行的效果。

下面是使用Thread.sleep()方法实现延时执行的示例代码:```javapublic class DelayExecution {public static void main(String[] args) {try {Thread.sleep(5000); // 暂停5秒System.out.println("延时执行的代码");} catch (InterruptedException e) {e.printStackTrace();}}}```在上述代码中,我们使用Thread.sleep(5000)方法使当前线程暂停执行5秒后,再执行后面的代码。

这样就实现了延时执行的效果。

2. 使用ScheduledExecutorService接口在Java中,ScheduledExecutorService接口提供了一套可以调度任务执行的方法。

它可以实现延时执行、间隔执行、定时执行等功能。

下面是使用ScheduledExecutorService接口实现延时执行的示例代码:```javaimport java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class DelayExecution {public static void main(String[] args) {ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);executor.schedule(() -> System.out.println("延时执行的代码"), 5,TimeUnit.SECONDS);executor.shutdown();}}```在上述代码中,我们通过创建一个ScheduledExecutorService对象,并调用其schedule()方法来实现延时执行。

什么方法可以延时

什么方法可以延时

什么方法可以延时
有多种方法可以实现延时,包括:
1. 使用sleep函数:在程序中调用sleep函数,指定需要延迟的时间,程序将会暂停执行指定的时间后再继续执行。

2. 使用定时器:在一些编程语言和框架中,可以设置定时器来延时执行某个函数或代码块。

3. 使用循环等待:可以通过在一个循环中检查时间或计数器,当达到设定的延时时间时,跳出循环继续执行后续代码。

4. 使用线程或异步编程:可以创建一个新线程或使用异步编程技术,让程序在后台执行一段时间后再继续执行主线程的代码,从而实现延时效果。

5. 使用定时器类或库函数:一些编程语言和框架提供了定时器类或库函数,可以方便地设置延时时间和回调函数,实现延时效果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Keil C51程序设计中几种精确延时方法2009年07月28日星期二下午11:15延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。

1 使用定时器/计数器实现精确延时单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。

第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。

本程序中假设使用频率为12 MHz的晶振。

最长的延时时间可达216=65 536 μs。

若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。

使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。

但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。

这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。

2 软件延时与时间计算在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。

下面介绍几种软件延时的方法。

2.1 短暂延时可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C 文件中,需要时在主程序中直接调用。

如延时10 μs的延时函数可编写如下:void Delay10us( ) {_NOP_( );_NOP_( );_NOP_( );_NOP_( );_NOP_( );_NOP_( );}Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。

主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。

可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用\[4\],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。

这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。

依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。

简言之,只有最内层的函数执行RET指令。

该指令直接返回到上级函数或主函数。

如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 μs。

通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。

2.2 在C51中嵌套汇编程序段实现延时在C51中通过预处理指令#pragma asm和#pragma endasm可以嵌套汇编语言语句。

用户编写的汇编语言紧跟在#pragma asm之后,在#pragma endasm 之前结束。

如:#pragma asm…汇编语言程序段…#pragma endasm延时函数可设置入口参数,可将参数定义为unsigned char、int或long型。

根据参数与返回值的传递规则,这时参数和函数返回值位于R7、R7R6、R7R6R5中。

在应用时应注意以下几点:◆#pragma asm、#pragma endasm不允许嵌套使用;◆在程序的开头应加上预处理指令#pragma asm,在该指令之前只能有注释或其他预处理指令;◆当使用asm语句时,编译系统并不输出目标模块,而只输出汇编源文件;◆asm只能用小写字母,如果把asm写成大写,编译系统就把它作为普通变量;◆#pragma asm、#pragma endasm和asm只能在函数内使用。

将汇编语言与C51结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳选择。

2.3 使用示波器确定延时时间利用示波器来测定延时程序执行时间。

方法如下:编写一个实现延时的函数,在该函数的开始置某个I/O口线如P1.0为高电平,在函数的最后清P1.0为低电平。

在主程序中循环调用该延时函数,通过示波器测量P1.0引脚上的高电平时间即可确定延时函数的执行时间。

方法如下:sbit T_point = P1^0;void Dly1ms(void) {unsigned int i,j;while (1) {T_point = 1;for(i=0;i<2;i++){for(j=0;j<124;j++){;}}T_point = 0;for(i=0;i<1;i++){for(j=0;j<124;j++){;}}}}void main (void) {Dly1ms();}把P1.0接入示波器,运行上面的程序,可以看到P1.0输出的波形为周期是3 ms的方波。

其中,高电平为2 ms,低电平为1 ms,即for循环结构“for(j=0;j<124;j++) {;}”的执行时间为1 ms。

通过改变循环次数,可得到不同时间的延时。

当然,也可以不用for循环而用别的语句实现延时。

这里讨论的只是确定延时的方法。

2.4 使用反汇编工具计算延时时间用Keil C51中的反汇编工具计算延时时间,在反汇编窗口中可用源程序和汇编程序的混合代码或汇编代码显示目标应用程序。

为了说明这种方法,还使用“for (i=0;i<DlyT;i++) {;}”。

在程序中加入这一循环结构,首先选择build taget,然后单击start/stop debug session按钮进入程序调试窗口,最后打开Disassembly window,找出与这部分循环结构相对应的汇编代码,具体如下:C:0x000FE4CLRA//1TC:0x0010FEMOVR6,A//1TC:0x0011EEMOVA,R6//1TC:0x0012C3CLRC//1TC:0x00139FSUBBA,DlyT //1TC:0x00145003JNCC:0019//2TC:0x00160E INCR6//1TC:0x001780F8SJMPC:0011//2T可以看出,0x000F~0x0017一共8条语句,分析语句可以发现并不是每条语句都执行DlyT次。

核心循环只有0x0011~0x0017共6条语句,总共8个机器周期,第1次循环先执行“CLR A”和“MOV R6,A”两条语句,需要2个机器周期,每循环1次需要8个机器周期,但最后1次循环需要5个机器周期。

DlyT次核心循环语句消耗(2+DlyT×8+5)个机器周期,当系统采用12 MHz时,精度为7 μs。

当采用while (DlyT--)循环体时,DlyT的值存放在R7中。

相对应的汇编代码如下:C:0x000FAE07MOVR6, R7//1TC:0x00111F DECR7//1TC:0x0012EE MOVA,R6//1TC:0x001370FAJNZC:000F//2T循环语句执行的时间为(DlyT+1)×5个机器周期,即这种循环结构的延时精度为5 μs。

通过实验发现,如将while (DlyT--)改为while (--DlyT),经过反汇编后得到如下代码:C:0x0014DFFE DJNZR7,C:0014//2T可以看出,这时代码只有1句,共占用2个机器周期,精度达到2 μs,循环体耗时DlyT×2个机器周期;但这时应该注意,DlyT初始值不能为0。

注意:计算时间时还应加上函数调用和函数返回各2个机器周期时间。

应用单片机的时候,经常会碰到需要短时间延时的情况。

需要的延时时间很短,一般都是几十到几百微妙(us)。

有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十几us以内,不然很轻易出错。

这种情况下,用计时器往往有点小题大做。

而在极端的情况下,计时器甚至已经全部派上了别的用途。

这时就需要我们另想别的办法了。

以前用汇编语言写单片机程序的时候,这个问题还是相对轻易解决的。

比如用的是12MHz晶振的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 char i){for(; i != 0; i--);}到底这段代码能达到多高的精度呢?为了直接衡量这段代码的效果,我把Keil C 根据这段代码产生的汇编代码找了出来:; FUNCTION _delay2 (BEGIN); SOURCE LINE # 18;---- V ariable 'i' assigned to Register 'R7' ----; SOURCE LINE # 19; SOURCE LINE # 200000 ?C0007:0000 EF MOV A,R70001 6003 JZ ?C00100003 1F DEC R70004 80FA SJMP ?C0007; SOURCE LINE # 210006 ?C0010:0006 22 RET; FUNCTION _delay2 (END)真是不看不知道~~~一看才知道这个延时程序是多么的不准点~~~光看主要的那四条语句,就需要6个机器周期。

相关文档
最新文档