c语言delay的用法

合集下载

delay延时教程

delay延时教程
delay延时教程(用的是12MHz晶振的MCS-51)
一、
1)NOP指令为单周期指令
2)DJNZ指令为双周期指令
3)mov指令为单周期指令
4)子程序调用(即LCALL指令)为双周期指令
5)ret为双周期指令
states是指令周期数,
sec是时间,=指令周期×states,设置好晶振频率就是准确的了
void Delay10us( ) {
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}
延迟时间=6*1us+2us+2us=10us
b:delaytime为us级
我们用汇编语言写单片机延时10ms的程序,可以编写下面的程序来实现:
unsigned char i,j
5.在do…while,while语句中,循环体内变量也采用减减方法。
三、编辑注意:
1、在C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。
2、在延时子程序设计时,采用do…while,结构做循环体要比for结构做循环体好。
3、在延时子程序设计时,要进行循环体嵌套时,采用先内循环,再减减比先减减,再内循环要好。
for(R6=202;R6>0;R6--)
for(R5=81;R5>0;R5--);
}
产生的汇编:
C:0x0800 7F0F MOV R7,#0x0F
C:0x0802 7ECA MOV R6,#0xCA
C:0x0804 7D51 MOV R5,#0x51
C:0x0806 DDFE DJNZ R5,C:0806最内层

51单片机delay()延时的用途和用法讲解

51单片机delay()延时的用途和用法讲解

