这个例程展示怎样用一个无源蜂鸣器和5个微动开关,做出来一个简易乐器。
ATmega328P芯片内部其实有上拉的功能,可以使用ATmega328P内部的上拉功能替代外部上拉。 ATmega328P Datasheet中有内部上拉的结构介绍,如下图:
上拉电阻 在数字电路中,上拉电阻(英语:Pull-up resistors)是当某输入端口未连接设备或处于高阻抗的情况下,一种用于保证输入信号为预期逻辑电平的电阻元件。他们通常在不同的逻辑器件之间工作,提供一定的电压信号。
上拉电阻的作用 在上拉电阻所连接的导线上,如果外部组件未启用,上拉电阻将“微弱地”将输入电压信号“拉高”。当外部组件未连接时,对输入端来说,外部“看上去”就是高阻抗的。这时,通过上拉电阻可以将输入端口处的电压拉高到高电平。如果外部组件启用,它将取消上拉电阻所设置的高电平。通过这样,上拉电阻可以使引脚即使在未连接外部组件的时候也能保持确定的逻辑电平。
#define time 50 void setup() { for (int i=2; i<=6; i++) //通过循环的方式设置2-7号引脚为输出状态 { pinMode(i,INPUT_PULLUP); } } void loop() { //D2 if(digitalRead(2)==LOW) { delay(5); if(digitalRead(2)==LOW) { tone(7,523,time); //Do while(digitalRead(2)==LOW) { delay(1); } } } //D3 if(digitalRead(3)==LOW) { delay(5); if(digitalRead(3)==LOW) { tone(7,587,time); //Re while(digitalRead(3)==LOW) { delay(1); } } } //D4 if(digitalRead(4)==LOW) { delay(5); if(digitalRead(4)==LOW) { tone(7,659,time); //Mi while(digitalRead(4)==LOW) { delay(1); } } } //D5 if(digitalRead(5)==LOW) { delay(5); if(digitalRead(5)==LOW) { tone(7,698,time); //Fa while(digitalRead(5)==LOW) { delay(1); } } } //D6 if(digitalRead(6)==LOW) { delay(5); if(digitalRead(6)==LOW) { tone(7,784,time); //So while(digitalRead(6)==LOW) { delay(1); } } } }
简洁版
#define time 50 int button[6]={6,5,4,3,2}; int freq[6]={523,587,659,784,880};//设定对应频率 int buzzer=7; void setup() { for(int i=1;i<6;i++){ pinMode(button[i-1], INPUT_PULLUP); } } void loop() { for(int i=1; i<6; i++){ if(digitalRead(button[i-1])==LOW){ delay(5); while(digitalRead(button[i-1])==LOW){ tone(buzzer,freq[i-1],time); delay(1); } } } }