我正在实现一个蜂鸣器功能,它接受频率并对其进行往复运动,并将输入引脚设置为高电平,延迟时间为一半,而另一半时间则低于获得所需的频率,
示波器延迟功能在第一秒(即延迟(2毫秒))运行良好,然后以不同的时间延迟(即延迟(1毫秒))
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))它工作正常..
答案 0 :(得分:1)
首先,问题可能是1000/(Copy_u8Frequency_in_Hz*2)
舍入为整数值,因为您将整数除以整数。尝试1000.0f/(Copy_u8Frequency_in_Hz*2)
,但前提是delay()
函数可以将float作为参数。
第二个问题可能是通常(我不知道这是什么平台)delay
函数无论如何都不是精确计时。在这个例子中它可能工作正常,但不要依赖它接近你想要它。