{ unsigned int i; for(i=0;i<uiDelayShort;i++) { ; //一个分号相当于执行一条空语句 }
}
/* 注释八: * delay_long(unsigned int uiDelayLong)是大延时函数, * 专门用在上电初始化的大延时, * 此函数的特点是能实现比较长时间的延时,细分度取决于内嵌 for 循环的次数, * uiDelayLong 的数值的大小就代表里面执行了多少次 500 条空指令的时间。 * 数值越大,延时越长。时间精度不要刻意去计算,感觉差不多就行。 */ void delay_long(unsigned int uiDelayLong) {
unsigned int i; unsigned int j; for(i=0;i<uiDelayLong;i++) {
for(j=0;j<500;j++) //内嵌循环的空指令数量 { ; //一个分号相当于执行一条空语句 }
}பைடு நூலகம்}
void initial_myself() //初始化单片机 {
led_dr=0; //LED 灭 } void initial_peripheral() //初始化外围 {
delay()延时的用途讲解
(1)硬件平台:基于朱兆祺 51 单片机学习板。
(2)实现功能:让一个 LED 闪烁。
(3)源代码讲解如下:
#include "REG52.H"
void initial_myself(); void initial_peripheral();
void delay_short(unsigned int uiDelayshort); void delay_long(unsigned int uiDelaylong); void led_flicker();

C语言中的延时与计时技巧

C语言中的延时与计时技巧

C语言中的延时与计时技巧
一、延时技巧
1.延时的定义:控制程序中当前语句的后一语句,延缓一段时间再执行。

2.C常用的两个延时函数:
(1) delay函数。

书写格式:delay(数值)。

其中,括号中的整型数值取值范围0 ~ 32767之间。

注意:这个数值与计算机主机的频率有关,因此在不同的计算机上,同样的延时数值,会得到不同的延时效果。

(2) sleep (数值)。

(睡眠函数)
书写格式:sleep (数值)。

其中数值是以秒为单位,用在动态显示中最少一秒变化一次,那会有明显的停顿感觉。

二、计时技巧
1.计时的定义:计算程序中某段程序的运行时间。

2.计时程序使用条件:
(1)使用头部文件:
#include <time.h>
(2)使用当前时间的时钟函数:
clock()
(3)使用时间一秒常数:
CLK_TCK
例如:
A.在“蛇吃蛋”的程序中,要引入计时程序,则:在进入while(1)循环前,先要取得计时开始时的那一时刻,使用变量t0表示。

即:
t0 = clock();
B.在while(1)循环的最后处,再取当前时刻,使用变量t1表示。

即:
t1=clock();
C.t1 和t0 之差即为所经历的时间,即;
t = (t1-t0 );
D.转换成秒:
sec=t/CLK_TCK;。

c语言中delay的用法

c语言中delay的用法

c 语言中 delay 的用法C 语言作为一门新型高级编程语言 ,在计算机软件编程中具有较为广泛的应用和实现。

下面小编就跟你们详细介绍下 c 语言中 delay 的用法,希望对你们有用。

c 语言中 delay 的用法如下:假设一个延时函数如下:void delay(){uint i;for(i=0;i<20000;i++);}我们怎么来算呢,先将 20000 转成 16 进制,得到 4E20,然后将高字节 4E 乘以 6 得到 468D,再将 468+2=470,然后将 470D*20HEX (即 32D)=15040;所心这个延时函数总共要执行 15040 个周期,假设所用的晶振为 12MHZ,则该段函数总延时:15.04ms。

有了这个公式我们如果想要设定指定的延时长度就可以用它的己知公式确定。

即:总时间=[(6*i 值的高 8 位)+2]*i 的低 8 位。

例如:设要延时 125ms。

我们将低字节先赋值200D*(即:C8),然后再算高低节的定值,由式中可知 125ms=200*((i 值的高字节*6)+2),又可推算出(高低节*6)+2 的总延迟时间应等于625us,将625/6=104.1666,取整数得到 104,将 104 转成 16 进制得到 68H,再将高字节和低字节组合起来即得到了定值,即:68C8HEX,代入函数即如下:void delay(){uint i;for(i=0;i<0x68C8;i++);}如果写直进行就要将 68C8 转成 10 进制,即:26824,代入后得到:void delay(){uint i;for(i=0;i<0x26824;i++);在 c 语言中嵌入一段汇编的延时程序呀,你自己看看书,很简单的用在单片机里的可以 C 和汇编混合使用,因为用汇编编写延时要准确些,所以你不妨写一个汇编程序,然后再调用它好了,要用C来编精确的延时确实是比较难的哦.呵呵谁说 C 语言不能精确延时,用 51 单片机的定时/计数器一或者用定时/计数器 2 的工作方式 2,自动再装入 8 位计数器,就可以精确延时,别说 1MS 了就是 100um 也能精确做到。

delay的用法

delay的用法

delay的用法
一、delay的作用
delay的作用是给函数指定一个暂停的时间,用来让代码顺序执行。

delay函数能够帮助开发者控制函数的行为,从而使开发者能够为代码实
现更可控的动作。

delay函数正是用来给开发者精确调节函数执行时间的
关键,它可以让代码在指定的时间间隔后再执行。

二、delay的实现
1、让函数在指定的时间之后再执行:比如,用来延时执行一个指定
的任务,或者让一个函数在指定时间后才开始正式执行,而不是立即执行。

2、让函数在指定的时间间隔内执行:例如,一个函数在每隔5秒执
行一次,可以使用setTimeout,在指定的5秒时间间隔内不断执行该函数。

3、用来提高程序性能:delay函数可以帮助用户控制函数的执行时间,以避免不必要的性能消耗。

1、delay工作原理:delay函数在一段指定的时间后执行一个指定的
任务。

delay函数类似于setTimeout,setTimeout指定时间为零,delay
指定时间为非零,setTimeout会在第一个参数指定的毫秒数之后调用指
定的函数,而delay会在指定的时间后调用指定的函数。

2、delay的使用:delay函数可以让开发者更精确。

c语言延时语句

c语言延时语句

C语言程序延时Keil C51的编程语言常用的有2种:一种是汇编语言;另一种是C 语言。

用汇编语言写单片机程序时,精确时间延时是相对容易解决的。

比如,用的是晶振频率为12 MHz的AT 89C51,打算延时20 μs,51单片机的指令周期是晶振频率的1/12,即一个机器周期为1 μs;“MOV R0,#X”需要2个机器周期,DJNZ也需要2个机器周期,单循环延时时间t=2X+3(X为装入寄存器R0的时间常数)[2]。

这样,存入R0里的数初始化为8即可,其精度可以达到1 μs。

用这种方法,可以非常方便地实现512 μs以下时间的延时。

如果需要更长时间,可以使用两层或更多层的嵌套,当然其精度误差会随着嵌套层的增加而成倍增加。

C程序中可使用不同类型的变量来进行延时设计。

经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。

有人说如果while里面不能放其它语句,否则也不行,用do-while就可以,具体怎样我没有去试.所有这些都没有给出具体的实例程序来.还看到一些延时的例子多多少少总有点延时差.为此我用for循环写了几个延时的子程序贴上来,希望能对初学者有所帮助.(晶振12MHz,一个机器周期1us.)一. 500ms延时子程序程序: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--); }。

通用C语言延时

通用C语言延时

通用C语言延时在嵌入式C编程中,免不了要用到软件延时。

这一般通过循环语句实现。

通过控制循环语句的循环次数,便可获得多种不同的延时时间。

