Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: C12832 MMA7660 mbed-rtos mbed
Fork of AUP_Lab6_Music by
Revision 3:640558c1c0d3, committed 2015-07-08
- Comitter:
- BrentLei
- Date:
- Wed Jul 08 00:09:57 2015 +0000
- Parent:
- 2:09ee85ab1717
- Child:
- 4:dbce53c4e44d
- 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 |
--- /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
--- 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);
}
