如何在Keil uVision中创建延迟功能?

时间:2014-02-04 13:33:17

标签: c keil

Arduino有延迟(ms)功能暂停程序一段时间。它在毫秒级内非常准确。

我在Keil uVision用于AT89C5131微处理器的C中有延迟功能:

void delay( unsigned long duration)
{
    while ( ( duration -- )!= 0);
}

这有一些延迟工作,但长值不像Arduino那样准确。

有没有办法在Arduino中创建一个像delay()函数一样的函数?

水晶以24Mhz运行。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

如果你想忙碌等待,这就是Keil的做法:

#pragma O0
void wait(volatile uint32_t cnt) {
    while(cnt--)
        _nop_();
}

http://www.keil.com/support/docs/606.htm

答案 1 :(得分:0)

请问,我认为您可以使用多周期代码,尝试添加一些for(); 而且我认为如果你需要在51 MCU中长时间延迟(比如几秒钟),我想它不需要非常精确的。

答案 2 :(得分:0)

尝试可以增加延迟的SysTick中断处理程序,并找到以下示例:

  volatile uint32_t msTicks;
    //! The interrupt handler for the SysTick module
    
    void SysTick_Handler(void) {
      msTicks++;
    }
/*----------------------------------------------------------------------------
 * Delay: delays a number of Systicks
 *----------------------------------------------------------------------------*/

    void Delay (uint32_t dlyTicks) {
      uint32_t curTicks;
      curTicks = msTicks;
      while ((msTicks - curTicks) < dlyTicks) { __NOP(); }
    }
   int main(){
          
             SysTick_Config(SystemCoreClock / 1000);  // Setup SysTick Timer for 1ms interrupts
             //some code
             Delay(500);
             // some code
            }