为了便于使用和提高程序代码的复用率,一般又将循环语句封装成一个带参数的函数,称为延时函数。

如:void wait(unsigned int n){unsigned int i;for(i=0;i<n;i++);}延时函数的参数(形参,如上例中的变量 n ),即为控制循环语句循环次数的变量。

这样,在需要软件延时的时候,只需要调用延时函数,并将实际参数(实参,即n的实际值)代入形参,便可获得与该实际参数对应的延时时间。

这便是经典的软件延时的实现方法,非常简单。

但细心的读者会发现:延时函数的参数(比如上面的 n ),表征的是循环语句的“循环次数”,而不是“实际的延时时间”。

一般来说,假令循环语句每循环一次的时间为 b(注意,单位是“步”,即一个时钟周期,下同),函数调用、传值和返回所需的固有时间为 a ,那么,给定参数 n 时,调用一次延时函数实际实现的延时时间应为 t = a + b*n , ——而不是 n !这就意味着,当需要的延时时间为 t 时,应当传入的实参为 n = (t-a)/b,而不是 t 。

这样,为了获得比较准确的延时,每次调用函数之前,都要手工计算实际参数,很不方便;其次,当需要改变晶振频率的时候,程序中所有的延时参数都要重新计算,这显然不利于程序的移植。

为了解决这两个问题,提高程序的可移植性,可以利用宏定义的方式,对延时函数进行参数预修正。

例如,对上面给出的wait延时函数,可以使用下面的宏定义:#define delay(n) wait( ( (n) - a ) / b )这样,调用 delay(t) 就意味着调用 wait( (t-a)/b ) ,从而得到时间为t的延时,实现了参数与延时时间的同步,使用起来更加方便。

为了进一步提高可移植性,使软件延时能够适应不同的晶振频率,应当顺着上面的思路选择寻找更优方案。

c语言精确delay函数

c语言精确delay函数

c语言精确delay函数C语言中的精确延时函数是指能够以指定的时间精确延迟程序执行的函数。

在实际开发中,我们经常会遇到需要程序暂停一段时间的情况,这时就需要使用延时函数来实现。

在C语言中,常用的延时函数有两种,一种是使用循环来实现延时,另一种是使用系统提供的延时函数。

下面将详细介绍这两种方法的实现原理及其使用场景。

1. 循环延时法循环延时法是通过循环来实现延时的方法,其原理是让程序在一个循环中空转一段时间,从而达到延时的效果。

具体实现代码如下:```cvoid delay(unsigned int ms){unsigned int i, j;for(i = 0; i < ms; i++)for(j = 0; j < 10000; j++);}```上述代码中,delay函数接收一个参数ms,表示要延时的毫秒数。

函数内部使用两个嵌套的循环,外层循环控制延时的次数,内层循环则是一个空转的过程,通过调整内层循环的次数来控制延时的时间。

循环延时法的优点是简单易懂,适用于较简单的延时场景。

但是由于循环的执行时间受到处理器的影响,不同的处理器执行相同的循环时间可能会有差异,因此不能保证延时的精确性。

2. 系统延时函数系统延时函数是通过调用系统提供的函数来实现延时的方法,其原理是让程序暂停一段时间,从而达到延时的效果。

具体实现代码如下:```c#include <unistd.h>void delay(unsigned int ms){usleep(ms * 1000);}```上述代码中,delay函数接收一个参数ms,表示要延时的毫秒数。

函数内部使用usleep函数来实现延时,usleep函数的参数是微秒,所以需要将毫秒转换为微秒。

系统延时函数的优点是精确可靠,适用于对延时精度要求较高的场景。

由于系统延时函数是由操作系统提供的,可以保证延时的精确性,不受处理器的影响。

C语言中的精确延时函数有循环延时法和系统延时函数两种方法,根据实际需求选择合适的方法来实现延时。

延时函数——精选推荐

延时函数——精选推荐

