求一个C语言的微秒级延时函数

求一个C语言的微秒级延时函数,第1张

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>包含进源文件中。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8043389.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-12
下一篇2023-04-12

发表评论

登录后才能评论

评论列表(0条)

    保存