C语言delay函数

合集下载

c延时函数delay

c延时函数delay

c延时函数delay延时函数(delay function)是一种在程序中用来暂停一段时间的函数。

在C语言中,延时函数通常用于需要控制时间间隔的应用程序中,例如时钟、定时器、动画等。

在C语言中,实现延时函数有多种方法,下面将介绍两种常用的方法。

1.使用循环计数法延时函数最常见的实现方式之一是使用循环计数法。

具体步骤如下:-接收一个参数,表示延时的毫秒数;-将参数转换为循环需要的次数。

在现代计算机中,循环一次通常需要几十纳秒到几百纳秒的时间,因此需要将毫秒数转换为相应的循环次数;-使用一个循环来延时,每次循环后递减计数器,直到计数器为0。

下面是一个使用循环计数法实现的延时函数的示例代码:```c#include <stdio.h>#include <stdlib.h>void delay(int milliseconds)for(int i = 0; i < iterations; i++)//什么都不做,只是进行循环迭代}printf("Before delay\n");delay(1000); // 延时1秒printf("After delay\n");return 0;```2.使用标准库函数- `sleep(`函数:使程序休眠指定的秒数。

参数是休眠的秒数。

下面是使用`usleep(`函数实现延时的示例代码:```c#include <stdio.h>#include <stdlib.h>#include <unistd.h>void delay(int milliseconds)usleep(milliseconds * 1000); // 将毫秒转换为微秒int maiprintf("Before delay\n");delay(1000); // 延时1秒printf("After delay\n");```无论是使用循环计数法还是使用标准库函数,延时函数都有一定的局限性。

C语言常用函数

C语言常用函数

C语言的常用库函数函数1。

absread()读磁盘绝对扇区函数原形:int absread(int drive,int num,int sectnum,void *buf)功能:从drive指定的驱动器磁盘上,sectnum指定的逻辑扇区号开始读取(通过DOS中断0x25读取)num 个(最多64K个)扇区的内容,储存于buf所指的缓冲区中。

参数:drive=0对应A盘,drive=1对应B盘。

返回值:0:成功;-1:失败。

头文件:dos.h函数2。

abswrite()写磁盘绝对扇区函数原形:int abswrite(int drive,int nsects,int lsect,void *buffer)drive=0(A驱动器)、1(B驱动器)、nsects=要写的扇区数(最多64K个);lsect=起始逻辑扇区号;buffer=要写入数据的内存起始地址。

功能:将指定内容写入(调用DOS中断0x26)磁盘上的指定扇区,即使写入的地方是磁盘的逻辑结构、文件、FAT表和目录结构所在的扇区,也照常进行。

返回值:0:成功;-1:失败。

头文件:dos.h函数3。

atof()将字符串转换成浮点数的函数原形:double atof(const char *s)功能:把s所指向的字符串转换成double类型。

s格式为:符号数字.数字E符号数字返回值:字符串的转换值。

头文件:math.h、stdlib.h函数4。

atoi()将字符串转换成整型数的函数原形:int atoi(const char *s)功能:把s所指向的字符串转换成int类型。

s格式为:符号数字返回值:字符串的转换值。

若出错则返回0。

头文件:stdlib.h函数5。

atol()将字符串转换成长整型数的函数原形:long atol(const char *s)功能:把s所指向的字符串转换成long int类型。

s格式为:符号数字返回值:字符串的转换值。

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;。

用delay函数进行延时

用delay函数进行延时
用delay函数进行延时
在使用delay进行延时的时候,delay()括号中的数是多少则代表延时多少毫秒,即单位为毫秒。
举个例子:delay(100)则代表延时100ms;delay(200)则代表延时200ms。
delay是循环等待延时,该程序还在运行,占用处理器。
下面举例如何让在程序中进行编程采用51单片机范例:
#include<reg52.h> //52单片机头文件
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit led1=P1^1; //单片机管脚位声明
void delay(uintu) //延时函数,u代表的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
}
}
{//delay(300);大约延时300ms.
uint x,y;
for(x=u;x>0;x--)
for(y=110;y>0;y--);
}
void main()//主函数
{
while(1) //大循环
{
d1=0; //点亮小灯
delay(300); //延时300毫秒
led1=1;//熄灭小灯
delay(300); //延时300毫秒

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 也能精确做到。

c语言延时计算公式

c语言延时计算公式

c语言延时计算公式分类:Work Log| 标签:单片机应用2007-09-13 22:35 阅读(?)评论(0)今天在看单片机C编程的时候,突然想到在许多的编程中使用软件延时的方法,进行单片机的延时控制。

但是不是很清楚为会么如下的方法能够做到准确的延时。

程序如下:void delay(void){unsigned char i, j, k;for(i = 15; i > 0; i--)for(j = 202; j > 0; j--)for(k = 81; k > 0; k--);}使用Keil uVersion2进行编译产生了汇编程序看了一下,原来在循环中使用的跳转语句是DJNZ。

结合Rn及直接地址进行操作,DJNZ的指令机器周期为2us(晶振为12MHZ时)。

上面一段程序的汇编语句如下:C:0x0013 7F0F MOV R7,#0x0F ; 1us;-----------------C:0x0015 7ECA MOV R6,#0xCA ; 1us;-----------------C:0x0017 7D51 MOV R5,#0x51 ; 1usC:0x0019 DDFE DJNZ R5,C:0019 ; 2us for(k = 81; k > 0; k--) C:0x001B DEFA DJNZ R6,C:0017 ; 2us for(j = 202; j > 0; j--) ;------------------C:0x001D DFF6 DJNZ R7,C:0015 ; 2us for(i = 15; i > 0; i--)其中(;)及其后面的内容是为了方便说明加上去了。

现在我们来计算这段代码执行时所需的时间。

for(k = 81; k > 0; k--)这一个循环所需时间为:1+2×81执行完for(j = 202; j > 0; j--)这一个循环的时间为:1+(1+2×81+2)×202 执行完三个循环的总时间为:1+〔1+(1+2×81+2)×202+2〕×15最后加上调用子程序的时间2us和返回的时间2us,整个延时程序的时间就是1+〔1+(1+2×81+2)×202+2〕×15+2+2=〔3+(3+2×81)×202〕×15+5 =500000us=500ms这个值应该是一个准确的延时时间。

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的延时,实现了参数与延时时间的同步,使用起来更加方便。

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

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