用户工具

站点工具


ocrobot:kit:arduino_star_kit:tutorial012

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
ocrobot:kit:arduino_star_kit:tutorial012 [2017/10/04 07:38] 弘毅ocrobot:kit:arduino_star_kit:tutorial012 [2023/06/07 04:23] (当前版本) – 外部编辑 127.0.0.1
行 1: 行 1:
 +======简易乐器======
 +<WRAP center round info 100%>
 +这个例程展示怎样用一个无源蜂鸣器和5个微动开关,做出来一个简易乐器。
 +</WRAP>
 +ATmega328P芯片内部其实有上拉的功能,可以使用ATmega328P内部的上拉功能替代外部上拉。
 + ATmega328P Datasheet中有内部上拉的结构介绍,如下图:
  
 +{{:ocrobot:kit:arduino_star_kit:103035y880k2yvw4zzik8y.png?nolink|}}
 +
 +上拉电阻
 + 在数字电路中,上拉电阻(英语:Pull-up resistors)是当某输入端口未连接设备或处于高阻抗的情况下,一种用于保证输入信号为预期逻辑电平的电阻元件。他们通常在不同的逻辑器件之间工作,提供一定的电压信号。
 +
 +上拉电阻的作用
 + 在上拉电阻所连接的导线上,如果外部组件未启用,上拉电阻将“微弱地”将输入电压信号“拉高”。当外部组件未连接时,对输入端来说,外部“看上去”就是高阻抗的。这时,通过上拉电阻可以将输入端口处的电压拉高到高电平。如果外部组件启用,它将取消上拉电阻所设置的高电平。通过这样,上拉电阻可以使引脚即使在未连接外部组件的时候也能保持确定的逻辑电平。
 +=====搭建电路=====
 +{{:ocrobot:kit:arduino_star_kit:2014-5-18_22-28-09.png?nolink|}}
 +=====代码=====
 +<code cpp>
 +#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);
 +     }
 +   }
 + }
 +}
 +</code>
 +
 +简洁版
 +<code cpp>
 +#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);
 +      }
 +    }
 +  }        
 +}
 +
 +</code>
 +{{youku>XNzE1OTg5MTI4?900x530}}
 +[[ocrobot:kit:arduino_star_kit:main|返回上一级]]