我正在尝试使LED闪烁到某首歌曲的节拍。这首歌正好是125 bpm。
我编写的代码起初似乎起作用,但是运行时间越长,LED闪烁和下一个节拍开始之间的时间差就越大。 LED似乎闪烁得太慢了一点。

我认为发生这种情况是因为lastBlink取决于在此之前发生的眨眼以保持同步,而不是使用一个静态初始值进行同步...

unsigned int bpm = 125;
int flashDuration = 10;
unsigned int lastBlink = 0;
for(;;) {
    if (getTickCount() >= lastBlink+1000/(bpm/60)) {
        lastBlink = getTickCount();
        printf("Blink!\r\n");
        RS232_SendByte(cport_nr, 4); //LED ON
        delay(flashDuration);
        RS232_SendByte(cport_nr, 0); //LED OFF
    }
}

最佳答案

lastBlink添加值,而不是重新读取它,因为getTickCount可能跳过的次数超出了要等待的确切节拍。

lastblink+=1000/(bpm/60);

10-08 12:00