关于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语言延时函数范文
c语言延时函数范文延时函数在C语言中是常用的函数之一,用于控制程序运行时的时间延迟,以实现一定的等待或延迟效果。
延时函数可以用于多种场景,比如处理器速度过快,需要等待外部设备的响应,或者需要控制程序的执行速度。
C语言中的延时函数通常是通过循环来实现的,这样可以在一定的时间内重复执行,从而实现延时效果。
下面是一个简单的延时函数的示例:```cvoid delay(unsigned int milliseconds)return;```以上示例中,使用了stdio.h头文件中的clock(函数来获取当前时钟时间,将其用于计算延时时间。
参数milliseconds表示需要延时的毫秒数。
具体的延时操作是通过一个while循环来实现的,循环次数和延时时间有关。
比如,假设每个循环耗时10个时钟周期,那么延时函数的精度就是10毫秒。
然而,上述的延时函数并不是很精确,因为循环体中的操作可能需要消耗一定的时间,而不仅仅是计算时钟时间。
为了提高延时函数的精确度,可以使用内联汇编来实现。
下面是一个使用内联汇编嵌入汇编指令的延时函数示例:```c#include <stdint.h>void delay(uint32_t milliseconds)uint32_t counter_value;uint32_t i;for(i = 0; i < milliseconds; i++)__asm__ volatile"PUSH{r0}\n""MOVr0,\n""L_LOOP:\n""SUBr0,r0,\n""CMPr0,\n""BNEL_LOOP\n""POP{r0}\n"}```以上示例中,使用了stdint.h头文件中的uint32_t类型来定义32位的无符号整型变量,以适应较长的延时时间。
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语言中,一般使用以下两种方法实现纳秒级别的延时函数:方法一:使用“空循环”来实现延时空循环指的是在函数中使用一个循环,但循环内部不进行任何有意义的操作,而是使循环的迭代次数达到一定数量,从而达到一定的延时效果。
例如,假设我们需要实现一个延时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语言中常用的方法之一。
通过循环次数来控制延时的时间,代码如下:```#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语言中实现延时的两种常用方法。
开发者可以根据具体需求选择合适的延时方法。
延时程序原理
延时程序原理延时程序是一种常见的编程技术,用于暂停程序的执行一段指定的时间。
它的原理基于计算机的时钟频率和指令执行的速度。
在大多数计算机系统中,时钟频率是一个固定的值,它定义了CPU每秒钟可以执行多少条指令。
例如,如果某台计算机的时钟频率为2GHz(即每秒执行2亿条指令),那么每秒钟的时间单位被分为了2亿个小的时间片。
延时程序利用了这个特性,通过在指令执行过程中插入一个空操作(NOP)或者空循环,来消耗一定数量的时间片。
具体的延时时间取决于循环次数或者空操作的数量。
简单的延时程序可以使用循环来实现。
例如,下面是一个使用C语言编写的延时程序示例:```c#include <stdio.h>#include <time.h>void delay(unsigned int milliseconds) {clock_t start_time = clock(); // 记录开始时间while (clock() < start_time + milliseconds); // 循环直到达到指定的延时时间}int main() {printf("开始延时\n");delay(1000); // 延时1秒printf("延时结束\n");return 0;}```在这个示例中,延时函数 `delay` 使用了一个循环来暂停程序的执行。
它先记录开始时间,然后通过检查当前时间是否超过开始时间加上指定的延时时间来判断是否继续循环。
当循环结束后,延时时间就达到了指定的值。
需要注意的是,延时程序的精确性取决于计算机的性能,特别是处理器的时钟频率。
不同的计算机系统可能由于硬件性能的差异而导致延时时间存在一定的误差。
总结起来,延时程序利用计算机的时钟频率和指令执行速度,通过循环或者空操作来暂停程序的执行一段指定的时间。
它在很多场景中都有广泛的应用,例如需要精确控制程序行为、模拟实时系统等。
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语言延时程序的研究2007-08-19 21:02有个好帖,从精度考虑,它得研究结果是:void delay2(unsigned char i){while(--i);}为最佳方法。
分析:假设外挂12M(之后都是在这基础上讨论)我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay2(0):延时518us 518-2*256=6delay2(1):延时7us(原帖写“5us”是错的,^_^)delay2(10):延时25us 25-20=5delay2(20):延时45us 45-40=5delay2(100):延时205us 205-200=5delay2(200):延时405us 405-400=5见上可得可调度为2us,而最大误差为6us。
精度是很高了!但这个程序的最大延时是为518us 显然不能满足实际需要,因为很多时候需要延迟比较长的时间。
那么,接下来讨论将t分配为两个字节,即uint型的时候,会出现什么情况。
void delay8(uint t){while(--t);}我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay8(0):延时524551us 524551-8*65536=263delay8(1):延时15usdelay8(10):延时85us 85-80=5delay8(100):延时806us 806-800=6delay8(1000):延时8009us 8009-8000=9delay8(10000):延时80045us 80045-8000=45delay8(65535):延时524542us 524542-524280=262如果把这个程序的可调度看为8us,那么最大误差为263us,但这个延时程序还是不能满足要求的,因为延时最大为524.551ms。
那么用ulong t呢?一定很恐怖,不用看编译后的汇编代码了。
那么如何得到比较小的可调度,可调范围大,并占用比较少得RAM呢?请看下面的程序:/*--------------------------------------------------------------------程序名称:50us 延时注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振例子提示:调用delay_50us(20),得到1ms延时全局变量:无返回:无--------------------------------------------------------------------* /void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay_50us(1):延时63us 63-50=13delay_50us(10):延时513us 503-500=13delay_50us(100):延时5013us 5013-5000=13delay_50us(1000):延时50022us 50022-50000=22赫赫,延时50ms,误差仅仅22us,作为C语言已经是可以接受了。
单片机C51延时时间怎样计算
单片机C51延时时间怎样计算计算单片机C51延时时间通常需要考虑以下几个因素:1. 单片机的工作频率:单片机的工作频率决定了每个时钟周期的时长。
时钟周期(T)为1 / 片内晶振频率。
例如,若单片机的晶振频率为11.0592MHz,则时钟周期为1 / 11.0592MHz ≈ 90.52ns。
2. 延时的时间要求:您需要计算的是具体的延时时间,例如1毫秒(ms),10毫秒(ms)等。
有了上述信息,我们可以使用下面的公式来计算延时时间:延时时间(单位:时钟周期)=(目标延时时间(单位:秒)/时钟周期(单位:秒))延时时间(单位:毫秒)=延时时间(单位:时钟周期)×1000下面是一个示例的代码来演示如何计算并实现一个1毫秒的延时:```c#include <reg51.h>//定义时钟周期#define CLOCK_PERIOD 100 // 以纳秒为单位//定义延时函数void delay_ms(unsigned int milliseconds)unsigned int i, j;for (i = 0; i < milliseconds; i++)for (j = 0; j < 120; j++) // 这里的120是根据实际测量得到的,可以根据硬件和软件环境适当微调//每次循环消耗的时间为120*100纳秒≈12微秒//因此,总延时时间为12*1000微秒=1毫秒}}//主函数void mainP1=0x00;//把P1引脚置为低电平while (1)delay_ms(1000); // 1秒的延时P1=~P1;//翻转P1引脚的电平}```上述代码中,我们通过嵌套循环实现了一个1毫秒的延时。
根据实际硬件和软件环境,您可能需要微调内层循环的次数以达到准确的1毫秒延时。
需要注意的是,单片机的延时准确性受到各种因素影响,包括时钟精度、环境温度等。
在实际应用中,如果对延时精度有较高要求,可能需要进一步进行校准或采用其他更精确的延时方式。
c语言延时程序的计算方法经典
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语言精确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语言中的精确延时函数有循环延时法和系统延时函数两种方法,根据实际需求选择合适的方法来实现延时。
单片机C语言延时计算
单片机C语言延时计算单片机是一种集成电路芯片,内部集成了微处理器、存储器、输入输出接口等主要部件。
C语言是常用的单片机编程语言,可以通过编写C程序来实现单片机的控制和功能。
在单片机编程中,延时是一种常用的操作,用于控制程序执行过程中的时间间隔。
延时的实现方法有多种,可以使用循环遍历、定时器、外部中断等方式。
在循环遍历的延时方法中,可以通过设定一个循环次数来实现延时。
具体的延时时间与循环的次数成正比关系。
例如,在一个8位单片机中,循环一次大约需要4个机器周期,因此可以通过适当设置循环次数来达到需要的延时时间。
但是,使用循环遍历的延时方法会占用CPU资源,可能会影响其他任务的执行。
另一种常用的延时方法是使用定时器。
单片机内部通常集成了一个或多个定时器,可以通过设置定时器的初值和工作模式来实现精确的延时。
例如,可以通过设置定时器的计数值和工作频率来计算出延时的时间。
在定时器工作期间,单片机可以继续执行其他任务,不会占用过多的CPU资源。
除了循环遍历和定时器方法外,还可以使用外部中断的方式来实现延时。
具体的实现方法是通过外部信号触发中断,并在中断处理程序中实现延时功能。
这种方法可以根据外部信号的频率和工作模式来调整延时时间。
在单片机编程中,为了提高代码的可读性和可重用性,可以将延时操作封装成函数。
例如,可以定义一个名为delay的函数,函数的参数为延时的时间(单位为毫秒),函数内部通过循环遍历、定时器或外部中断的方式实现延时。
延时的时间计算可以考虑单片机的工作频率、机器周期以及延时的时间要求。
单片机的工作频率可以由时钟源来决定,一般可以通过设置分频系数来调整。
机器周期是单片机执行一条指令所需的时间,通过单片机的数据手册可以查到相关的数据。
根据单片机的工作频率和机器周期,可以计算出所需的循环次数或定时器计数值。
在使用延时功能时需要注意延时时间的准确性和可调性。
准确性是指延时的实际时间与预期时间之间的误差,通过调整循环次数或定时器计数值可以实现较高的准确性。
c语言延时程序的计算方法经典
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语言中被广泛使用,它可以让程序在执行特定代码之后暂停一段时间。
这在很多应用中非常有用,例如需要控制执行频率的任务、需要定时操作的任务以及模拟实时环境等。
本文将详细介绍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语言的延时计算C51中精确的延时与计算的实现C51由于其可读性和可移植性很强,在单片机中得到广泛的应用,但在某些时候由于C51编写的程序对在有精确时间要求下,可能就得要用汇编语言来编写,但在C51是否也能实现时间的精确控制呢,答案是肯定的。
在C51中要实现对时间的精确延时有以下几种方法其一:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒,就插入个这样的函数。
NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M 晶振,延时1uS。
其二:对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。
在选择C51中循环语句时,要注意以下几个问题第一、定义的C51中循环变量,尽量采用无符号字符型变量。
第二、在FOR循环语句中,尽量采用变量减减来做循环。
第三、在do…while,while语句中,循环体内变量也采用减减方法。
这因为在C51编译器中,对不同的循环方法,采用不同的指令来完成的。
下面举例说明:unsigned char I;for(i=0;i<255;i++);unsigned char I;for(i=255;i>0;i--);其中,第二个循环语句C51编译后,就用DJNZ指令来完成,相当于如下指令: MOV 09H,,0FFHLOOP: DJNZ 09H,LOOP指令相当简洁,也很好计算精确的延时时间。
同样对do…while,while循环语句中,也是如此例:unsigned char n;n=255;do{n--}while(n);或n=255;while(n){n--};这两个循环语句经过C51编译之后,形成DJNZ来完成的方法,故其精确时间的计算也很方便。
其三:对于要求精确延时时间更长,这时就要采用循环嵌套的方法来实现,因此,循环嵌套的方法常用于达到ms级的延时。
对于循环语句同样可以采用for,do…while,while结构来完成,每个循环体内的变量仍然采用无符号字符变量。
c语言时延打点方案 -回复
c语言时延打点方案-回复C语言时延打点方案导言:C语言是一种广泛应用于系统软件和应用程序开发的高级编程语言。
在实际应用中,时延(也称为延迟)是指开始某个操作到完成该操作所经过的时间,对于实时性要求较高的系统,优化时延是至关重要的。
本文将探讨C语言中优化时延的打点方案。
一、理解时延在编程中,时延是指某个操作从开始到完成所消耗的时间。
这个时间通常由许多因素决定,包括硬件性能、软件算法和编码技巧等。
在C语言中,时延打点的主要目的是为了确定程序中的瓶颈和性能瓶颈,从而进行优化和改进。
二、时延打点方法1. 基础方法最简单的时延打点方法是使用标准库函数time.h中的clock()函数或者使用操作系统提供的计时函数。
这些函数可以在程序中插入时间戳,然后计算两个时间戳之间的差值,从而得到时延。
2. 微秒级时延打点为了更精确地测量时延,可以使用基于硬件的计时器,例如x86架构中的时间戳计数器(TSC)。
时间戳计数器可以精确到微秒级别,从而更精确地测量程序中的时延。
在C语言中,可以使用内联汇编来访问时间戳计数器。
以下是一个示例代码:c#include <stdio.h>static inline unsigned long long rdtsc(){unsigned int lo, hi;asm volatile ("rdtsc" : "=a" (lo), "=d" (hi));return ((unsigned long long)hi << 32) lo;}int main(){unsigned long long start, end, time;start = rdtsc(); 开始计时执行要测量时延的代码块end = rdtsc(); 结束计时time = end - start; 计算时延printf("The time delay is: llu\n", time);return 0;}3. 基于时钟周期的时延打点在一些特定的嵌入式系统中,可以通过统计CPU时钟周期的方式来测量时延。
单片机C语言精确延时值的计算
单片机C语言精确延时值的计算关于单片机C 语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而51hei 给出的本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU 为STC12C5412 系列12 倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。
共有三条延时函数说明如下:函数调用分两级:一级是小于10US 的延时,二级是大于10US 的延时//====================小于10US 的【用1US 级延时】====================//----------微秒级延时---------for(i=X;iX;i--) 延时时间=(3+5*X)/12 提示(单位us, X 不能大于255)//================大于10US 小于21.9955Ms 的可用【10US 级延时函数】===========void Delay10us(uchar Ms){ uchar data i; for(;Ms0;Ms--) for(i=26;i0;i--);}i=[(延时值-1.75)*12/Ms-15]/4 如想延时60US 则i=[(60-1.75)*12/6-15]/4=25.375≈26;修改i 的值=26,再调用上面的【10US 级延时函数】Delay10us(6); 则就精确延时60US;如果想延时64US 可以用这二种函数组合来用: Delay10us(6); for(i=9;iX;i--) 共延时64US//==============对于大于20Ms 的可用中断来实现程序运行比较好===============中断用定时器0, 1Ms 中断:void timer0(void) interrupt 1 { TL0=(0xffff-1000+2)%0x100;TH0=(0xffff-1000+2)/0x100; //每毫秒执行一次if(DelayMs_10)DelayMs_1--;//大于20Ms 延时程序}函数调用void DelayMs(uint a)//延时a×1(ms)的时间。
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语言延时计算
我现在就用两种方法来实现,一种是while()语句,另一种是for()语句,这两种语句均可产生汇编语句中的DJNZ语句,以12MHZ晶振为例(说明:在编写C程序时,变量尽量使用unsigned char,如满足不了才使用unsigned int):1.delay=99;while(--delay);000FH MOV 08H,#63H0012H DJNZ 08H,0012H这样产生的延时时间为:(99+1)×2us。
最小延时时间为2us,若加上对delay赋值语句,则最小为4us。
2.for(i=delay;i>0;i--);产生的汇编代码同while()语句。
下面来举例几个延时函数:一. 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--);}产生的汇编代码: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){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--); }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
楼主要想准确的控制时间,应该研究使用汇编语言,或者使用硬件定时器。
C语言,只能干些粗活。
原题网址:question225783032.html
====================================
很多网友在C语言延时函数的延时时间方面,做出了很大的努力。
在网上找到的一篇文章,其中给出了一些经验数据,摘录一些主要内容如下。
=============================================
文章转自 Proteus仿真社区 作者:liaoguobao00
未作验证,如有问题请和原作者联系:
600us 6 1 63 0
700us 7 1 63 -0.5
800us 1 3 175 +0.5
900us 9 1 63 -1.5
=============================================
用C语言写程序,是非常的简练,不足之处是它的延时很不好控制。
很难知道一段延时程序的精确延时到底是多少,这和汇编延时程序无法相比。
通过测试,给大家提供一个延时子程序模块,并以此给出一个延时的数据表格。
延时模块:
200us 1 1 128 0
300us 3 1 63 +1.5
400us 2 1 129 0
500us 5 1 63 +0.5
(X的范围为2到255)
注意:表格中的数据只适合上述延时模块。
这篇文章里面,也没有写清楚系统晶振是多少,所以做而论道也未进行实验,希望网友们进行测试
70us 1 1 42 +1
80us 1 1 48 0
90us 1 1 55 +0.5
100us 1 1 61 -0.5
30us 1 1 15 +0.5
40us 2 1 9 0
50us 1 1 28 0
60us 1 பைடு நூலகம் 1 35 +0.5
====================================
最佳答案:
C语言的执行时间,从来就没有计算公式。
C程序的执行时间,和操作系统有很大的关系,和编译软件也有关。
在单片机中,更和变量的存储类型有关(如单字节变量、两字节变量)。
因为有如此多的不确定因素,所以,从来就没有办法计算C的执行时间。
1ms 1 3 219 -1.5
2ms 2 3 220 +3
3ms 3 3 220 +3
Xms X 3 220 +3
关于C语言延时时间的问题
回答了一个关于C语言延时时间的问题,题目给出延时函数如下:
delay(unsigned int x) {while(x--);}
delay(unsigned int x) {for (i =0, i x; i++);}
单片机的晶振为12M。
要求说出他们所延迟的时间分别是X的多少倍?怎么计算的。
void Delay()
{
unsigned char a,b,c;
for(a = 0; a ; a++)
for(b = 0; b ; b++)
for(c = 0; c ; c++);
}
其中问号代表要填的数,要延时多少,到下面的表格中去找数据,然后填上就OK!
数据表如下
延时时间 a的值 b的值 c的值 误差(us)
10us 1 1 1 -0.5
20us 1 1 8 0