zoukankan      html  css  js  c++  java
  • Arduino开发版学习计划--蜂鸣器

    文章内容参考:http://www.cnblogs.com/xiaowuyi/p/3343757.html

    遇到不懂的方法,可以查看Arduino自带的API

    就直接点击arduino的IDE里面菜单的Help(帮助)按钮里面的reference(参考)按钮,你就会发现arduino的Api(arduino说明书)

    无源蜂鸣器:一种一体化结构的电子讯响器,分为有源蜂鸣器与无源蜂鸣器。这里的“源”不是指电源,而是指震荡源,有源蜂鸣器内部带震荡源,所以只要一通电就会响,而无源内部不带震荡源,所以如果仅用直流信号无法令其鸣叫,必须用2K-5K的方波去驱动它。从外观上看,两种蜂鸣器区别不大,没有电路板而用胶封闭的一种是有源蜂鸣器。

    首先写一段代码让蜂鸣器发声:

    int  tonepin=13;//设置控制蜂鸣器的数字13脚
    void setup()
    {
       pinMode(tonepin,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
    }
    void loop()
    {
       unsigned char i,j;
       while(1)
       {
         for(i=0;i<80;i++)//输出一个频率的声音
         {
           digitalWrite(tonepin,HIGH);//发声音
           delay(1);//延时1ms
           digitalWrite(tonepin,LOW);//不发声音
           delay(1);//延时ms
         }
         for(i=0;i<100;i++)//输出另一个频率的声音,这里的100与前面的80一样,用来控制频率,可以自己调节
         {
           digitalWrite(tonepin,HIGH);
           delay(2);
           digitalWrite(tonepin,LOW);
           delay(2);
         }
      }
    }

      从上面的代码可以看出,for语句中的80、100控制了频率,delay控制了时长,类似与音乐中的节拍。

     无线蜂鸣器演奏音乐

    从上面的实验看,如果我们能够控制好频率和节拍,那就有可能演奏出动听的音乐。因此,我们首先需要搞清楚各音调的频率,具体见下表:

    低音:

    音调

    音符

    1#

    2#

    3#

    4#

    5#

    6#

    7#

    A

    221

    248

    278

    294

    330

    371

    416

    B

    248

    278

    294

    330

    371

    416

    467

    C

    131

    147

    165

    175

    196

    221

    248

    D

    147

    165

    175

    196

    221

    248

    278

    E

    165

    175

    196

    221

    248

    278

    312

    F

    175

    196

    221

    234

    262

    294

    330

    G

    196

    221

    234

    262

    294

    330

    371

    中音:

    音调

    音符

    1

    2

    3

    4

    5

    6

    7

    A

    441

    495

    556

    589

    661

    742

    833

    B

    495

    556

    624

    661

    742

    833

    935

    C

    262

    294

    330

    350

    393

    441

    495

    D

    294

    330

    350

    393

    441

    495

    556

    E

    330

    350

    393

    441

    495

    556

    624

    F

    350

    393

    441

    495

    556

    624

    661

    G

    393

    441

    495

    556

    624

    661

    742

    高音:

    音调

    音符

    1#

    2#

    3#

    4#

    5#

    6#

    7#

    A

    882

    990

    1112

    1178

    1322

    1484

    1665

    B

    990

    1112

    1178

    1322

    1484

    1665

    1869

    C

    525

    589

    661

    700

    786

    882

    990

    D

    589

    661

    700

    786

    882

    990

    1112

    E

    661

    700

    786

    882

    990

    1112

    1248

    F

    700

    786

    882

    935

    1049

    1178

    1322

    G

    786

    882

    990

    1049

    1178

    1322

    1484

    我们知道了音调的频率后,下一步就是控制音符的演奏时间。每个音符都会播放一定的时间,这样才能构成一首优美的曲子,而不是生硬的一个调的把所有的音符一股脑的都播放出来。

    音符节奏分为一拍、半拍、1/4拍、1/8拍,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,所以我们可以为每个音符赋予这样的拍子播放出来,音乐就成了。

     从简谱看,该音乐是D调的,这里的各音符对应的频率对应的是上表中D调的部分。另外,该音乐为四分之四拍,每个对应为1拍。几个特殊音符说明如下:

    第一,普通音符。如第一个音符3,对应频率350,占1拍。

    第二,带下划线音符,表示0.5拍。

    第三,有的音符后带一个点,表示多加0.5拍,即1+0.5

    第四,有的音符后带一个—,表示多加1拍,即1+1

    第五,有的两个连续的音符上面带弧线,表示连音,可以稍微改下连音后面那个音的频率,比如减少或增加一些数值(需自己调试),这样表现会更流畅,其实不做处理,影响也不大。

    #define NTD0 -1
    #define NTD1 294
    #define NTD2 330
    #define NTD3 350
    #define NTD4 393
    #define NTD5 441
    #define NTD6 495
    #define NTD7 556
    
    #define NTDL1 147
    #define NTDL2 165
    #define NTDL3 175
    #define NTDL4 196
    #define NTDL5 221
    #define NTDL6 248
    #define NTDL7 278
    
    #define NTDH1 589
    #define NTDH2 661
    #define NTDH3 700
    #define NTDH4 786
    #define NTDH5 882
    #define NTDH6 990
    #define NTDH7 112
    //c pinlv
    #define WHOLE 1
    #define HALF 0.5
    #define QUARTER 0.25
    #define EIGHTH 0.25
    #define SIXTEENTH 0.625
    
    int tune[]=
    {
      NTD3,NTD3,NTD4,NTD5,
      NTD5,NTD4,NTD3,NTD2,
      NTD1,NTD1,NTD2,NTD3,
      NTD3,NTD2,NTD2,
      NTD3,NTD3,NTD4,NTD5,
      NTD5,NTD4,NTD3,NTD2,
      NTD1,NTD1,NTD2,NTD3,
      NTD2,NTD1,NTD1,
      NTD2,NTD2,NTD3,NTD1,
      NTD2,NTD3,NTD4,NTD3,NTD1,
      NTD2,NTD3,NTD4,NTD3,NTD2,
      NTD1,NTD2,NTDL5,NTD0,
      NTD3,NTD3,NTD4,NTD5,
      NTD5,NTD4,NTD3,NTD4,NTD2,
      NTD1,NTD1,NTD2,NTD3,
      NTD2,NTD1,NTD1
    };
    float durt[]=
    {
      1,1,1,1,
      1,1,1,1,
      1,1,1,1,
      1+0.5,0.5,1+1,
      1,1,1,1,
      1,1,1,1,
      1,1,1,1,
      1+0.5,0.5,1+1,
      1,1,1,1,
      1,0.5,0.5,1,1,
      1,0.5,0.5,1,1,
      1,1,1,1,
      1,1,1,1,
      1,1,1,0.5,0.5,
      1,1,1,1,
      1+0.5,0.5,1+1,
    };
    int length;
    int tonepin=13;
    int ledp=1;
    void setup()
    {
      pinMode(tonepin,OUTPUT);
      pinMode(ledp,OUTPUT);
      length=sizeof(tune)/sizeof(tune[0]);
    }
    void loop()
    {
      for(int x=0;x<length;x++)
      {
        tone(tonepin,tune[x]);
        digitalWrite(ledp, HIGH); 
        delay(400*durt[x]);//与前一代码不同之处,这里将原来的500分为了400和100,分别控制led的开与关,对于蜂鸣器来说依然是500.
        digitalWrite(ledp, LOW);
        delay(100*durt[x]);
        noTone(tonepin);
        
      }
      delay(2000);
    }
  • 相关阅读:
    Recommended Books for Algo Trading in 2020
    Market Making is simpler than you think!
    Top Crypto Market Makers of 2020
    Top Crypto Market Makers, Rated and Reviewed
    爬取伯乐在线文章(五)itemloader
    爬取伯乐在线文章(四)将爬取结果保存到MySQL
    爬取伯乐在线文章(三)爬取所有页面的文章
    爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容
    爬取伯乐在线文章(一)
    爬虫去重策略
  • 原文地址:https://www.cnblogs.com/taiguyiba/p/7258363.html
Copyright © 2011-2022 走看看