
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_LODAE>>8
TMR2L = TM_LODAE&0x00FF
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_LODAE>>8 TMR2L = TM_LODAE&0x00FF置定时器寄存器的初值、
TR2 = 1 启动单片机计时 while (!TF2H) 等待定时器2寄存器溢出。TR2 = 0停止计时,在这段代码注释中已经说明了应该有50nS的误差,这个是函数调用产生的。
可以用_nop_( )函数来实现微秒级的延时。
_nop_() // 直接当成一条语句使用,产生一条NOP指令NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。
注:使用该函数时,需要将头文件#include<intrins.h>包含进源文件中。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)