代码:
1 #define NOTE_D0 -1 2 #define NOTE_D1 294 3 #define NOTE_D2 330 4 #define NOTE_D3 350 5 #define NOTE_D4 393 6 #define NOTE_D5 441 7 #define NOTE_D6 495 8 #define NOTE_D7 556 9 10 #define NOTE_DL1 147 11 #define NOTE_DL2 165 12 #define NOTE_DL3 175 13 #define NOTE_DL4 196 14 #define NOTE_DL5 221 15 #define NOTE_DL6 248 16 #define NOTE_DL7 278 17 18 #define NOTE_DH1 589 19 #define NOTE_DH2 661 20 #define NOTE_DH3 700 21 #define NOTE_DH4 786 22 #define NOTE_DH5 882 23 #define NOTE_DH6 990 24 #define NOTE_DH7 112 25 //以上部分是定义是把每个音符和频率值对应起来,其实不用打这么多,但是都打上了,后面可以随意编写 26 27 #define WHOLE 1 28 #define HALF 0.5 29 #define QUARTER 0.25 30 #define EIGHTH 0.25 31 #define SIXTEENTH 0.625 32 //这部分是用英文对应了拍子,这样后面也比较好看 33 34 int tune[] = { 35 NOTE_D0,NOTE_D0,NOTE_D0,NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3, 36 NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D3,NOTE_D4,NOTE_D3,NOTE_D4,NOTE_DH1, 37 NOTE_D3,NOTE_D3,NOTE_D0,NOTE_DH1,NOTE_DH1,NOTE_DH1,NOTE_D7,NOTE_D4,NOTE_D4,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D0,NOTE_D6,NOTE_D7, 38 NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1, 39 NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D2,NOTE_D3,NOTE_D4,NOTE_DH1,NOTE_D7,NOTE_D7,NOTE_DH1,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH3,NOTE_DH1,NOTE_DH1,NOTE_DH1, 40 NOTE_DH1,NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D7,NOTE_D5,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_DH1,NOTE_DH2,NOTE_DH3,NOTE_DH2,NOTE_DH3,NOTE_DH5, 41 NOTE_DH2,NOTE_DH2,NOTE_DH2,NOTE_D5,NOTE_D5,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3, 42 NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH2,NOTE_DH2,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_DH4,NOTE_DH3,NOTE_DH2,NOTE_DH1, 43 NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5,NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,NOTE_DH1, 44 NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH5,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5, 45 NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,NOTE_DH1,NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D7 46 };//这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数 47 48 float duration[]= { 49 1,1,1,0.5,0.5, 1+0.5,0.5,1,1, 1,1,1,0.5,0.5, 50 1+0.5,0.5,1,1, 1,1,1,1, 1+0.5,0.5,1,1, 51 1,1,0.5,0.5,0.5,0.5, 1+0.5,0.5,1,1, 1,1,1,0.5,0.5, 52 1+0.5,0.5,1,1, 1,1,1,0.5,0.5, 1+0.5,0.5,1,1, 53 1,1,1,0.5,0.5, 1,0.5,0.25,0.25,0.25,0.5, 0.5,0.5,0.5,0.25,0.5,1, 54 0.5,0.5,0.5,0.5,1,1, 1,1,1,0.5,0.5, 1+0.5,0.5,1,1, 55 1,1,1,0.5,0.5, 1.5,0.5,1,1, 1,1,1,1, 56 0.5,0.5,1,1,0.5,0.5, 1.5,0.25,0.5,1, 1,1,1,1, 57 1,1,1,1, 1,1,1,1, 0.5,0.5,1,1,0.5,0.5, 58 1,0.5,0.5,1,1, 1,1,1,1, 1,1,1,1, 59 0.5,0.5,1,1,0.5,0.5, 1,0.5,0.25,0.5,1, 1,1,1,0.5,0.5 60 };//这部分是整首曲子的节拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应么) 61 62 int length;//这里定义一个变量,后面用来表示共有多少个音符 63 int tonePin=5;//蜂鸣器的pin 64 65 void setup() 66 { 67 pinMode(tonePin,OUTPUT);//设置蜂鸣器的pin为输出模式 68 length = sizeof(tune)/sizeof(tune[0]);//这里用了一个sizeof函数, 可以查出tone序列里有多少个音符 69 } 70 71 void loop() 72 { 73 74 for(int x=0;x<length;x++)//循环音符的次数 75 { 76 tone(tonePin,tune[x]);//此函数依次播放tune序列里的数组,即每个音符 77 delay(400*duration[x]);//每个音符持续的时间,即节拍duration,是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧 78 noTone(tonePin);//停止当前音符,进入下一音符 79 } 80 delay(5000);//等待5秒后,循环重新开始 81 }