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