zoukankan      html  css  js  c++  java
  • C语言精确微秒级的延时

     1 //-----------------------------------------------------------------------------
     2 
     3 // Delay_us
     4 
     5 //-----------------------------------------------------------------------------
     6 
     7 //
     8 
     9 // Return Value : None
    10 
    11 // Parameters : 1. time_us - time delay in microseconds
    12 
    13 // range: 1 to 255
    14 
    15 //
    16 
    17 // Creates a delay for the specified time (in microseconds) using TIMER2. The
    18 
    19 // time tolerance is approximately +/-50 ns (1/SYSCLK + function call time).
    20 
    21 //
    22 
    23 //-----------------------------------------------------------------------------
    24 
    25 void Delay_us (unsigned char time_us)
    26 
    27 {
    28 
    29 unsigned long int TM_LODAE;
    30 
    31 TR2 = 0; // Stop timer
    32 
    33 TF2H = 0; // Clear timer overflow flag
    34 
    35 TM_LODAE = 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us);
    36 
    37 // TMR2 = -( (UINT)(SYSCLK/1000000) * (UINT)(time_us) );
    38 
    39 TMR2H = TM_LODAE>>8;
    40 
    41 TMR2L = TM_LODAE&0x00FF;
    42 
    43 TR2 = 1; // Start timer
    44 
    45 while (!TF2H); // Wait till timer overflow occurs
    46 
    47 TR2 = 0; // Stop timer
    48 
    49 }

    前面一起住航分析一下该代码

    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的误差,这个是函数调用产生的。这段代码在需要精确定时的场合非常实用

  • 相关阅读:
    HTML介绍
    python D41 前端初识
    mysql索引原理与查询优化
    python D41
    python D40 pymsql和navicat
    python D40 以及多表查询
    python D35 selectors模块
    python D35 I/O阻塞模型
    测试过程
    测试基础
  • 原文地址:https://www.cnblogs.com/UPUPDay2152/p/9410266.html
Copyright © 2011-2022 走看看