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


    目录

    硬件部分

    蜂鸣器介绍

    驱动电路 

    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
    3. #include
    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;i2;i++)
    27. {
    28. Buzzer=!Buzzer;
    29. Buzzer_Delay500us();
    30. }
    31. }
    1. // main.c
    2. #include
    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. }

    运行结果

    蜂鸣器《孤勇者》

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

  • 相关阅读:
    调用gethostbyname实现域名解析(附源码)
    体育场馆智能化系统满足了哪些需求?
    Mac电脑配置Java环境和android环境,删除谷歌浏览器的自动更新
    Python lambda 函数深度总结
    Js实现时间函数
    第20章 OAuth2LoginAuthenticationWebFilter 之ReactiveAuthenticationManager认证授权管理器
    JVM垃圾回收器介绍
    宁波效实中学国际课程与交流中心IB数学课程介绍
    CSS3_字体图标
    [Matlab有限元分析] 1.有限元分析的发展、基本概念和特点
  • 原文地址:https://blog.csdn.net/weixin_66578482/article/details/125715157