您的位置 首页 编程

C言语准确微秒级的延时

在使用C语言编程时延时程序是非常常见的,但是实现一个精确的延时是不太容易的,在给一个朋友的公司产品做维护时,发现一段代码,可以实现微妙级的延时。看起来代码非常简单。但是我以前没有想到过。我们一起来

  在运用C言语编程时延时程序对错常常见的,可是完成一个准确的延时是不太简略的,在给一个朋友的公司产品做保护时,发现一段代码,能够完成奇妙级的延时。看起来代码十分简略。可是我曾经没有想到过。咱们一同来看看这段代码。

  //—————————————————————————–

  // Delay_us

  //—————————————————————————–

  //

  // Return Value : None

  // Parameters : 1. time_us – time delay in microseconds

  // range: 1 to 255

  //

  // Creates a delay for the specified time (in microseconds) using TIMER2. The

  // time tolerance is approximately +/-50 ns (1/SYSCLK + function call time).

  //

  //—————————————————————————–

  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的差错,这个是函数调用发生的。这段代码在需求准确守时的场合十分有用!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/298634.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部