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);
    }
  • 相关阅读:
    删除数据库的数据后让id从1开始算
    通过数据库绑定的dropdownlist,如何让其第一条默认显示"--请选择--"
    winform 验证用户正确后打开新窗口时关闭登陆窗口
    winform FormBordStyle=none 及 wpf FormBordStyle=none 的鼠标点击移动问题
    [AngularJS] AngularJS系列(3) 中级篇之表单验证
    linux开启mysql远程登录
    linux下JDK,tomcat的安装与环境变量配置
    linux下mysql连接jar包的位置在哪里?
    linux下mysql忘记root密码的解决方案
    RedHat下MySQL 5.6 安装、维护
  • 原文地址:https://www.cnblogs.com/taiguyiba/p/7258363.html
Copyright © 2011-2022 走看看