AUP_Lab6_Music

Dependencies:   C12832 MMA7660 mbed

Fork of AUP_Lab5_MMA7660 by Lei Lei

Files at this revision

API Documentation at this revision

Comitter:
BrentLei
Date:
Wed Jul 08 00:09:57 2015 +0000
Parent:
2:09ee85ab1717
Commit message:
test

Changed in this revision

SongPlayer.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 09ee85ab1717 -r 640558c1c0d3 SongPlayer.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SongPlayer.h	Wed Jul 08 00:09:57 2015 +0000
@@ -0,0 +1,41 @@
+#include "mbed.h"
+// new class to play a note on Speaker based on PwmOut class
+class SongPlayer
+{
+public:
+    SongPlayer(PinName pin) : _pin(pin) {
+// _pin(pin) means pass pin to the constructor
+    }
+// class method to play a note based on PwmOut class
+    void PlaySong(float frequency[], float duration[], float volume=1.0) {
+        vol = volume;
+        notecount = 0;
+        _pin.period(1.0/frequency[notecount]);
+        _pin = volume/2.0;
+        noteduration.attach(this,&SongPlayer::nextnote, duration[notecount]);
+        // setup timer to interrupt for next note to play
+        frequencyptr = frequency;
+        durationptr = duration;
+        //returns after first note starts to play
+    }
+    void nextnote();
+private:
+    Timeout noteduration;
+    PwmOut _pin;
+    int notecount;
+    float vol;
+    float * frequencyptr;
+    float * durationptr;
+};
+//Interrupt Routine to play next note
+void SongPlayer::nextnote()
+{
+    _pin = 0.0;
+    notecount++; //setup next note in song
+    if (durationptr[notecount]!=0.0) {
+        _pin.period(1.0/frequencyptr[notecount]);
+        noteduration.attach(this,&SongPlayer::nextnote, durationptr[notecount]);
+        _pin = vol/2.0;
+    } else
+        _pin = 0.0; //turn off on last note
+}
\ No newline at end of file
diff -r 09ee85ab1717 -r 640558c1c0d3 main.cpp
--- a/main.cpp	Wed Jul 08 00:05:05 2015 +0000
+++ b/main.cpp	Wed Jul 08 00:09:57 2015 +0000
@@ -1,17 +1,27 @@
 #include "mbed.h"
 #include "C12832.h"
+#include "MMA7660.h"
 
-// 添加MMA7660库文件
-#include "MMA7660.h"
+// 添加旋律播放相关文件
+#include "SongPlayer.h"
+
+// 旋律数据
+float note[18]= {1568.0,1396.9,1244.5,1244.5,1396.9,1568.0,1568.0,1568.0,1396.9,
+                 1244.5,1396.9,1568.0,1396.9,1244.5,1174.7,1244.5,1244.5, 0.0
+                };
+float duration[18]= {0.48,0.24,0.72,0.48,0.24,0.48,0.24,0.24,0.24,
+                     0.24,0.24,0.24,0.24,0.48,0.24,0.48,0.48, 0.0
+                    };
 
 PwmOut led(D5);
 DigitalIn button_up(A2);
 DigitalIn button_center(D4);
 DigitalIn button_down(A3);
 C12832 lcd(D11, D13, D12, D7, D10);
+MMA7660 MMA(D14, D15);
 
-// 初始化MMA7660
-MMA7660 MMA(D14, D15);
+// 初始化D6引脚作为PWM用于驱动扬声器
+SongPlayer mySpeaker(D6);
 
 double brightness = 1.0;
 double brightness_inc = 0.1;
@@ -21,7 +31,10 @@
     int bt_flag = 0;
     lcd.cls();
     led.write(brightness);
-
+    
+    // 播放旋律
+    mySpeaker.PlaySong(note,duration,0.05);
+    
     while (1) {
         bt_flag = 1;
         if(button_up==1)
@@ -40,8 +53,6 @@
         }
         lcd.locate(0, 0);
         lcd.printf("Brightness = %.1f\r\n", 1.0 - brightness);
-        
-        // 显示加速度计的测量结果
         lcd.printf("x=%.2f y=%.2f z=%.2f", MMA.x(), MMA.y(), MMA.z());
         wait(0.2);
     }