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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM