小言_互联网的博客

(十)51单片机——利用蜂鸣器播放《孤勇者》(附成果展示)

562人阅读  评论(0)

目录

硬件部分

蜂鸣器介绍

驱动电路 

ULN2003

乐理部分

音符

音符与频率对照

代码部分

运行结果


        随着最近孤勇者成为小朋友们的接头暗号之后,于是产生了利用单片机去播放孤勇者的想法,接下来我们来看看具体的实现以及效果展示吧!

硬件部分

蜂鸣器介绍

        首先我们使用的是51单片机的蜂鸣器来实现的,所以先来介绍一下蜂鸣器吧,如下图所示!

  • 蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号
  • 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器
  • 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
  • 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音

 

        之前在STM32上的那个蜂鸣器是有源蜂鸣器,频率固定,就只能发声,而在我们的51单片机上的这个蜂鸣器是属于无源蜂鸣器,所以需要我们来调整频率,从而来实现发出不同频率的声音。

驱动电路 

        之前的32是使用三极管进行驱动的,起到放大信号的作用(不清楚的可以去32的笔记看看)。而51单片机使用的是集成电路进行驱动的(ULN2003),接下来我们来简单介绍一下吧!

ULN2003

        确实可以简单理解为一个放大电路,因为内部有一个非门,导致给1就有驱动能力(输出0,蜂鸣器才导通,所以才会响),但给0却无驱动能力(高阻态)。

乐理部分

        接下来就到了单片机最难的部分了,乐理部分,这部分我不是特别清楚,如有错误还望指出。

        首先,每8个一组(C~B),也就是哆唻咪发嗦啦西,分为4组,每一组比上一组高8度。黑键与白键相差半个音调,白色与白色相差一个音调。简谱对应相应的音调也在图中有对应关系,就不一一举出了。但是要介绍一下升音符号(#)以及降音符号(b),比如“#1”就是中央C升高半音,就是右上角的黑键。

音符

        音符是用来记录不同长短的音的进行符号。全音符二分音符四分音符八分音符十六分音符是最常见的音符,具体的内容大家可以点击超链接去康康。其中四分音符一般是一个时间基准(500毫秒),后面加一个横线就是二分音符,下面加一个横线就是八分音符,以此类推。

音符与频率对照

计算周期以及重装载值 

周期:12/11.0592/B2*1000000(因为我是11.0592HZ的晶振,所以是这样)

重装载值:65536-D2(65536-周期一半)

如下图所示:

 

代码部分

        接下来就是按照我们计算之后的重装载值来进行编码了,在此过程中,还需要我们去了解音乐的简谱,在此我就给出一份简谱,感兴趣的同学可以自己去找相应的简谱来编写代码。



  
  1. // Buzzer.c
  2. #include <REGX52.H>
  3. #include <INTRINS.H>
  4. //蜂鸣器端口:
  5. sbit Buzzer=P1^ 5;
  6. /**
  7. * @brief 蜂鸣器私有延时函数,延时500us
  8. * @param 无
  9. * @retval 无
  10. */
  11. void Buzzer_Delay500us() //@11.0592MHz
  12. {
  13. unsigned char i;
  14. _nop_();
  15. i = 227;
  16. while (--i);
  17. }
  18. /**
  19. * @brief 蜂鸣器发声
  20. * @param ms 发声的时长,范围:0~32767
  21. * @retval 无
  22. */
  23. void Buzzer_Time(unsigned int ms)
  24. {
  25. unsigned int i;
  26. for(i= 0;i<ms* 2;i++)
  27. {
  28. Buzzer=!Buzzer;
  29. Buzzer_Delay500us();
  30. }
  31. }

  
  1. // main.c
  2. #include <REGX52.H>
  3. #include "Delay.h"
  4. #include "Time0.h"
  5. #include "Buzzer.h"
  6. //蜂鸣器端口:
  7. sbit Buzzer=P1^ 5;
  8. #define SPEED 460
  9. //音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#
  10. #define P 0
  11. #define L1 1
  12. #define L1_ 2
  13. #define L2 3
  14. #define L2_ 4
  15. #define L3 5
  16. #define L4 6
  17. #define L4_ 7
  18. #define L5 8
  19. #define L5_ 9
  20. #define L6 10
  21. #define L6_ 11
  22. #define L7 12
  23. #define M1 13
  24. #define M1_ 14
  25. #define M2 15
  26. #define M2_ 16
  27. #define M3 17
  28. #define M4 18
  29. #define M4_ 19
  30. #define M5 20
  31. #define M5_ 21
  32. #define M6 22
  33. #define M6_ 23
  34. #define M7 24
  35. #define H1 25
  36. #define H1_ 26
  37. #define H2 27
  38. #define H2_ 28
  39. #define H3 29
  40. #define H4 30
  41. #define H4_ 31
  42. #define H5 32
  43. #define H5_ 33
  44. #define H6 34
  45. #define H6_ 35
  46. #define H7 36
  47. unsigned int FreqTable[] = { 0,
  48. 64303 , 63577 , 63691 , 63792 , 63892 , 63981 , 64070 , 64152 , 64229 , 64303 , 64372 , 64437 ,
  49. 64499 , 64557 , 64612 , 64664 , 64713 , 64759 , 64803 , 64844 , 64883 , 64919 , 64954 , 64987 ,
  50. 65018 , 65047 , 65074 , 65100 , 65125 , 65148 , 65169 , 65190 , 65209 , 65228 , 65245 , 65261
  51. };
  52. // 第一个H2意思是频率;第二个4,代表一个4分音符;code是把代码放到Flash里面。
  53. unsigned char code Music[]={
  54. H2, 4,
  55. M7, 4,
  56. H1, 4,
  57. M6, 4,
  58. H2, 4,
  59. M7, 4,
  60. H1, 4,
  61. M6, 4,
  62. // // 注释部分是高潮的前面部分
  63. // M3,4+4+4+4,
  64. // P,4+4,
  65. // P,2,
  66. // M1,2,
  67. // M2,2,
  68. // M1,2,
  69. // M3,4+4+4+4,
  70. // P,4+2,
  71. // M1,2,
  72. // M2,2,
  73. // M1,2,
  74. // M2,2,
  75. // M3,2,
  76. // //
  77. // L6,4+2,
  78. // M1,2,
  79. // L6,4+2,
  80. // M1,2,
  81. //
  82. // L6,4+2,
  83. // M1,2,
  84. // M2,4,
  85. // M1,4,
  86. //
  87. // L7,4+4+4+4,
  88. // P,4+4+4+4,
  89. //
  90. // //
  91. // M3,4+4+4+4,
  92. // P,4+4,
  93. // P,2,
  94. // M1,2,
  95. // M2,2,
  96. // M1,2,
  97. // M3,4+4+4+4,
  98. // P,4+2,
  99. // M1,2,
  100. // M2,2,
  101. // M1,2,
  102. // M2,2,
  103. // M3,2,
  104. // //
  105. // L6,4+2,
  106. // M1,2,
  107. // L6,4+2,
  108. // M1,2,
  109. //
  110. // L6,4+2,
  111. // M1,2,
  112. // M3,4,
  113. // M1,2,
  114. // M2,2,
  115. //
  116. // L7,4+4+4+4,
  117. // P,4+4+4+4,
  118. //
  119. // H6,2,
  120. // M1,2,
  121. // M6,4+2+2+2,
  122. // M5, 2,
  123. //
  124. // M6,4+2,
  125. // M5,2,
  126. // M6,2,
  127. // M5,2,
  128. // M6,2,
  129. //
  130. // M5,2+2,
  131. // M3,2+2+4+4,
  132. // P,4+4+4,
  133. // H6,2,
  134. // M1,2,
  135. //
  136. // M6,4+2+2,
  137. // M5,2,
  138. // M6,2,
  139. // M5,2,
  140. // M7,4+2+2,
  141. // M6,2,
  142. // M7,2+2,
  143. // M6,4,
  144. // M3,2+2+4,
  145. //
  146. // P,4+4+2,
  147. // M3,2,
  148. // M5,2,
  149. // M3,2,
  150. //
  151. // M2,4+2,
  152. // M3,2,
  153. // M2,4+2,
  154. // M3,2,
  155. // M2,4+2,
  156. // M3,2,
  157. // M5,2,
  158. // M3,2,
  159. // M5,2,
  160. // M3,2,
  161. //
  162. // M2,4+2,
  163. // M3,2,
  164. // M2,4+2,
  165. // M3,2,
  166. //
  167. // M2,4+4+4,
  168. // M1,2,
  169. // M2,2,
  170. // //
  171. // M3,4,
  172. // M6,4,
  173. // M1,4,
  174. // M3,2,
  175. // M2,4+2,
  176. // M3,2,
  177. // M2,4,
  178. // M1,4,
  179. // M6,4+4+4+4,
  180. // 高潮部分
  181. P, 4+ 4+ 4,
  182. M6, 2,
  183. M7, 2,
  184. //
  185. M1, 2,
  186. M2, 2,
  187. M7, 2,
  188. M1, 2+ 4+ 2,
  189. M7, 2,
  190. M1, 2,
  191. M2, 2,
  192. M7, 2,
  193. M1, 2+ 4+ 2,
  194. M2, 2,
  195. M3, 2,
  196. M2, 2,
  197. M3, 2,
  198. M2, 2,
  199. M3, 4+ 2,
  200. M2, 2,
  201. M3, 4,
  202. M5, 4,
  203. M3, 4,
  204. M6, 2,
  205. M7, 2,
  206. //
  207. M1, 2,
  208. M2, 2,
  209. M7, 2,
  210. M1, 2+ 4+ 2,
  211. M7, 2,
  212. M1, 2,
  213. M2, 2,
  214. M7, 2,
  215. M1, 2+ 4+ 2,
  216. M2, 2,
  217. M3, 2,
  218. M2, 2,
  219. M3, 2,
  220. M2, 2,
  221. M3, 4+ 2,
  222. M2, 2,
  223. M3, 4,
  224. M5, 4,
  225. M3, 4,
  226. M5, 4,
  227. //
  228. M3, 2+ 4,
  229. M5, 2,
  230. M3, 2+ 4,
  231. M5, 2,
  232. M3, 2,
  233. M5, 2,
  234. M6, 2,
  235. M3, 2,
  236. M5, 4,
  237. M5, 4,
  238. M3, 2+ 4,
  239. M5, 2,
  240. M3, 2+ 4,
  241. M5, 2,
  242. //
  243. M3, 2,
  244. M5, 2,
  245. M6, 2,
  246. M3, 2,
  247. M5, 4,
  248. M5, 2+ 2,
  249. //
  250. M3, 4,
  251. M2, 4,
  252. M2, 4,
  253. M1, 2,
  254. M3, 2,
  255. M3, 4,
  256. M2, 4,
  257. M2, 4,
  258. M1, 2,
  259. M1, 2,
  260. L6, 4+ 4+ 4+ 4,
  261. P, 4+ 4+ 4,
  262. M5, 2+ 2,
  263. //
  264. M3, 4,
  265. M2, 4,
  266. M2, 4,
  267. M1, 2,
  268. M3, 2,
  269. M3, 4,
  270. M2, 4,
  271. M2, 4,
  272. M1, 2,
  273. M1, 2,
  274. L6, 4+ 4+ 4+ 4,
  275. P, 4+ 4+ 4+ 4,
  276. 0xFF
  277. };
  278. unsigned char FreqSelect,MusicSelect;
  279. void main(){
  280. // 初始化定时器
  281. Timer0Init();
  282. while( 1){
  283. // 判断是否是休止符
  284. if(Music[MusicSelect] != 0xFF){
  285. //发声
  286. FreqSelect = Music[MusicSelect];
  287. MusicSelect++;
  288. //持续时长
  289. Delay(SPEED/ 4*Music[MusicSelect]);
  290. MusicSelect++;
  291. TR0 = 0;
  292. Delay( 5);
  293. TR0 = 1;
  294. } else{
  295. TR0 = 0;
  296. while( 1);
  297. }
  298. }
  299. }
  300. void Timer0_Routine() interrupt 1
  301. {
  302. if(FreqTable[FreqSelect]){
  303. TL0 = FreqTable[FreqSelect] % 256; //设置定时初始值
  304. TH0 = FreqTable[FreqSelect] / 256;
  305. Buzzer =! Buzzer; // 响
  306. }
  307. }

运行结果

蜂鸣器《孤勇者》

        好了,对于蜂鸣器的知识就介绍到这了,如有错误还望及时指出。


转载:https://blog.csdn.net/weixin_66578482/article/details/125715157
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场