[应用相关] STM32使用无源蜂鸣器演奏歌曲

[复制链接]
3866|3
 楼主| 天灵灵地灵灵 发表于 2017-1-14 21:43 | 显示全部楼层 |阅读模式
使用了有源蜂鸣器,只能发出固定的”滴滴“声,当然不能满足于此呀。使用无源蜂鸣器,只要输出不同频率的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、低音版的小星星。

 楼主| 天灵灵地灵灵 发表于 2017-1-14 21:44 | 显示全部楼层
  1. #include "mbed.h"

  2. #define NOTE_B0  31

  3. #define NOTE_C1  33

  4. #define NOTE_CS1 35

  5. #define NOTE_D1  37

  6. #define NOTE_DS1 39

  7. #define NOTE_E1  41

  8. #define NOTE_F1  44

  9. #define NOTE_FS1 46

  10. #define NOTE_G1  49

  11. #define NOTE_GS1 52

  12. #define NOTE_A1  55

  13. #define NOTE_AS1 58

  14. #define NOTE_B1  62

  15. #define NOTE_C2  65

  16. #define NOTE_CS2 69

  17. #define NOTE_D2  73

  18. #define NOTE_DS2 78

  19. #define NOTE_E2  82

  20. #define NOTE_F2  87

  21. #define NOTE_FS2 93

  22. #define NOTE_G2  98

  23. #define NOTE_GS2 104

  24. #define NOTE_A2  110

  25. #define NOTE_AS2 117

  26. #define NOTE_B2  123

  27. #define NOTE_C3  131

  28. #define NOTE_CS3 139

  29. #define NOTE_D3  147

  30. #define NOTE_DS3 156

  31. #define NOTE_E3  165

  32. #define NOTE_F3  175

  33. #define NOTE_FS3 185

  34. #define NOTE_G3  196

  35. #define NOTE_GS3 208

  36. #define NOTE_A3  220

  37. #define NOTE_AS3 233

  38. #define NOTE_B3  247

  39. #define NOTE_C4  262

  40. #define NOTE_CS4 277

  41. #define NOTE_D4  294

  42. #define NOTE_DS4 311

  43. #define NOTE_E4  330

  44. #define NOTE_F4  349

  45. #define NOTE_FS4 370

  46. #define NOTE_G4  392

  47. #define NOTE_GS4 415

  48. #define NOTE_A4  440

  49. #define NOTE_AS4 466

  50. #define NOTE_B4  494

  51. #define NOTE_C5  523

  52. #define NOTE_CS5 554

  53. #define NOTE_D5  587

  54. #define NOTE_DS5 622

  55. #define NOTE_E5  659

  56. #define NOTE_F5  698

  57. #define NOTE_FS5 740

  58. #define NOTE_G5  784

  59. #define NOTE_GS5 831

  60. #define NOTE_A5  880

  61. #define NOTE_AS5 932

  62. #define NOTE_B5  988

  63. #define NOTE_C6  1047

  64. #define NOTE_CS6 1109

  65. #define NOTE_D6  1175

  66. #define NOTE_DS6 1245

  67. #define NOTE_E6  1319

  68. #define NOTE_F6  1397

  69. #define NOTE_FS6 1480

  70. #define NOTE_G6  1568

  71. #define NOTE_GS6 1661

  72. #define NOTE_A6  1760

  73. #define NOTE_AS6 1865

  74. #define NOTE_B6  1976

  75. #define NOTE_C7  2093

  76. #define NOTE_CS7 2217

  77. #define NOTE_D7  2349

  78. #define NOTE_DS7 2489

  79. #define NOTE_E7  2637

  80. #define NOTE_F7  2794

  81. #define NOTE_FS7 2960

  82. #define NOTE_G7  3136

  83. #define NOTE_GS7 3322

  84. #define NOTE_A7  3520

  85. #define NOTE_AS7 3729

  86. #define NOTE_B7  3951

  87. #define NOTE_C8  4186

  88. #define NOTE_CS8 4435

  89. #define NOTE_D8  4699

  90. #define NOTE_DS8 4978

  91. //7个音符组成了美妙的音乐

  92. //低   Do re mi fa so la si do
  93. int melody[] = {  NOTE_C4, NOTE_D4,NOTE_E4, NOTE_F4, NOTE_G4,NOTE_A4,NOTE_B4,NOTE_C5};

  94. //中   Do re mi fa so la si do
  95. int melody2[] = {  NOTE_C5, NOTE_D5,NOTE_E5, NOTE_F5, NOTE_G5,NOTE_A5,NOTE_B5,NOTE_C6};

  96. //高
  97. int melody3[] = {  NOTE_C6, NOTE_D6,NOTE_E6, NOTE_F6, NOTE_G6,NOTE_A6,NOTE_B6,NOTE_C7};

  98. //PWM输出口
  99. PwmOut m(PB_13);

  100. //音调类
  101. class Pitch{
  102.    
  103.    
  104.     public:
  105.    
  106.       virtual void perfrom(int,double)=0;
  107.       
  108.       void stop(double time = 0){
  109.          
  110.           if(time==0)
  111.             m = 1;
  112.           else{
  113.               
  114.             m = 1;
  115.             wait(time);  
  116.               
  117.               
  118.               }//end else
  119.          
  120.           }//end stop
  121.    
  122. };

  123. class Low:public Pitch{
  124.    
  125.     public:
  126.     void perfrom(int index,double time){
  127.         
  128.             
  129.             m.period_us(1000000/melody[index-1]);

  130.             m.write(0.5);
  131.             
  132.             wait(time);
  133.    
  134.         }
  135.    
  136.    
  137.    
  138. };

  139. class Mid:public Pitch{
  140.    
  141.     public:
  142.     void perfrom(int index,double time){
  143.         
  144.             
  145.             m.period_us(1000000/melody2[index-1]);

  146.             m.write(0.5);
  147.             
  148.             wait(time);
  149.    
  150.         }
  151.    
  152.    
  153.    
  154. };

  155. class Hig:public Pitch{
  156.    
  157.     public:
  158.     void perfrom(int index ,double time){
  159.         
  160.             
  161.             m.period_us(1000000/melody3[index-1]);

  162.             m.write(0.5);
  163.             
  164.             wait(time);
  165.    
  166.         }
  167.    
  168.    
  169.    
  170. };



  171. int main()

  172. {
  173.     /*试音
  174.       for (int thisNote = 0; thisNote < 8; thisNote++) {

  175.         m.period_us(1000000/melody[thisNote]);

  176.         m.write(0.5);

  177.         wait(0.5);

  178.       }
  179.       
  180.       for (int thisNote = 0; thisNote < 8; thisNote++) {

  181.         m.period_us(1000000/melody2[thisNote]);

  182.         m.write(0.5);

  183.         wait(0.5);

  184.       }
  185.       
  186.       for (int thisNote = 0; thisNote < 8; thisNote++) {

  187.         m.period_us(1000000/melody3[thisNote]);

  188.         m.write(0.5);

  189.         wait(0.5);

  190.       }
  191.       
  192.     m = 1;
  193.     */
  194.    
  195.    
  196.     /*中音版
  197.     Mid mid;
  198.    
  199.     //11 55 66 5
  200.     mid.perfrom(1,0.5);
  201.     mid.perfrom(1,0.5);
  202.     mid.perfrom(5,0.5);
  203.     mid.perfrom(5,0.5);
  204.     mid.perfrom(6,0.5);
  205.     mid.perfrom(6,0.5);
  206.     mid.perfrom(5,0.8);
  207.     mid.stop(0.2);
  208.    
  209.    
  210.     //44 33 22 1
  211.     mid.perfrom(4,0.5);
  212.     mid.perfrom(4,0.5);
  213.     mid.perfrom(3,0.5);
  214.     mid.perfrom(3,0.5);
  215.     mid.perfrom(2,0.5);
  216.     mid.perfrom(2,0.5);
  217.     mid.perfrom(1,0.5);
  218.     mid.stop(0.2);
  219.    
  220.     //55 44 33 2
  221.     mid.perfrom(5,0.5);
  222.     mid.perfrom(5,0.5);
  223.     mid.perfrom(4,0.5);
  224.     mid.perfrom(4,0.5);
  225.     mid.perfrom(3,0.5);
  226.     mid.perfrom(3,0.5);
  227.     mid.perfrom(2,0.5);   
  228.     mid.stop(0.2);
  229.         
  230.     //55 44 33 2   
  231.     mid.perfrom(5,0.5);
  232.     mid.perfrom(5,0.5);
  233.     mid.perfrom(4,0.5);
  234.     mid.perfrom(4,0.5);
  235.     mid.perfrom(3,0.5);
  236.     mid.perfrom(3,0.5);
  237.     mid.perfrom(2,0.5);
  238.     mid.stop(0.2);
  239.    
  240.     //11 55 66 5
  241.     mid.perfrom(1,0.5);
  242.     mid.perfrom(1,0.5);
  243.     mid.perfrom(5,0.5);
  244.     mid.perfrom(5,0.5);
  245.     mid.perfrom(6,0.5);
  246.     mid.perfrom(6,0.5);
  247.     mid.perfrom(5,0.5);
  248.     mid.stop(0.2);
  249.    
  250.     //44 33 22 1
  251.     mid.perfrom(4,0.5);
  252.     mid.perfrom(4,0.5);
  253.     mid.perfrom(3,0.5);
  254.     mid.perfrom(3,0.5);
  255.     mid.perfrom(2,0.5);
  256.     mid.perfrom(2,0.5);
  257.     mid.perfrom(1,0.5);
  258.    
  259.    
  260.     mid.stop();
  261.     */
  262.    
  263.    
  264.     //低音版
  265.    
  266.     Low low;
  267.    
  268.         
  269.     //11 55 66 5
  270.     low.perfrom(1,0.5);
  271.     low.perfrom(1,0.5);
  272.     low.perfrom(5,0.5);
  273.     low.perfrom(5,0.5);
  274.     low.perfrom(6,0.5);
  275.     low.perfrom(6,0.5);
  276.     low.perfrom(5,0.8);
  277.     low.stop(0.2);
  278.    
  279.    
  280.     //44 33 22 1
  281.     low.perfrom(4,0.5);
  282.     low.perfrom(4,0.5);
  283.     low.perfrom(3,0.5);
  284.     low.perfrom(3,0.5);
  285.     low.perfrom(2,0.5);
  286.     low.perfrom(2,0.5);
  287.     low.perfrom(1,0.5);
  288.     low.stop(0.2);
  289.    
  290.     //55 44 33 2
  291.     low.perfrom(5,0.5);
  292.     low.perfrom(5,0.5);
  293.     low.perfrom(4,0.5);
  294.     low.perfrom(4,0.5);
  295.     low.perfrom(3,0.5);
  296.     low.perfrom(3,0.5);
  297.     low.perfrom(2,0.5);   
  298.     low.stop(0.2);
  299.         
  300.     //55 44 33 2   
  301.     low.perfrom(5,0.5);
  302.     low.perfrom(5,0.5);
  303.     low.perfrom(4,0.5);
  304.     low.perfrom(4,0.5);
  305.     low.perfrom(3,0.5);
  306.     low.perfrom(3,0.5);
  307.     low.perfrom(2,0.5);
  308.     low.stop(0.2);
  309.    
  310.     //11 55 66 5
  311.     low.perfrom(1,0.5);
  312.     low.perfrom(1,0.5);
  313.     low.perfrom(5,0.5);
  314.     low.perfrom(5,0.5);
  315.     low.perfrom(6,0.5);
  316.     low.perfrom(6,0.5);
  317.     low.perfrom(5,0.5);
  318.     low.stop(0.2);
  319.    
  320.     //44 33 22 1
  321.     low.perfrom(4,0.5);
  322.     low.perfrom(4,0.5);
  323.     low.perfrom(3,0.5);
  324.     low.perfrom(3,0.5);
  325.     low.perfrom(2,0.5);
  326.     low.perfrom(2,0.5);
  327.     low.perfrom(1,0.5);
  328.    
  329.    
  330.     low.stop();
  331.    
  332. }
 楼主| 天灵灵地灵灵 发表于 2017-1-14 21:45 | 显示全部楼层
蜂鸣器比较刺耳其实,听久了还是很难受。

在代码里面是不能调节音量的,要调低音量,加个电阻就好。最大的音量是无电阻+高电压。
 楼主| 天灵灵地灵灵 发表于 2017-1-14 21:46 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

3475

帖子

13

粉丝
快速回复 在线客服 返回列表 返回顶部