C语言延时计算

合集下载

C++中时间延迟的几种方法

C++中时间延迟的几种方法

C++中时间延迟的⼏种⽅法从论坛上转来的:(—)使⽤_sleep()函数#include <iostream>using namespace std;_sleep(5*1000);//延时5秒(⼆)使⽤Delay(int time)函数#include <ctime>void Delay(int time)//time*1000为秒数{ clock_t now = clock(); while( clock() - now < time );}Delay(5*1000); //延时5秒在linux下#include <unistd.h>sleep(5)//延迟5秒如果你想延迟⼀秒以内那么⽤#include <ctime>void Delay(int time)//time*1000为秒数{ clock_t now = clock(); while( clock() - now < time );}VC中⼏种延迟实现⽅案⽅法⼀:VC中的WM_TIMER消息映射能进⾏简单的时间控制。

⾸先调⽤函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔。

然后在应⽤程序中增加定时响应函数 OnTimer(),并在该函数中添加响应的处理语句,⽤来完成到达定时时间的操作。

这种定时⽅法⾮常简单,可以实现⼀定的定时功能,但其定时功能如同Sleep()函数的延时功能⼀样,精度⾮常低,最⼩计时精度仅为30ms,CPU占⽤低,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满⾜实时控制环境下的应⽤。

只可以⽤来实现诸如位图的动态显⽰等对定时精度要求不⾼的情况。

如⽰例⼯程中的Timer1。

⽅法⼆:VC中使⽤sleep()函数实现延时,它的单位是ms,如延时2秒,⽤sleep(2000)。

精度⾮常低,最⼩计时精度仅为30ms,⽤sleep函数的不利处在于延时期间不能处理其他的消息,如果时间太长,就好象死机⼀样,CPU占⽤率⾮常⾼,只能⽤于要求不⾼的延时程序中。

STC指令延时精确计算

STC指令延时精确计算

STC 单片机指令精确延时分析guoguo适用单片机:STC-1T ,晶振12MHz例1:Delayus( ) —— 延时能力2~256usC51代码:/*****延时us***************************************** 功能:延时i+1 us ,包含调用时间* 参数:无* 描述:适用于STC1T 单片机,晶振12MHz* 时钟周期0.08333us ,机器周期0.125us* 特别说明:编译器优化等级设为0,i 的有效范围1~255* 作者:张国营* 日期:2013-10-12*****************************************************/void delay10us(void) //包含调用时间,误差 0us{uchar i=9;do{_nop_();_nop_();_nop_();i--;}while(i);} 编译后的汇编代码:Keil 编译器优化等级0时钟周期Code 地址 机器码 汇编指令 备注 6 LCALL addr16 无参数调用 2 C:0x0C29 753709 MOV 0x37,#0x09 初始化局部变量 1 C:0x0C2C 00 NOP循环1us 1 C:0x0C2D 00 NOP1 C:0x0C2E 00 NOP 4 C:0x0C2F 1537 DEC 0x372 C:0x0C31 E537 MOV A,0x373 C:0x0C33 70F7 JNZ C:0C2C4 C:0x0C35 22 RET 返回计算公式,T=[(6+2)+ i *(3+4+2+3)+ 4 ] / 12= (12+12 * i)/12 =1+i 单位us 局部变量n=9时,延时10us ;n=99时,延时100us例2:Delayms( )——延时能力1~255ms ,误差约为 +1.25usC51代码:/*******************延时ms************************************* * 适用于STC1T 单片机,晶振12MHz ,时钟周期0.08333us ,机器周期0.125us * 延时能力:n = 1~255 ms ,误差为 +1.25 us* 特别说明:编译器优化等级设为0*******************************************************************/ void delayms(uchar n) //精确延时,包含调用时间,{uchar i,j;//---------循环体精确延时n ms-------------------do{ //约延时[(i+1)*j+1]*n us _nop_();j = 9;do{ //约延时 (i+1)*j us _nop_();i = 110;do{ //精确延时 i us _nop_();_nop_();_nop_();i--;}while(i);j--;}while(j);n--;}while(n);}编译后的汇编代码:Keil 编译器优化等级0时钟周期Code 地址 机器码 汇编指令 备注 2 C:0x0BB7 7F32 MOV R7,#0x32 含参数调用 6 C:0x0BB9 120BFB LCALL delayms(C:0BDB)3 C:0x0BDB 8F2F MOV 0x2F,R7 传递参数1 C:0x0C04 00 NOP n 循环:1us2 C:0x0C05 753109 MOV 0x31,#0x091 C:0x0C08 00 NOP j 循环:1us2 C:0x0C09 75306E MOV 0x30,#0x6E1 C:0x0C0C 00 NOPi 循环:1 us 1 C:0x0C0D 00 NOP1 C:0x0C0E 00 NOP 4 C:0x0C0F 1530 DEC 0x302 C:0x0C11 E530 MOV A,0x303 C:0x0C13 70F7 JNZ C:0C0C4 C:0x0C15 1531 DEC 0x31j 循环:1us2 C:0x0C17 E531 MOV A,0x313 C:0x0C19 70ED JNZ C:0C084 C:0x0C1B 152F DEC 0x2Fn 循环:1us2 C:0x0C1D E52F MOV A,0x2F3 C:0x0C1F 70E3 JNZ C:0C044 C:0x0C21 22 RET 返回计算公式,T= {15+n * [ j *(i * 12+12)+ 12 ] }/ 12=15/12+n*[ j*(i+1)+1],单位us 将i=110,j=9代入上式得:T=1000 * n+1.25宁夏成泰电子科技有限公司 * 研发部张国营。

