zoukankan      html  css  js  c++  java
  • STM32使用无源蜂鸣器演奏歌曲

    上一次使用了有源蜂鸣器,只能发出固定的”滴滴“声,当然不能满足于此呀。使用无源蜂鸣器,只要输出不同频率的PWM波,即可发出不同的音符。

    不同的音符组合起来就是一个曲子了。

    改变PWM的音调,可以输出Do re mi fa so la si do这样的7个音符,还可以输出不同音调的Do re mi fa so la si do。

    在实例程序里面,我定义了低中高三个音阶。音符的频率则是mbed提供的。已经宏定义好了。

    只要改变PWM的输出周期,即可发出不同的音调(频率是周期的倒数)。

    为了方便起见,写了一个音阶类(Pitch),虚基类。里面有一个perform函数,参数是音符和持续时间。例如要发出Do这个声音,持续0.5s,只要perform(1,0.5)就好。

    还有一个Stop函数,停止响声0.5s则stop(0.5),无参数则直接停止。后面的Low、Mid、High类则是派生类,实现了Pitch的虚函数。

    程序里面包括:

    1、发出低中高三个声调的Do re mi fa so la si do音。

    2、中音版的小星星。

    3、低音版的小星星。

    #include "mbed.h"
    
    #define NOTE_B0  31
    
    #define NOTE_C1  33
    
    #define NOTE_CS1 35
    
    #define NOTE_D1  37
    
    #define NOTE_DS1 39
    
    #define NOTE_E1  41
    
    #define NOTE_F1  44
    
    #define NOTE_FS1 46
    
    #define NOTE_G1  49
    
    #define NOTE_GS1 52
    
    #define NOTE_A1  55
    
    #define NOTE_AS1 58
    
    #define NOTE_B1  62
    
    #define NOTE_C2  65
    
    #define NOTE_CS2 69
    
    #define NOTE_D2  73
    
    #define NOTE_DS2 78
    
    #define NOTE_E2  82
    
    #define NOTE_F2  87
    
    #define NOTE_FS2 93
    
    #define NOTE_G2  98
    
    #define NOTE_GS2 104
    
    #define NOTE_A2  110
    
    #define NOTE_AS2 117
    
    #define NOTE_B2  123
    
    #define NOTE_C3  131
    
    #define NOTE_CS3 139
    
    #define NOTE_D3  147
    
    #define NOTE_DS3 156
    
    #define NOTE_E3  165
    
    #define NOTE_F3  175
    
    #define NOTE_FS3 185
    
    #define NOTE_G3  196
    
    #define NOTE_GS3 208
    
    #define NOTE_A3  220
    
    #define NOTE_AS3 233
    
    #define NOTE_B3  247
    
    #define NOTE_C4  262
    
    #define NOTE_CS4 277
    
    #define NOTE_D4  294
    
    #define NOTE_DS4 311
    
    #define NOTE_E4  330
    
    #define NOTE_F4  349
    
    #define NOTE_FS4 370
    
    #define NOTE_G4  392
    
    #define NOTE_GS4 415
    
    #define NOTE_A4  440
    
    #define NOTE_AS4 466
    
    #define NOTE_B4  494
    
    #define NOTE_C5  523
    
    #define NOTE_CS5 554
    
    #define NOTE_D5  587
    
    #define NOTE_DS5 622
    
    #define NOTE_E5  659
    
    #define NOTE_F5  698
    
    #define NOTE_FS5 740
    
    #define NOTE_G5  784
    
    #define NOTE_GS5 831
    
    #define NOTE_A5  880
    
    #define NOTE_AS5 932
    
    #define NOTE_B5  988
    
    #define NOTE_C6  1047
    
    #define NOTE_CS6 1109
    
    #define NOTE_D6  1175
    
    #define NOTE_DS6 1245
    
    #define NOTE_E6  1319
    
    #define NOTE_F6  1397
    
    #define NOTE_FS6 1480
    
    #define NOTE_G6  1568
    
    #define NOTE_GS6 1661
    
    #define NOTE_A6  1760
    
    #define NOTE_AS6 1865
    
    #define NOTE_B6  1976
    
    #define NOTE_C7  2093
    
    #define NOTE_CS7 2217
    
    #define NOTE_D7  2349
    
    #define NOTE_DS7 2489
    
    #define NOTE_E7  2637
    
    #define NOTE_F7  2794
    
    #define NOTE_FS7 2960
    
    #define NOTE_G7  3136
    
    #define NOTE_GS7 3322
    
    #define NOTE_A7  3520
    
    #define NOTE_AS7 3729
    
    #define NOTE_B7  3951
    
    #define NOTE_C8  4186
    
    #define NOTE_CS8 4435
    
    #define NOTE_D8  4699
    
    #define NOTE_DS8 4978
    
    //7个音符组成了美妙的音乐
    
    //低   Do re mi fa so la si do
    int melody[] = {  NOTE_C4, NOTE_D4,NOTE_E4, NOTE_F4, NOTE_G4,NOTE_A4,NOTE_B4,NOTE_C5};
    
    //中   Do re mi fa so la si do
    int melody2[] = {  NOTE_C5, NOTE_D5,NOTE_E5, NOTE_F5, NOTE_G5,NOTE_A5,NOTE_B5,NOTE_C6};
    
    //
    int melody3[] = {  NOTE_C6, NOTE_D6,NOTE_E6, NOTE_F6, NOTE_G6,NOTE_A6,NOTE_B6,NOTE_C7};
    
    //PWM输出口
    PwmOut m(PB_13);
    
    //音调类
    class Pitch{
        
        
        public:
        
          virtual void perfrom(int,double)=0;
          
          void stop(double time = 0){
              
              if(time==0)
                m = 1;
              else{
                  
                m = 1;
                wait(time);  
                  
                  
                  }//end else
              
              }//end stop
       
    };
    
    class Low:public Pitch{
        
        public:
        void perfrom(int index,double time){
            
                
                m.period_us(1000000/melody[index-1]);
    
                m.write(0.5);
                
                wait(time);
        
            }
        
        
        
    };
    
    class Mid:public Pitch{
        
        public:
        void perfrom(int index,double time){
            
                
                m.period_us(1000000/melody2[index-1]);
    
                m.write(0.5);
                
                wait(time);
        
            }
        
        
        
    };
    
    class Hig:public Pitch{
        
        public:
        void perfrom(int index ,double time){
            
                
                m.period_us(1000000/melody3[index-1]);
    
                m.write(0.5);
                
                wait(time);
        
            }
        
        
        
    };
    
    
    
    int main()
    
    {
        /*试音
          for (int thisNote = 0; thisNote < 8; thisNote++) {
    
            m.period_us(1000000/melody[thisNote]);
    
            m.write(0.5);
    
            wait(0.5);
    
          }
          
          for (int thisNote = 0; thisNote < 8; thisNote++) {
    
            m.period_us(1000000/melody2[thisNote]);
    
            m.write(0.5);
    
            wait(0.5);
    
          }
          
          for (int thisNote = 0; thisNote < 8; thisNote++) {
    
            m.period_us(1000000/melody3[thisNote]);
    
            m.write(0.5);
    
            wait(0.5);
    
          }
          
        m = 1;
        */
        
        
        /*中音版
        Mid mid;
        
        //11 55 66 5
        mid.perfrom(1,0.5);
        mid.perfrom(1,0.5);
        mid.perfrom(5,0.5);
        mid.perfrom(5,0.5);
        mid.perfrom(6,0.5);
        mid.perfrom(6,0.5);
        mid.perfrom(5,0.8);
        mid.stop(0.2);
        
        
        //44 33 22 1
        mid.perfrom(4,0.5);
        mid.perfrom(4,0.5);
        mid.perfrom(3,0.5);
        mid.perfrom(3,0.5);
        mid.perfrom(2,0.5);
        mid.perfrom(2,0.5);
        mid.perfrom(1,0.5);
        mid.stop(0.2);
        
        //55 44 33 2
        mid.perfrom(5,0.5);
        mid.perfrom(5,0.5);
        mid.perfrom(4,0.5);
        mid.perfrom(4,0.5);
        mid.perfrom(3,0.5);
        mid.perfrom(3,0.5);
        mid.perfrom(2,0.5);    
        mid.stop(0.2);
            
        //55 44 33 2    
        mid.perfrom(5,0.5);
        mid.perfrom(5,0.5);
        mid.perfrom(4,0.5);
        mid.perfrom(4,0.5);
        mid.perfrom(3,0.5);
        mid.perfrom(3,0.5);
        mid.perfrom(2,0.5); 
        mid.stop(0.2);
        
        //11 55 66 5
        mid.perfrom(1,0.5);
        mid.perfrom(1,0.5);
        mid.perfrom(5,0.5);
        mid.perfrom(5,0.5);
        mid.perfrom(6,0.5);
        mid.perfrom(6,0.5);
        mid.perfrom(5,0.5);
        mid.stop(0.2);
        
        //44 33 22 1
        mid.perfrom(4,0.5);
        mid.perfrom(4,0.5);
        mid.perfrom(3,0.5);
        mid.perfrom(3,0.5);
        mid.perfrom(2,0.5);
        mid.perfrom(2,0.5);
        mid.perfrom(1,0.5);
        
        
        mid.stop();
        */
        
        
        //低音版
        
        Low low;
        
            
        //11 55 66 5
        low.perfrom(1,0.5);
        low.perfrom(1,0.5);
        low.perfrom(5,0.5);
        low.perfrom(5,0.5);
        low.perfrom(6,0.5);
        low.perfrom(6,0.5);
        low.perfrom(5,0.8);
        low.stop(0.2);
        
        
        //44 33 22 1
        low.perfrom(4,0.5);
        low.perfrom(4,0.5);
        low.perfrom(3,0.5);
        low.perfrom(3,0.5);
        low.perfrom(2,0.5);
        low.perfrom(2,0.5);
        low.perfrom(1,0.5);
        low.stop(0.2);
        
        //55 44 33 2
        low.perfrom(5,0.5);
        low.perfrom(5,0.5);
        low.perfrom(4,0.5);
        low.perfrom(4,0.5);
        low.perfrom(3,0.5);
        low.perfrom(3,0.5);
        low.perfrom(2,0.5);    
        low.stop(0.2);
            
        //55 44 33 2    
        low.perfrom(5,0.5);
        low.perfrom(5,0.5);
        low.perfrom(4,0.5);
        low.perfrom(4,0.5);
        low.perfrom(3,0.5);
        low.perfrom(3,0.5);
        low.perfrom(2,0.5); 
        low.stop(0.2);
        
        //11 55 66 5
        low.perfrom(1,0.5);
        low.perfrom(1,0.5);
        low.perfrom(5,0.5);
        low.perfrom(5,0.5);
        low.perfrom(6,0.5);
        low.perfrom(6,0.5);
        low.perfrom(5,0.5);
        low.stop(0.2);
        
        //44 33 22 1
        low.perfrom(4,0.5);
        low.perfrom(4,0.5);
        low.perfrom(3,0.5);
        low.perfrom(3,0.5);
        low.perfrom(2,0.5);
        low.perfrom(2,0.5);
        low.perfrom(1,0.5);
        
        
        low.stop();
        
    }

    蜂鸣器比较刺耳其实,听久了还是很难受。

    在代码里面是不能调节音量的,要调低音量,加个电阻就好。最大的音量是无电阻+高电压。

    没法录音,所以还是上图。

     效果可以上秒拍听一下:http://video.weibo.com/show?fid=1034:aee9c2288407e28eca7eb89d5ecc8a1d

  • 相关阅读:
    JSP具体条款——response对象
    智课雅思词汇---三、aud和auto和bene是什么意思
    如何实现无刷新图片上传
    智课雅思词汇---二、词根acu和acr
    FormData是什么
    ajax如何上传文件(整理)
    js插件---评分插件Rating如何使用
    js插件---Amaze UI dialog如何使用
    js插件---layer.js使用体验是怎样
    算法答疑---06:月度开销
  • 原文地址:https://www.cnblogs.com/wzben/p/5079303.html
Copyright © 2011-2022 走看看