大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
回答这个问题前提需要搞清楚:
创新互联是一家专注于成都网站建设、成都网站制作与策划设计,迁西网站建设哪家好?创新互联做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:迁西等地区。迁西做网站价格咨询:028-86922220
1.你的执行文件在那里运行?
2.你要延时是否“死等”,还是可以切换到其他任务?
-----------------------------------------------
如果你只是学习c语言,写个小函数玩玩,可以如下:
void delay(int time)
{
for(;time0;time--)
{
nop;//可写任何无意义的操作
}
}
死等型的延时,时间根据指令执行速度不同而不同!!!!
C语言delay函数延时计算源代码如下:
#include "stdlib.h"
void delay()
{
time_t start,end;
start=time(null);
unchar i;
while(z--)
{
for(i=0;ilt;121;i++);
}
end=time(null);
printf("%f",difftime(end,start));
}
扩展资料
1、对于要求精确延时时间更长,这时就要采用循环嵌套的方法来实现,因此,循环嵌套的方法常用于达到ms级的延时。
对于循环语句同样可以采用for,do…while,while结构来完成,每个循环体内的变量仍然采用无符号字符变量。
c语言,微秒级延时
void Delay_us (unsigned char time_us)
{
unsigned long int TM_LODAE;
TR2 = 0; // Stop timer
TF2H = 0; // Clear timer overflow flag
TM_LODAE = 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us);
// TMR2 = -( (UINT)(SYSCLK/1000000) * (UINT)(time_us) );
TMR2H = TM_LODAE8;
TMR2L = TM_LODAE0x00FF;
TR2 = 1; // Start timer
while (!TF2H); // Wait till timer overflow occurs
TR2 = 0; // Stop timer
}
程序分析:
前面一起住航分析一下该代码,
unsigned long int TM_LODAE; 声明一个长整型数据,
TR2 = 0; 定时器2停止计时
TF2H = 0; 清除定时器2中断标志
TM_LODAE = 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us); 计算定时器初值。 SYSCLK是系统的晶振频率,SYSCLK/1000000是系统 1uS 执行的指令。 (UINT)(SYSCLK/1000000) * (UINT)(time_us)就是系统 time_us执行的指令数。 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us)定时器需要 TM_LODAE指令周期才会溢出。
该单片机的一个指令周期就是一个时钟周期.TMR2H = TM_LODAE8; TMR2L = TM_LODAE0x00FF;置定时器寄存器的初值、
TR2 = 1; 启动单片机计时 while (!TF2H); 等待定时器2寄存器溢出。TR2 = 0;停止计时,在这段代码注释中已经说明了应该有50nS的误差,这个是函数调用产生的。
用C语言写延时程序,这延时的时间可不准的,说是1S,实际误差会很大的。只能是约为1秒左右。
如果是单片机上,是有可能的
单片机12M晶振执行一条指令1us,所以C语言1us延时程序 用12M晶振延时1us,用—_nop_();
#includeintrins.h //头文件
_nop_(); //这一个语句表示1us延时
通过实际测试得到的。例如调用该函数100次,计算所花费的时间,如果不是正好100秒,则可以加大或减少循环次数。