延时函数延时函数1、void delay(void) //两个void意思分别为⽆需返回值,没有参数传递{unsigned int i; //定义⽆符号整数,最⼤取值范围65535for(i=0;i<20000;i++) //做20000次空循环; //什么也不做,等待⼀个机器周期}2、void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}3、void int_delay(void) //延时⼀段较长的时间{unsigned int m; //定义⽆符号整形变量,双字节数据,值域为0~65535for(m=0;m<36000;m++); //空操作}4、void char_delay(void) //延时⼀段较短的时间{unsigned char i,j; //定义⽆符号字符型变量,单字节数据,值域0~255for(i=0;i<200;i++)for(j=0;j<180;j++); //空操作}//*for(a=2;a>0;a--) // 2微秒,执⾏2次(a+2)是4微秒;for(b=142;b>0;b--) // 2微秒,执⾏142次,for(a=2;a>0;a--)是4微秒,即2*(142*4);for(c=1;c>0;c--) // 2微秒, 执⾏1次,即2*(142*4)=1136微秒;b=125,1000/8=125,再减去其它调⽤时间,应该b取值不⼤于125。

追问:这些时间是怎么得出来的?追答:51单⽚机执⾏⼀条指令⼀般是1---3微秒(12MHz),执⾏⼀条减⼀-判断-跳转指令,就是2微秒,这是c语⾔翻译为机器语⾔后的指令,cjne或djnz(汇编语⾔),编译器⽤什么指令和⽅法,需要你⾃⼰试验,我说的只是⼀种。

*//。

c语言延时程序的计算方法经典

c语言延时程序的计算方法经典
DJNZ 72H,LOOP3
MOV 70H,#48
LOOP4:DJNZ 70H,LOOP4
定时器延时:
晶振12MHZ,延时1s,定时器0工作方式为方式1
DELAY1:MOV R7,#0AH ;;晶振12MHZ,延时0.5秒
AJMP DELAY
DELAY2:MOV R7,#14H ;;晶振12MHZ,延时1秒
TL0=0xa8;
TR0=1; /*启动定时器*/
while(TF0==0);
TR0=0;
}
(2)延时1MS
void delay_1ms(void)
{
TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/
TH0=0xfd;
TL0=0x65;
TR0=1; /*启动定时器*/
while(TF0==0);
TR0=0;
}
(3)延时4.5ms
void delay_4_5ms(void)
{
TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/
TH0=0xf4;
TL0=0x48;
TR0=1; /*启动定时器*/
while(TF0==0);
TR0=0;
}
}
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)

c语言delay的用法

c语言delay的用法

c语言delay的用法延时函数在C语言中被广泛使用,它可以让程序在执行特定代码之后暂停一段时间。

这在很多应用中非常有用,例如需要控制执行频率的任务、需要定时操作的任务以及模拟实时环境等。

本文将详细介绍C语言中延时函数的用法,并逐步回答相关问题。

首先,我们需要清楚延时函数是如何工作的。

当程序调用一个延时函数时,它会在指定的延时时间内执行空循环,这样就能达到暂停程序执行的效果。

延时的时间单位通常是毫秒(ms)。

那么如何实现延时函数呢?C语言本身并没有提供延时函数,但我们可以利用操作系统提供的API函数来实现。

接下来,我将介绍一种基于Linux系统的延时函数的实现方式。

首先,我们需要包含头文件<unistd.h>,该头文件中包含了延时函数所需要的API函数。

c#include <unistd.h>接下来,我们可以定义一个延时函数,例如名为delay的函数。

该函数接受一个整数参数time,表示延时的毫秒数。

cvoid delay(int time) {usleep(time * 1000);}在delay函数中,我们使用了usleep函数来实现延时。

usleep函数需要接受微秒级别的延时时间,所以我们将毫秒转换为微秒,然后传递给usleep函数。

现在,我们可以在需要延时的位置调用delay函数来实现延时了。

例如,如果我们想延时1秒,我们可以调用delay(1000)。

cdelay(1000);那么延时函数有什么注意事项呢?延时函数会暂停程序的执行,这意味着在延时期间,程序无法响应其他事件。

所以在使用延时函数时,需要考虑延时的时间长度,避免造成程序的阻塞。

此外,程序中如果需要同时进行多个任务,可以考虑使用多线程编程来实现,并根据需要为每个线程设置不同的延时时间。

这样可以避免延时函数的使用对整个程序的影响。

延时函数在C语言中是一种非常实用的工具,它可以帮助我们实现各种需要时间控制的任务。

用单片机C语言精确延时(定时)的方法

用单片机C语言精确延时(定时)的方法

用单片机C语言精确延时(定时)的方法用单片机C语言精确延时(定时)的方法C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

那么用单片机C语言精确延时(定时)的方法都是怎样的呢?以下仅供参考!由于单片机C语言下利用软件延时不容易做到精确的定时,所以很多人在编写延时子程序的时候不能好好的把握延时的具体时间。

