当前位置:   article > 正文

C51单片机播放音乐《起风了》_c51音乐程序代码

c51音乐程序代码

单片机控制蜂鸣器发声的基本原理和方法:只需对驱动口输出驱动电平并通过放大电路放大驱动电流就能使蜂鸣器发出声音。改变引脚的频率,就可以调整蜂鸣器的音调,产生各种不同的声音。
同时改变输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小

下面给出代码

main.c

(这里注意要把数组类型从char改为int要不然字符数组存不下,音乐不会完整播放),更改SPEED可改变曲子的播放速度。

  1. #include <REGX52.H>
  2. #include "Delay.h"
  3. #include "Timer0.h"
  4. //蜂鸣器端口定义
  5. sbit Buzzer=P2^5;
  6. //播放速度,值为四分音符的时长(ms)
  7. #define SPEED 700
  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. unsigned int FreqTable[]={
  48. 0,
  49. 63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
  50. 64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
  51. 65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
  52. };
  53. //乐谱
  54. unsigned int code Music[]={
  55. //音符,时值,
  56. //1
  57. M2,3,
  58. M1,1,
  59. M2,3,
  60. M1,1,
  61. M2,2,
  62. M3,2,
  63. M5,2,
  64. M3,2,
  65. M2,3,
  66. M1,1,
  67. M2,3,
  68. M1,1,
  69. M2,1,
  70. M3,1,
  71. M2,1,
  72. M1,1,
  73. L5,2,
  74. P,2,
  75. M2,3,
  76. M1,1,
  77. M2,3,
  78. M1,1,
  79. M2,2,
  80. M3,2,
  81. M5,2,
  82. M3,2,
  83. M2,3,
  84. M3,1,
  85. M2,2,
  86. M1,1,
  87. M2,5,
  88. P,4,
  89. M2,3,
  90. M1,1,
  91. M2,3,
  92. M1,1,
  93. M2,2,
  94. M3,2,
  95. M5,2,
  96. M3,2,
  97. M2,3,
  98. M3,1,
  99. M2,2,
  100. M1,1,
  101. L6,3,
  102. P,2,
  103. M3,1,
  104. M2,1,
  105. M1,1,
  106. M2,1,
  107. M1,2,
  108. P,2,
  109. M3,1,
  110. M2,1,
  111. M1,1,
  112. M2,1,
  113. M1,2,
  114. P,2,
  115. M3,1,
  116. M2,1,
  117. M1,1,
  118. M2,1,
  119. M1,4,
  120. P,6,
  121. M1,2,
  122. M2,2,
  123. M3,2,
  124. M1,2,
  125. M6,2,
  126. M5,1,
  127. M6,3,
  128. P,1,
  129. M1,1,
  130. M7,2,
  131. M6,1,
  132. M7,3,
  133. P,2,
  134. M7,2,
  135. M6,1,
  136. M7,3,
  137. M3,2,
  138. H1,1,
  139. H2,1,
  140. H1,1,
  141. M7,1,
  142. M6,2,
  143. M5,2,
  144. M6,2,
  145. M5,1,
  146. M6,2,
  147. M5,1,
  148. M6,1,
  149. M5,1,
  150. M6,2,
  151. M5,1,
  152. M2,2,
  153. M5,1,
  154. M5,1,
  155. M3,5,
  156. P,4,
  157. M1,2,
  158. M2,2,
  159. M3,2,
  160. M1,2,
  161. M6,2,
  162. M5,1,
  163. M6,3,
  164. P,1,
  165. M1,1,
  166. M7,2,
  167. M6,1,
  168. M7,3,
  169. P,2,
  170. M7,2,
  171. M6,1,
  172. M7,3,
  173. M3,2,
  174. H1,1,
  175. H2,1,
  176. H1,1,
  177. M7,1,
  178. M6,2,
  179. M5,2,
  180. M6,2,
  181. H3,4,
  182. M5,2,
  183. M6,2,
  184. H3,3,
  185. M5,1,
  186. M5,1,
  187. M6,11,
  188. P,2,
  189. H1,2,
  190. H2,2,
  191. H3,2,
  192. H6,1,
  193. H5,3,
  194. H6,1,
  195. H5,3,
  196. H6,1,
  197. H5,3,
  198. H2,1,
  199. H3,3,
  200. H6,1,
  201. H5,3,
  202. H6,1,
  203. H5,3,
  204. H6,1,
  205. H5,2,
  206. H3,1,
  207. H3,3,
  208. H2,2,
  209. H1,1,
  210. M6,2,
  211. H1,3,
  212. H2,2,
  213. H1,1,
  214. M6,2,
  215. H1,2,
  216. H3,6,
  217. H2,1,
  218. H3,1,
  219. H2,2,
  220. P,2,
  221. H1,2,
  222. H2,2,
  223. H3,2,
  224. H6,1,
  225. H5,3,
  226. H6,1,
  227. H5,3,
  228. H6,1,
  229. H5,2,
  230. P,1,
  231. H2,1,
  232. H3,2,
  233. H6,1,
  234. H5,3,
  235. H6,1,
  236. H5,3,
  237. H6,1,
  238. H5,2,
  239. H3,2,
  240. H3,1,
  241. H2,2,
  242. H1,1,
  243. M6,2,
  244. H3,2,
  245. H2,2,
  246. H1,1,
  247. M6,3,
  248. H1,2,
  249. H1,8,
  250. M6,1,
  251. H3,3,
  252. H2,2,
  253. H1,1,
  254. M6,1,
  255. M6,1,
  256. H3,2,
  257. H2,2,
  258. H1,1,
  259. M6,3,
  260. H1,7,
  261. H1,8,
  262. P,8,
  263. 0xFF
  264. //终止标志
  265. };
  266. unsigned int FreqSelect,MusicSelect;
  267. void main()
  268. {
  269. Timer0Init();
  270. while(1)
  271. {
  272. if(Music[MusicSelect]!=0xFF) //如果不是停止标志位
  273. {
  274. FreqSelect=Music[MusicSelect]; //选择音符对应的频率
  275. MusicSelect++;
  276. Delay(SPEED/4*Music[MusicSelect]); //选择音符对应的时值
  277. MusicSelect++;
  278. TR0=0;
  279. Delay(5); //音符间短暂停顿
  280. TR0=1;
  281. }
  282. else //如果是停止标志位
  283. {
  284. TR0=0;
  285. while(1);
  286. }
  287. }
  288. }
  289. void Timer0_Routine() interrupt 1
  290. {
  291. if(FreqTable[FreqSelect]) //如果不是休止符
  292. {
  293. /*取对应频率值的重装载值到定时器*/
  294. TL0 = FreqTable[FreqSelect]%256; //设置定时初值
  295. TH0 = FreqTable[FreqSelect]/256; //设置定时初值
  296. Buzzer=!Buzzer; //翻转蜂鸣器IO口
  297. }
  298. }