16m晶振写延时

16m晶振写延时

16MHz晶振写延时可以通过公式进行计算,公式为:T = 1.15/(f x 2^N),其中T为晶振频率对应的周期,f为晶振频率,N为相位常数。

根据这个公式,可以得出需要的延时时间。

一般来说,可以使用Keil或IAR等开发工具中的定时器进行延时。

在C语言中,可以使用delay()函数实现延时操作。

在编写代码时,需要根据实际情况选择合适的延时时间,并注意避免程序中出现死循环等问题。

具体步骤如下:
1. 根据晶振频率和相位常数,使用公式计算出需要的延时时间。

2. 在Keil或IAR等开发工具中,选择合适的定时器进行延时操作。

3. 在主程序中调用delay()函数实现延时操作。

4. 根据实际需要,对程序进行调试和优化,确保程序能够正常运行。

注意事项:
1. 在编写代码时,需要注意避免程序中出现死循环等问题,以免影响程序的正常运行。

2. 在使用晶振时,需要注意晶振的安装方式和连接方式是否正确,以免影响晶振的性能和稳定性。

3. 在编写代码时,需要考虑到晶振的频率误差等因素,并采取相应的措施进行处理。

总之,通过以上步骤和注意事项,可以有效地实现16MHz晶振写延时操作。

需要注意的是,在实际应用中,需要根据具体情况进行调整和优化,以确保程序的正确性和稳定性。

c++11中的延时函数

c++11中的延时函数

在C++11中,可以使用`std::this_thread::sleep_for()`函数实现延时。

这个函数需要传入一个时间间隔,表示要延迟多长时间,单位是毫秒或者更小的时间单位。

以下是示例代码:```#include <chrono>#include <thread>// 延时函数void delay(int ms) {std::this_thread::sleep_for(std::chrono::milliseconds(ms));}int main() {// 延时1秒delay(1000);return 0;}```在上面的代码中,`delay()`函数接受一个整数参数`ms`,表示要延迟的毫秒数。

函数内部调用了`std::this_thread::sleep_for()`函数,并传入了`std::chrono::milliseconds(ms)`作为参数,表示要延迟指定的毫秒数。

需要注意的是,使用延时函数可能会导致程序阻塞,因此应该谨慎使用。

此外,在多线程程序中,如果要延时某个线程的执行,应该使用线程同步机制,而不是简单地使用延时函数。

好的,下面详细介绍一下在C++11中使用`std::this_thread::sleep_for()`实现延时的方法。

