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

合集下载

c语言delay的用法

c语言delay的用法

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程序代码。

c语言延时函数

c语言延时函数

c语言延时函数
C语言中的延时函数是用来暂停程序执行一段时间的函数。

在嵌入式系统中,延时函数非常常见,因为它可以控制程序的执行速度,使程序按照预期的时间顺序执行。

常见的延时函数有两种实现方式:软件延时和硬件延时。

软件延时是通过循环来实现的,即在程序中使用一个循环来占用CPU的时间,从而实现延时的效果。

例如,下面是一个简单的软件延时函数:```。

void delay(unsigned int ms)。

unsigned int i, j;。

for (i = 0; i < ms; i++)。

for (j = 0; j < 1000; j++);。

}。

```这个函数的原理是在内层循环中占用CPU的时间,从而实现延时的效果。

但是,这种方式有一个缺点,就是在延时期间CPU是被占用的,不能执行其他任务。

硬件延时是通过使用定时器来实现的,即在程序中设置一个定时器,定时器到达指定时间后触发中断,从而实现延时的效果。

例如,下面是一个简单的硬件延时函数:```。

void delay(unsigned int ms)。

//设置定时器。

TMR0=0;。

.c延时函数 纳秒级别

.c延时函数 纳秒级别

.c延时函数纳秒级别在C语言中,一般使用以下两种方法实现纳秒级别的延时函数:方法一:使用“空循环”来实现延时空循环指的是在函数中使用一个循环,但循环内部不进行任何有意义的操作,而是使循环的迭代次数达到一定数量,从而达到一定的延时效果。

例如,假设我们需要实现一个延时1纳秒的函数,可以使用下面的代码实现:cvoid delay_ns(unsigned int ns) {volatile int i,j; volatile表示变量可能被意外修改,防止被编译器优化掉for (i = 0; i < ns; i++) {for (j = 0; j < 12; j++); 循环12次,大约需要1纳秒的时间(具体需要根据CPU速度进行调整)}}需要注意的是,空循环的实现方式虽然简单,但有两个明显的缺点:1. 循环的迭代次数需要手动调整,且不同的CPU速度需要使用不同的迭代次数,不方便移植。

2. 空循环会消耗CPU的资源,并且不能保证在不同的CPU架构下具有相同的延时精度。

方法二:使用CPU提供的硬件定时器来实现延时现代的CPU一般都会提供一些硬件定时器,可以通过编程的方式来设置定时器的计数器和预分频器,从而实现精确的延时。

例如,假设我们需要实现一个延时1纳秒的函数,可以使用在Linux下使用POSIX定时器API实现:c#include <time.h>void delay_ns(unsigned int ns) {struct timespec t = {0, ns};nanosleep(&t, NULL);}需要注意的是,使用硬件定时器来实现延时通常比空循环的方式更准确,但在实现上需要考虑平台的差异性、可移植性和系统开销等问题。

c语言中延时的方法

c语言中延时的方法

c语言中延时的方法C语言中实现延时的方法有多种方式。

下面将介绍两种常用的延时方法:方法一:使用循环实现延时使用循环来进行延时是C语言中常用的方法之一。

通过循环次数来控制延时的时间,代码如下:```#include <stdio.h>void delay(int milliseconds) {for (int i = 0; i < milliseconds * 10000; i++) {// 延时}}int main() {printf("开始延时\n");delay(1000); // 延时1秒printf("延时结束\n");return 0;}```在上述代码中,delay函数使用了一个for循环来实现延时,其中循环次数通过乘以10000与延时时间相乘得到。

这种方法的缺点是无法精确控制延时时间,受系统执行速度的影响较大。

方法二:使用<time.h>库函数实现延时另一种常用的延时方法是利用<time.h>头文件中的库函数,如sleep函数。

代码如下:```#include <stdio.h>#include <time.h>void delay(int seconds) {sleep(seconds);}int main() {printf("开始延时\n");delay(1); // 延时1秒printf("延时结束\n");return 0;}```在上述代码中,delay函数通过调用sleep函数来实现延时,参数表示延时的秒数。

这种方法的优点是延时时间较为精确,但缺点是无法实现毫秒级的延时。

以上是C语言中实现延时的两种常用方法。

开发者可以根据具体需求选择合适的延时方法。

通用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语言延时程序的计算方法经典

c语言延时程序的计算方法经典
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
下面是用了8.0000MHZ的晶振的几个延时程序(用定时0的工作模式1):
(1)延时0.9MS
void delay_0_9ms(void)
{
TMOD=0x01; /*定时器0工作在模式1下(16位计数器)*/
TH0=0xfd;
Loop2: djnz r6, loop2; djnz双周期指令
Djnz r7, loop1,
延时时间=T+i*T+i*j*2T+i*2T
下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR单片机上常用的有8.000MHz和4.000MH的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的频率是多大。
{
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--)
DJNZ R7,HERE
CLR TR0 ;定时器要软件清零
SETB EX0
RET
C语言延时程序:
10ms延时子程序(12MHZ)
void delay10ms(void)
{

单片机C语言延时计算

单片机C语言延时计算

单片机C语言延时计算单片机是一种集成电路芯片,内部集成了微处理器、存储器、输入输出接口等主要部件。

C语言是常用的单片机编程语言,可以通过编写C程序来实现单片机的控制和功能。

在单片机编程中,延时是一种常用的操作,用于控制程序执行过程中的时间间隔。

延时的实现方法有多种,可以使用循环遍历、定时器、外部中断等方式。

在循环遍历的延时方法中,可以通过设定一个循环次数来实现延时。

具体的延时时间与循环的次数成正比关系。

例如,在一个8位单片机中,循环一次大约需要4个机器周期,因此可以通过适当设置循环次数来达到需要的延时时间。

但是,使用循环遍历的延时方法会占用CPU资源,可能会影响其他任务的执行。

另一种常用的延时方法是使用定时器。

单片机内部通常集成了一个或多个定时器,可以通过设置定时器的初值和工作模式来实现精确的延时。

例如,可以通过设置定时器的计数值和工作频率来计算出延时的时间。

在定时器工作期间,单片机可以继续执行其他任务,不会占用过多的CPU资源。

除了循环遍历和定时器方法外,还可以使用外部中断的方式来实现延时。

具体的实现方法是通过外部信号触发中断,并在中断处理程序中实现延时功能。

这种方法可以根据外部信号的频率和工作模式来调整延时时间。

在单片机编程中,为了提高代码的可读性和可重用性,可以将延时操作封装成函数。

例如,可以定义一个名为delay的函数,函数的参数为延时的时间(单位为毫秒),函数内部通过循环遍历、定时器或外部中断的方式实现延时。

延时的时间计算可以考虑单片机的工作频率、机器周期以及延时的时间要求。

单片机的工作频率可以由时钟源来决定,一般可以通过设置分频系数来调整。

机器周期是单片机执行一条指令所需的时间,通过单片机的数据手册可以查到相关的数据。

根据单片机的工作频率和机器周期,可以计算出所需的循环次数或定时器计数值。

在使用延时功能时需要注意延时时间的准确性和可调性。

准确性是指延时的实际时间与预期时间之间的误差,通过调整循环次数或定时器计数值可以实现较高的准确性。

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

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

相关文档
最新文档