所以这是一个比较复杂的问题。我目前正在使用带有 MPLAB X IDE 的 PIC16F1509 对小型开发人员测试板进行编程,并通过自定义 USB UART 桥将编译的十六进制文件闪存到板上。我的问题如下:压电未连接到 PWM 引脚之一(有原因)。由于我对 C 和编程 IC 还很陌生,所以我目前几乎对所有内容都进行了硬编码。我今天想创作一段旋律,效果很好:
void NOTE_A4 (void) {
for (int i = 0; i <= 440; i++)
{
sound1_SetHigh();
__delay_us(1136);
sound1_SetLow();
__delay_us(1136);
}
}
所以如果我调用这个函数,我会得到一秒钟的音符。
因为我希望能够更改音符的时间长度,所以我尝试了以下操作:
for (int i = 0; i <= 440/5; i++) {}
这可以让我毫无问题地玩 200 毫秒。
我还希望能够在调用函数时更改长度,所以我这样做了:
void NOTE_A4 (int divider) {
for (int i = 0; i <= 440/divider; i++)
{
sound1_SetHigh();
__delay_us(1136);
sound1_SetLow();
__delay_us(1136);
}
}
现在我的问题是它听起来很奇怪。 歌曲录制
我不知道为什么会发生这种情况,因为 for 循环正确计算了新数字。 感谢您的帮助。
PIC16F1xxx指令集没有除法指令,所以除法的软件实现很可能很慢。
循环时序可能受运行时划分
440/divider
的影响,在软件中实现。
但是硬编码
440/5
是在编译期间计算的。
解决这个问题的一种方法是使用预先计算的查找表。