首先需要包含`<chrono>`和`<thread>`头文件。

`<chrono>`中包含了时间相关的类和函数,`<thread>`中包含了线程相关的类和函数。

`std::this_thread::sleep_for()`函数需要传入一个时间间隔,表示要延迟多长时间,单位可以是`std::chrono::hours`、`std::chrono::minutes`、`std::chrono::seconds`、`std::chrono::milliseconds`、`std::chrono::microseconds`或`std::chrono::nanoseconds`,这些都是定义在`<chrono>`头文件中的时间单位类型。

RC延时计算公式

RC延时计算公式

RC延时计算公式
RC延时计算公式:
延时时间= —R*C*ln((E-V)/E)
其中: “—”是负号;电阻R和电容C是串联,R的单位为欧姆,C的单位为F;E为串联电阻和电容之间的电压,V为电容间要达到的电压。

ln是自然对数,在EXCEL系统中有函数,计算非常方便。

经过实际对比计算结果是吻合的。

例如:R(150K)和C(1000UF)之间的电压为12V,当电容C两极的电压达到3伏时的时间:
=—(150*1000)*(1000/1000000)*ln((12-3)/12)=43(秒)
可根据RC电路的充电公式:Vc=E(1-e-(t/R*C))推算
R=2.2K C=100PF.电源电压为20V.我想知道电容两端电压从0V上升到13V所用的时间T怎么算?这个比较实际,初态和终态都有了
13=20 (1-exp(-Td/RC) );
13/20 = 1-exp (-Td/RC);
7/20 = exp(-Td/RC);
ln (7/20) = -Td/RC;
Td = 1.0498 RC;。

C++程序延时处理的几种方法

C++程序延时处理的几种方法

9. }
10.
11. /// @brief 程序延时

12. /// @param[in] sec : 秒
13. /// @remark
14. /// @return void
15. void delay_sec(int sec)//
16. {
17. time_t start_time, cur_time;
18. time(&start_time);
19. do
20. {
21.
time(&cur_time);
22. } while((cur_time - start_time) < sec);
23. }
例如,延时2秒可以这样:delay_msec(2000); 或者 delay_sec(2);
需要指出的是,delay_msec由于使用的是clock(),所以具有更高的时间精度(精确到1毫秒,具体看编译器定义)。
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
C++程 序 延 时 处 理 的 几 种 方 法
(—)使用_sleep()函数 例如:_sleep(200);//延时200毫秒
(二)使用delay(int time)函数 (需要自己实现,编译器里面没有)
[cpp]
1. /// @brief 程序延时
2. /// @param[in] msec : 毫秒
3. /// @remark
4. /// @return void
5. void delay_msec(int msec)
6. {

单片机C51延时时间怎样计算

单片机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毫秒延时。

需要注意的是,单片机的延时准确性受到各种因素影响,包括时钟精度、环境温度等。

在实际应用中,如果对延时精度有较高要求,可能需要进一步进行校准或采用其他更精确的延时方式。

51单片机延时函数

51单片机延时函数

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

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

以某晶振为12MHz 的单片机为例,晶振为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 DJNZ2us + 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延时子程序程序:{unsigned char i,j,k;for(i=5;i>0;i--)for(j=132;j>0;j --)for(k=150;k>0;k --);}三. 10ms延时子程序程序:{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语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

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

我现在就用两种方法来实现,一种是while()语句,另一种是for()语句,这两种语句均可产生汇编语句中的DJNZ语句,以12MHZ晶振为例(说明:在编写C程序时,变量尽量使用unsigned char,如满足不了才使用unsigned int):
1.delay=99;while(--delay);
000FH MOV 08H,#63H
0012H 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,#0x0F
C:0x0802 7ECA MOV R6,#0xCA
C:0x0804 7D51 MOV R5,#0x51
C:0x0806 DDFE DJNZ R5,C:0806
C:0x0808 DEFA DJNZ R6,C:0804
C:0x080A DFF6 DJNZ R7,C:0802
C: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--); }。

相关文档
最新文档