Asynchronous Arduino-毫不迟疑的音调

Asynchronous Arduino-毫不迟疑的音调,asynchronous,arduino,delay,Asynchronous,Arduino,Delay,我试着在LCD显示器上改变一些东西时播放一个音调。我四处搜索并尝试了protothreads,但似乎延迟仍然阻止了程序。我也尝试过完全消除延迟,但除了最后一个音符外,它跳过了所有内容。有没有一种不使用延迟播放音调的方法?(也许是米利斯?) 样本音调序列: //Beats per Minute #define BPM 250 //Constants, try not to touch, touch anyways. #define Q 60000/BPM //Quarter note #de

我试着在LCD显示器上改变一些东西时播放一个音调。我四处搜索并尝试了protothreads,但似乎延迟仍然阻止了程序。我也尝试过完全消除延迟,但除了最后一个音符外,它跳过了所有内容。有没有一种不使用延迟播放音调的方法?(也许是米利斯?)

样本音调序列:

//Beats per Minute
#define BPM 250

//Constants, try not to touch, touch anyways.
#define Q 60000/BPM   //Quarter note
#define W 4*Q         //Whole note
#define H 2*Q         //Half note
#define E Q/2         //Eigth note
#define S Q/4         //Sixteenth note

void toneFunction()
{
      tone(tonePin,C5,Q);
      delay(1+W);
      tone(tonePin,C5,Q);
      delay(1+W);
      tone(tonePin,C5,Q);
      delay(1+W);
      tone(tonePin,C6,W);
}

您可以设置一个计时器,并将注释更改逻辑放入中断服务例程(ISR)

每X毫秒,计时器将重置并中断主循环。ISR将运行并选择下一个音符并调用音调功能。退出ISR后,程序将从中断点继续运行

我附上了我在我的一个项目中使用的代码。计时器将每隔50毫秒(20赫兹)中断主循环,因此您必须将自己的数字输入OCR1A和预定标器。请阅读更多关于arduino中计时器中断的内容,以便您了解如何执行此操作(例如:)。您还可以查看本页末尾()的示例,了解更方便用户的方法

setup() {

  ....

  /* Set timer1 interrupt to 20Hz */
  cli();//stop interrupts
  TCCR1A = 0;// set entire TCCR1A register to 0
  TCCR1B = 0;// same for TCCR1B
  TCNT1  = 0;//initialize counter value to 0
  OCR1A = 781; // approximately 20Hz
  TCCR1B |= (1 << WGM12);// turn on CTC mode
  TCCR1B |= (1 << CS12) | (1 << CS10);  // 1024 presxaler
  TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
  sei();//allow interrupts
} 

...

ISR(TIMER1_COMPA_vect){
  // pick next note
}
setup(){
....
/*将定时器1中断设置为20Hz*/
cli();//停止中断
TCCR1A=0;//将整个TCCR1A寄存器设置为0
TCCR1B=0;//TCCR1B相同
TCNT1=0;//将计数器值初始化为0
OCR1A=781;//约20Hz

TCCR1B |=(1你需要4次嘟嘟声(Beeep Beeep Beeep Beeep Beeep)对吗?延迟函数中的1+W是什么意思?延迟函数的参数是毫秒。@AdisakAnusornsrirung 1+W=整音符加1毫秒。延迟意味着停止播放音调?哇。以前不确定如何使用timer1。