扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
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的误差,这个是函数调用产生的。
只接触过sleep函数。。。usleep不知道啊。。。
c中有这个函数么。。。
sleep
原型:extern
void
sleep(unsigned
int
sec);
用法:#include
功能:短暂延时
说明:延时sec秒
举例:
//
sleep.c
#include
main()
{
int
c;
clrscr();
printf("\nHello,
world!");
sleep(1);
clrscr();
printf("\nHi,
guys");
getchar();
return
0;
}
相关函数:delay
如果是单片机上,是有可能的
单片机12M晶振执行一条指令1us,所以C语言1us延时程序 用12M晶振延时1us,用—_nop_();
#includeintrins.h //头文件
_nop_(); //这一个语句表示1us延时
c语言延迟函数原理:
延迟函数里执行的都是空语句,也就是说通过循环执行空语句来达到延迟的目的.每执行一条语句,即使是空语句都要耗费电脑一些处理时间的,就是因为这个,在延迟函数里写一些无关紧要的东西,用来浪费电脑处理时间,从而达到延迟目的。
函数名:
delay
功
能:
将程序的执行暂停一段时间(毫秒)
(该函数是TC下特有的函数,VC下应使用Sleep()函数)
用
法:
void
delay(unsigned
milliseconds);
程序例:
/*
Emits
a
440-Hz
tone
for
500
milliseconds
*/
#include
int
main(void)
{
sound(440);
delay(500);
nosound();
return
0;
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流