当前位置:   article > 正文

【51单片机】蜂鸣器演奏音乐《机里太美》-附仿真文件_蜂鸣器演奏歌曲

蜂鸣器演奏歌曲

目录

 一、基本乐理知识

1、键盘与音符对照

 2、音符时值

 3、索引与频率对照表

 二、乐谱

 三、代码

1、main.c

2、Timer0.c

3、Timer0.h

4、Delay.c

5、Delay.h


闲的没事干,我试着用蜂鸣器演奏《机里太美》,与想象中的有点不一样,莫得灵魂【捂脸】。 

 一、基本乐理知识

1、键盘与音符对照

 2、音符时值

 3、索引与频率对照表

 二、乐谱

 三、代码

只演奏精华部分

1、main.c
  1. #include <REGX52.H>
  2. #include "Delay.h"
  3. #include "Timer0.h"
  4. typedef unsigned int u16;
  5. typedef unsigned char u8;
  6. #define SPEED 500 //播放速度,值为四分音符的时长(ms)
  7. sbit Buzzer = P2^5; //蜂鸣器端口定义
  8. //音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#
  9. #define P 0
  10. #define L1 1
  11. #define L1_ 2
  12. #define L2 3
  13. #define L2_ 4
  14. #define L3 5
  15. #define L4 6
  16. #define L4_ 7
  17. #define L5 8
  18. #define L5_ 9
  19. #define L6 10
  20. #define L6_ 11
  21. #define L7 12
  22. #define M1 13
  23. #define M1_ 14
  24. #define M2 15
  25. #define M2_ 16
  26. #define M3 17
  27. #define M4 18
  28. #define M4_ 19
  29. #define M5 20
  30. #define M5_ 21
  31. #define M6 22
  32. #define M6_ 23
  33. #define M7 24
  34. #define H1 25
  35. #define H1_ 26
  36. #define H2 27
  37. #define H2_ 28
  38. #define H3 29
  39. #define H4 30
  40. #define H4_ 31
  41. #define H5 32
  42. #define H5_ 33
  43. #define H6 34
  44. #define H6_ 35
  45. #define H7 36
  46. //索引与频率对照表
  47. u16 FreqTable[] = {0, 63628,63731,63835,63928,64021,64103,64185,64260,64331,
  48. 64400,64463,64524,64580,64633,64684,64732,64777,64820,
  49. 64860,64898,64934,64968,65000,65030,65058,65085,65110,
  50. 65134,65157,65178,65191,65217,65235,65252,65268,65283};
  51. //乐谱
  52. u8 code Music[] = {
  53. //音符, 时值,
  54. P, 2,
  55. L6, 1,
  56. L6, 1,
  57. M3, 2,
  58. M3, 2,
  59. L6, 4,
  60. P, 4,
  61. P, 4,
  62. P, 2,
  63. L6, 1,
  64. L6, 1 + 2,
  65. P, 2,
  66. P, 4,
  67. P, 2,
  68. L6, 1,
  69. L6, 1,
  70. M3, 2,
  71. M3, 2,
  72. L6, 4,
  73. P, 4,
  74. P, 4,
  75. P, 2,
  76. L6, 1 + 2,
  77. P, 2,
  78. P, 2,
  79. L6, 1,
  80. L6, 1,
  81. L6, 2,
  82. L6, 1,
  83. L6, 1,
  84. M3, 2,
  85. M3, 2,
  86. L6, 4,
  87. P, 4,
  88. P, 4,
  89. P, 2,
  90. L6, 1,
  91. L6, 1 + 2,
  92. P, 2,
  93. P, 4,
  94. P, 2,
  95. L6, 1,
  96. L6, 1,
  97. M3, 2,
  98. M3, 2,
  99. L6, 4,
  100. P, 4,
  101. P, 4,
  102. P, 2,
  103. L6, 1,
  104. L6, 1,
  105. 0xFF //终止标志
  106. };
  107. unsigned char FreqSelect,MusicSelect;
  108. void main()
  109. {
  110. Timer0Init();
  111. while(1)
  112. {
  113. if(Music[MusicSelect]!=0xFF) //如果不是停止标志位
  114. {
  115. FreqSelect=Music[MusicSelect]; //选择音符对应的频率
  116. MusicSelect++;
  117. Delay(SPEED/4*Music[MusicSelect]);//选择音符对应的时值
  118. MusicSelect++;
  119. TR0=0;
  120. Delay(5); //音符间短暂停顿,相当于抬手
  121. TR0=1;
  122. }
  123. else //如果是停止标志位
  124. {
  125. TR0=0;
  126. Delay(50);
  127. TR0 = 1;
  128. MusicSelect = 0; //停顿后循环播放
  129. }
  130. }
  131. }
  132. void Timer0_Routine() interrupt 1
  133. {
  134. if(FreqTable[FreqSelect]) //如果不是休止符
  135. {
  136. /*取对应频率值的重装载值到定时器*/
  137. TL0 = FreqTable[FreqSelect]%256; //设置定时初值 //第二次中断实现
  138. TH0 = FreqTable[FreqSelect]/256; //设置定时初值//
  139. Buzzer=!Buzzer; //翻转蜂鸣器IO口
  140. }
  141. }
2、Timer0.c
  1. #include <REGX52.H>
  2. /**
  3. * @brief 定时器0初始化,1毫秒@12.000MHz
  4. * @param 无
  5. * @retval 无
  6. */
  7. void Timer0Init(void)
  8. {
  9. TMOD &= 0xF0; //设置定时器模式
  10. TMOD |= 0x01; //设置定时器模式
  11. TL0 = 0x18; //设置定时初值
  12. TH0 = 0xFC; //设置定时初值
  13. TF0 = 0; //清除TF0标志
  14. TR0 = 1; //定时器0开始计时
  15. ET0 = 1;
  16. EA = 1;
  17. PT0 = 0;
  18. }
3、Timer0.h
  1. #ifndef __TIMER0_H__
  2. #define __TIMER0_H__
  3. void Timer0Init(void);
  4. #endif
4、Delay.c
  1. void Delay(unsigned int xms)
  2. {
  3. unsigned char i, j;
  4. while(xms--)
  5. {
  6. i = 2;
  7. j = 239;
  8. do
  9. {
  10. while (--j);
  11. } while (--i);
  12. }
  13. }
5、Delay.h
  1. #ifndef __DELAY_H__
  2. #define __DELAY_H__
  3. void Delay(unsigned int xms);
  4. #endif

proteus 仿真图

需要自取

链接:https://pan.baidu.com/s/1Hkmg-aNB7FRnZRUVNjMH_Q?pwd=6664 
提取码:6664

此文为个人笔记,而且我对乐理并不算了解,如果有错漏还请各位看官指正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/554276
推荐阅读
相关标签
  

闽ICP备14008679号