Timer0.c

  1. #include <REGX52.H>
  2. /**
  3. * @brief 定时器0初始化
  4. * @param无
  5. * @retval 无
  6. */
  7. void Timer0Init()//1毫秒@11.0592MHz
  8. {
  9. TMOD &= 0xF0; //设置定时器模式
  10. TMOD |= 0x01; //设置定时器模式
  11. TL0 = 0x66; //设置定时初始值
  12. TH0 = 0xFC; //设置定时初始值
  13. TF0 = 0; //清除TF0标志
  14. TR0 = 1; //定时器0开始计时
  15. ET0=1; //打开定时器0中断
  16. EA=1; //开总中断
  17. PT0=0;
  18. }
  19. /*定时器终端模板函数
  20. void Timer0_Routine() interrupt 1
  21. {
  22. static unsigned int T0Count;
  23. TL0 = 0x66; //设置定时初始值
  24. TH0 = 0xFC; //设置定时初始值
  25. T0Count++;
  26. if(T0Count>=1000)
  27. {
  28. T0Count=0;
  29. P2_0=~P2_0;
  30. }
  31. }
  32. */

Timer0.h

  1. #ifndef __TIMER0_H__//防重复定义
  2. #define __TIMER0_H__
  3. void Timer0Init();
  4. #endif

Delay.c

  1. #include <REGX52.H>
  2. void Delay(unsigned int xms)
  3. {
  4. unsigned char i, j;
  5. while(xms--){
  6. i = 2;
  7. j = 239;
  8. do
  9. {
  10. while (--j);
  11. } while (--i);
  12. }
  13. }

Delay.h

  1. #ifndef __DELAY_H__
  2. #define __DELAY_H__
  3. void Delay(unsigned int xms);
  4. #endif

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号