【问题标题】:delay function starts with 2 ms then delay 1 ms延迟功能以 2 ms 开始,然后延迟 1 ms
【发布时间】:2017-06-16 16:14:25
【问题描述】:

我正在实现一个蜂鸣器功能,它接收频率并对其进行交互,并将输入引脚设置为高电平,延迟一半时间,另一半时间低电平以获得所需的频率,

示波器延迟功能在第一秒(即延迟(2msec))运行良好,然后延迟不同的时间量(即延迟(1msec))

typedef unsigned char u8;
typedef unsigned short int u16;
typedef unsigned long int u32;
 void delay(u32 time_in_ms)
  {
  u32 count;
  u32 loops =((time_in_ms*1000)-21)/11;
  for(count=0;count<loops;count++)
       asm("NOP");
  }

 extern void Buzzer_buzz(u16 Copy_u8Period_in_sec,u16 Copy_u8Frequency_in_Hz){
    u16 var;
    for (var=0; var<(Copy_u8Period_in_sec*1000)/(1000/Copy_u8Frequency_in_Hz)   ; var++){

        DIO_voidWritePin(0,1);

        delay(1000/(Copy_u8Frequency_in_Hz*2));

        DIO_voidWritePin(0,0);

        delay(1000/(Copy_u8Frequency_in_Hz*2));
    }

我主要是这样称呼它的:

void main (void){

DIO_voidInitialize();
Buzzer_voidInitialize();

while(1){
Buzzer_buzz(2,200);
 }
}

当我尝试用数字(即延迟(2.5))编写延迟时,它工作正常..

【问题讨论】:

  • 请解释“当我尝试用数字写延迟时(即延迟(2.5))它工作正常”。
  • 可能是整数除法的问题
  • 可能与您的问题无关,但您为什么不将(Copy_u8Period_in_sec*1000)/(1000/Copy_u8Frequency_in_Hz) 替换为(Copy_u8Period_in_sec * Copy_u8Frequency_in_Hz) 呢?
  • @barakmanos 我的意思不是写: delay(1000/(Copy_u8Frequency_in_Hz*2));我写了延迟(2.5);
  • @MichaelWalz 我不知道这对我有什么实际影响,但这确实对我有用。哈哈! :D

标签: c call delay


【解决方案1】:

首先问题可能是1000/(Copy_u8Frequency_in_Hz*2) 被四舍五入为整数值,因为您将整数除以整数。尝试1000.0f/(Copy_u8Frequency_in_Hz*2),但前提是delay() 函数可以将浮点数作为参数。

第二个问题可能是通常(我不知道这是什么平台)delay 函数无论如何都不是精确计时。在这个例子中,它可能工作得很好,但不要依赖它接近你想要的。

【讨论】:

  • 实际上我尝试了 michael Walz 所说的,它奏效了,我不知道延迟函数是如何不浮动的,但我希望至少是数字的整个部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
相关资源
最近更新 更多