C 语言下,延时程序主要有以下几种:一:void delay(unsigned char k){unsigned char i,k; //定义变量for(i=0;i<k;i++); //for循环语句}该程序在Keil环境下,会先将C语言转化成汇编语言,那么我们就可以根据汇编语言来计算出精确的`时间,转化具体步骤如下:CLR A ;指令1MOV R7,A ;指令2LOOP:INC R7 ;指令3CJNE R7,k,LOOP ;指令4这里,指令1,指令2和指令3各消耗1个机器周期,指令4消耗两个机器周期(可查文末附录表),而在12M的晶振下一个机器周期是1us,在这个过程中,指令1和指令2分别执行1次,即消耗1+1us,而指令3和指令4分别执行了k次,那么这样加起来,这个延时子程序所消耗的具体时间就是t=1+1+(1+2)*k=3k+2us。

呵呵,这样说来,如果我们定义的k为100的话,这个延时子程序的精确时间就是302us。

二:void delay(unsigned char i){while(--i){;}}同样的道理,将其反汇编,可以看到,只有一条语句:DJNZ i,$;该语句消耗2us,一共执行i次,所以总共消耗时间t=i*2us。

三:下面的将形参换为整形int,这样的话,反汇编所执行的语句完全不同,用个具体的数字做例子:void delay(){unsigned int i=10000;while(--i);}反汇编后:4: unsigned int i=10000;C:0x0003 7F10 MOV R7,#0x10C:0x0005 7E27 MOV R6,#0x275: while(--i)6: ;C:0x0007 EF MOV A,R7C:0x0008 1F DEC R7C:0x0009 7001 JNZ C:000CC:0x000B 1E DEC R6C:0x000C 14 DEC AC:0x000D 4E ORL A,R6C:0x000E 70F7 JNZ C:0007具体计算如下1.R7经过10H(16)次循环减为0:t1=10H*(1+1+2+1+1+2)2.R6经过27H*256次循环减为0:t2=27H*256*(1+1+2+1+1+2)+27H*13.最后R7的是变为255,因此还要多出255次的循环:t3=255*(1+1+2+1+1+2)4.加上之前消耗的2us,总消耗时间:T=2+10H*(1+1+2+1+1+2)+27H*256*(1+1+2+1+1+2)+27H*1+255*(1+1+2+1+1+2)=2+16*7+39*256*7+39*1+255*7=71826us大约为72ms吧如果定义一个unsigned int i,那么延时计算公式为T=2+(i%256)*7+(i/256)*256*7+i/256+255*7关于其他类型的延时程序都可以按照这个方法对时间进行较为精确的计算。

c语言delay的用法

c语言delay的用法

c语言delay的用法在单片机应用中,经常会遇到需要短时间延时的情况,一般都是几十到几百&mu;s,并且需要很高的精度(比如用单片机驱动DS18B20时,误差容许的范围在十几&mu;s以内,不然很容易出错);而某些情况下延时时间较长,用计时器往往有点小题大做。

另外在特殊情况下,计时器甚至已经全部用于其他方面的定时处理,此时就只能使用软件定时了。

下面就和大家分享下c语言delay的用法1 C语言程序延时Keil C51的编程语言常用的有2种:一种是汇编语言;另一种是C 语言。

用汇编语言写单片机程序时,精确时间延时是相对容易解决的。

比如,用的是晶振频率为12 MHz的AT89C51,打算延时20 &mu;s,51单片机的指令周期是晶振频率的1/12,即一个机器周期为1 &mu;s;“MOV R0,#X”需要2个机器周期,DJNZ也需要2个机器周期,单循环延时时间t=2X+3(X为装入寄存器R0的时间常数)[2]。

这样,存入R0里的数初始化为8即可,其精度可以达到1 &mu;s。

用这种方法,可以非常方便地实现512 &mu;s以下时间的延时。

如果需要更长时间,可以使用两层或更多层的嵌套,当然其精度误差会随着嵌套层的增加而成倍增加。

虽然汇编语言的机器代码生成效率很高,但可读性却并不强,复杂一点的程序就更难读懂;而C语言在大多数情况下,其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,且C 语言还可以嵌入汇编程序来解决高时效性的代码编写问题。

就开发周期而言,中大型软件的编写使用C 语言的开发周期通常要比汇编语言短很多,因此研究C语言程序的精确延时性能具有重要的意义。

C程序中可使用不同类型的变量来进行延时设计。

经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。

c语言延时函数delay用法

c语言延时函数delay用法

c语言延时函数delay用法
delay函数是c语言中的延时函数,是在程序的特定时机给程序设定一段固定的延时从而使程序实现暂停,从而达到控制程序逻辑运行的目的。

一、delay函数的用法:
1、函数说明:delay函数的原型为:void delay(unsigned int ms),其中ms表示毫秒。

2、函数功能:该函数用于按设定的毫秒数作出延时;函数执行时程序停止运行,所以用这个函数时需要将它放在需要延时的程序中;
3、函数用法:delay函数一般用于遥控程序,让程序具备一定的定时功能和延时功能。

4、函数使用示例:
delay(1000); //程序暂停1s
二、delay函数注意事项:
1、delay函数只能精确到毫秒,误差范围为 ±20ms,所以不适用于对时间要求较为严格的情况;
2、为了更加精确,可以使用带循环的delay函数,例如for循环嵌套delay函数;
3、一般使用delay函数时,一定要注意,要给函数设定一个合理的参数;
4、delay函数运行时会阻塞程序,如果延时时间比较长,可能会造成程序出现不可知的错误;
5、使用delay函数时,可以使用轮询的方式,使之在节省时间的同时也能实现延时的目的;
6、如果程序要求暂停较短时间,可以使用void pause()函数来暂停程序运行而不是利用delay函数;
7、delay函数一般只能用于短期延时,如果需要长期延时,则可以使用其他系统函数,如Sleep()或Suspend()系统函数代替;
8、关于delay函数的使用,要根据具体情况选择合适的参数,如ms应该在100~1000范围内,以达到精确控制程序的运动时间。

C语言delay的用法

C语言delay的用法

C语言delay的用法延迟操作在编程中是非常常见的需求,通过控制程序的执行速度,我们可以实现各种各样的功能。

在C语言中,使用delay函数可以实现延迟操作,本文将介绍C语言中delay函数的用法,以及一些注意事项。

一、什么是delay函数在C语言中,delay函数通常用于使程序休眠一段时间。

它可以让程序停止执行指定的时间长度,然后再继续向下执行。

当需要暂停程序一段时间以等待外部设备响应或者执行时间敏感的任务时,delay函数非常有用。

二、使用头文件要使用delay函数,首先需要包含合适的头文件。

在标准库stdio.h之外,在C 语言中,并没有提供一个专门用于延时操作的标准库头文件。

不过,在很多编译器中(如gcc),可以通过包含特定的头文件来获得延迟功能。

#include <unistd.h> //包含这个头文件以使用usleep函数#include <Windows.h> //包含这个头文件以使用Sleep函数根据所选编译器和操作系统不同,可能需要包含不同的头文件。

要确保选择适当的头文件,并与所选平台兼容。

三、使用usleep进行微秒级别延迟在Linux和Unix系统上,我们可以使用usleep函数来实现微秒级别的延迟。

usleep函数接受一个参数,该参数表示程序休眠的时间长度,以微秒为单位。

下面是一个利用usleep函数实现延迟功能的示例代码:#include <stdio.h>#include <unistd.h>int main() {printf("Delaying for 1 second...\n");usleep(1000000); //延时1秒printf("Delay complete.\n");return 0;}在上面的例子中,我们使用usleep函数延迟了1秒钟。

注意,在使用usleep函数之前需要包含对应的头文件。

c语言中delay的用法

c语言中delay的用法

c语言中delay的用法概述:延迟是计算机程序中常用的一种操作,可以实现程序暂停一段时间再继续执行。

在C语言中,延迟操作通常使用delay函数来完成。

本文将介绍C语言中delay函数的用法,并讨论几种常见的延迟实现方法。

一、delay函数的基本用法delay函数是位于“dos.h”头文件中的一个标准库函数。

它需要一个整数作为参数,表示需要延迟的毫秒数。

下面是delay函数的基本用法示例:#include <stdio.h>#include <dos.h>int main() {printf("Delay 1 second\n");delay(1000); // 延迟1000毫秒,即1秒钟printf("Delay complete\n");return 0;}二、不同系统上delay函数的实现delay函数是依赖于操作系统提供的定时器服务来实现的。

因此,在不同的操作系统上,其具体实现可能会有所不同。

在Windows环境下,通常使用timeBeginPeriod和timeEndPeriod来设置定时器分辨率,并通过Sleep函数来进行延迟操作。

以下是一个Windows平台上实现延迟功能的示例代码:#include <windows.h>#include <stdio.h>int main() {printf("Delay 1 second\n");Sleep(1000); // 延迟1000毫秒,即1秒钟printf("Delay complete\n");return 0;}在Linux环境下,可以使用usleep函数来实现延迟操作。

以下是一个Linux平台上实现延迟功能的示例代码:#include <unistd.h>#include <stdio.h>int main() {printf("Delay 1 second\n");usleep(1000000); // 延迟1000000微秒,即1秒钟printf("Delay complete\n");return 0;}三、其他延迟实现方法除了使用delay函数之外,还有一些其他常见的延迟实现方法。

delay函数的用法

delay函数的用法

delay函数的用法delay函数是一种在编程中经常使用的函数,它的主要作用是使程序在执行到该函数时暂停一段时间。

这个函数一般用于需要在一段时间后进行一些操作的场景,例如在游戏中等待一段时间后执行下一步操作,或者在模拟实验中等待一段时间后采集数据。

在不同的编程语言中,delay函数的使用可能会有所不同,下面就以几种常用的编程语言为例,分别介绍delay函数的用法。

1.C语言在C语言中,可以使用标准库函数`sleep`来实现延时功能。

`sleep`函数的参数是要延时的秒数,它会使程序暂停执行指定的秒数后再继续执行。

```c#include <stdio.h>#include <unistd.h>int maiprintf("程序开始执行\n");sleep(2); // 延时2秒printf("程序继续执行\n");return 0;```上面的代码中,`sleep(2)`使程序暂停执行2秒钟,然后再继续执行后面的代码。

2. Python```pythonprint("程序开始执行")print("程序继续执行")```3. Java在Java中,可以使用`Thread`类提供的`sleep`方法来实现延时功能。

`sleep`方法的参数是要延时的毫秒数,它会使当前线程暂停执行指定的毫秒数后再继续执行。

```javapublic class DelayExamplepublic static void main(String[] args) throws InterruptedExceptionSystem.out.println("程序开始执行");Thread.sleep(2000); // 延时2秒System.out.println("程序继续执行");}```上面的代码中,`Thread.sleep(2000)`使当前线程暂停执行2秒钟,然后再继续执行后面的代码。

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

c语言delay的用法
在单片机应用中,经常会遇到需要短时间延时的情况,一般都是几十到几百μs,并且需要很高的精度(比如用单片机驱动DS18B20时,误差容许的范围在十几μs以内,不然很容易出错);而某些情况下延时时间较长,用计时器往往有点小题大做。

另外在特殊情况下,计时器甚至已经全部用于其他方面的定时处理,此时就只能使用软件定时了。

下面小编就和大家分享下c语言delay的用法
1 C语言程序延时
Keil C51的编程语言常用的有2种:一种是汇编语言;另一种是C 语言。

用汇编语言写单片机程序时,精确时间延时是相对容易解决的。

比如,用的是晶振频率为12 MHz的AT89C51,打算延时20 μs,51单片机的指令周期是晶振频率的1/12,即一个机器周期为1 μs;“MOV R0,#X”需要2个机器周期,DJNZ也需要2个机器周期,单循环延时时间t=2X+3(X为装入寄存器R0的时间常数)[2]。

这样,存入R0里的数初始化为8即可,其精度可以达到1 μs。

用这种方法,可以非常方便地实现512 μs以下时间的延时。

如果需要更长时间,可以使用两层或更多层的嵌套,当然其精度误差会随着嵌套层的增加而成倍增加。

虽然汇编语言的机器代码生成效率很高,但可读性却并不强,复杂一点的程序就更难读懂;而C语言在大多数情况下,其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,且C 语言还可以嵌入汇编程序来解决高时效性的代码编写问题。

就开发周期而言,中大型软件的编写使用C 语言的开发周期通常要比汇编语言短很多,因此研究C语言程序的精确延时性能具有重要的意义。

C程序中可使用不同类型的变量来进行延时设计。

经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。

2 单层循环延时精度分析
下面是进行μs级延时的while程序代码。

延时函数:
void delay1(unsigned char i) {
while(i );}
主函数:
void main() {
while(1) {
delay1(i);
}
}
使用Keil C51的反汇编功能,延时函数的汇编代码如下:
C:0x00E6AE07MOVR6,0x07
C:0x00E81FDECR7
C:0x00E9EEMOVA,R6
C:0x00EA70FAJNZC:00E6
C:0x00EC22RET
图1 断点设置位置图
通过对i赋值为10,在主程序中图1所示的位置设置断点。

经过测试,第1次执行到断点处的时间为457 μs,再次执行到该处的时间为531 μs,第3次执行到断点处的时间为605 μs,10次while循环的时间为74 μs,整个测试结果如图2所示。

图2 使用i--方式测试仿真结果图
通过对汇编代码分析,时间延迟t=7X+4(其中X为i的取值)。

测试表明,for循环方式虽然生成的代码与用while语句不大一样,但是这两种方法的效率几乎相同。

C语言中的自减方式有两种,前面都使用的是i--的方式,能不能使用--i方式来获得不同的效果呢?将前面的主函数保持不变,delay1函数修改为下面的方式:
void delay1(unsigned char i) {
while(--i);}
同样进行反汇编,得到如下结果:
C:0x00E3DFFEDJNZR7,
C:00E3C:0x00E522RET
比较发现,--i的汇编代码效率明显高于i--方式。

由于只有1条语句DJNZ,执行只需要2个时钟周期, 1个时钟周期按1 μs计算,其延时精度为2 μs;另外,RET需要2个时钟周期,能够达到汇编语言代码的效率。

按前面的测试条件进行测试,第1次执行到断点处的时间为437 μs,再次执行到该处的时间为465 μs,第3次执行到断点处的时间为493 μs,10次while循环的时间为28 μs,整个测试结果如图3所示。

图3 使用--i方式测试仿真结果图
调整i的取值,i取8时延时时间为24 μs,i取9时延时时间为26 μs。

通过分析得出,10次循环为28 μs是由于外层循环造成的,其精度可以达到2 μs。

在设计时应该考虑参数传递和RET语句执行所需要的时间周期。

实验分析发现,for语句使用--i方式,同样能够达到与汇编代码相同的精度。

i取不同值时延时仿真结果如图4所示。

图4 i取不同值时延时仿真结果图
3 多重嵌套下的C程序延时
在某些情况下,延时较长,仅使用单层循环方式是不能完成的。

此时,只能使用多层循环方式,那么多重循环条件下,C程序的精度如何呢?下面是一个使用for语句实现1 s延时的函数。

延时函数
void delay1s(void) {
for(k=100;k>0;k--) //定时1 s
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
主函数调用延时函数代码段:
while(1) {
delay1s();
scond+=1;
}
为了直接衡量这段代码的效果,利用Keil C找出这段代码产生的汇编代码:
C:0x00B37002JNZ
C:00B7C:0x00B5150CDEC0x0C
C:0x00B7E50DMOVA,0x0D
C:0x00B9450CORLA,0x0C
C:0x00BB70DEJNZC:009B
C:0x00BDE50BMOVA,0x0B
C:0x00BF150BDEC0x0B
C:0x00C17002JNZC:00C5
C:0x00C3150ADEC0x0A
C:0x00C5E50BMOVA,0x0B
C:0x00C7450AORLA,0x0A
C:0x00C970CAJNZC:0095
C:0x00CB22RET
分析汇编代码,其他汇编代码使用的不是DJNZ跳转方式,而是DEC和JNZ语句来实现循环判断。

1条JNZ指令要花费2个时钟周期,3条指令就需要6个机器周期,MOV指令和DEC指令各需要1小时钟周期,1个时钟周期按1 μs算,其精度最多达到8 μs,最后加上一条LCALL和一条RET语句,所以整个延时精度较差[4]。

利用Keil C的测试工具,在一处设置一个断点。

第1次执行到中断处的时间为0.000 513 s,第2次执行到中断处的时间为1.000 922 s,时间延迟为1.000 409 s,测试结果如图5所示。

对于上面的3种循环嵌套,循环次数为100×20×248=496 000,每次循环的时间约为2 μs。

图5 三重嵌套循环1 s实现时间测试结果
为获取与汇编语言延时的差距,同样进行1 s的延时,程序代码段如下:
LCALL DELY1S
INC Second
DELY1S:MOV R5,#100
D2:MOV R6,#20
D1:MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,D2
RET
通过Keil C51测试,其实际延迟时间为0.997 943 s。

虽然C语言实现延时方式的汇编代码复杂度增加,但是与汇编语言实现的方式性能差距并不大。

4 总结
汇编语言在实时性方面具有较大的优越性,虽然使用Keil C51可以在C语言程序中嵌入汇编代码,但是复杂度明显提高。

实验证明,只要合理地运用C语言,在延时编程方面就可以达到与汇编语言相近的精度。

为了获得精确的时间延迟,可通过Keil C工具的仿真功能,调整延迟量,从而得到较理想的结果。

相关文档
最新文档