标题: 51单片机蜂鸣器播放音乐天空之城PPT教程+程序+Proteus仿真 [打印本页]

作者: zc98    时间: 2019-3-30 21:01
标题: 51单片机蜂鸣器播放音乐天空之城PPT教程+程序+Proteus仿真
前两天上单片机课,讲了蜂鸣器有关内容,顺便写了个蜂鸣器播放音乐的小程序;
程序在code文件夹下,使用keil4编译,并附带仿真,仿真环境为Proteus7.8;
想强调的一个问题是音调之间加延时真的很重要,不然特别难听
ppt中讲解了蜂鸣器的有关知识,最后有关于执行流程的讲解

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


ppt教程预览:


单片机源程序如下:
  1. /***************
  2. author:zc
  3. description: 蜂鸣器播放音乐 天空之城
  4.                           晶振11.0592Mhz
  5.                           实现方法:
  6.                                           while(1)循环中生成音调方波;
  7.                                         定时器1记录每个音调的时长并切换音调
  8. ****************/

  9. #include "reg51.h"
  10. #include "intrins.h"
  11. unsigned int tones[]=                            //C调音调
  12. {
  13. 3816,3401,3030,2865,2551,2272,2024,         //低音
  14. 1912,1703,1517,1432,1275,1136,1012,         //中音
  15. 965, 851, 758, 715, 605, 538, 466         //高音
  16. };

  17. unsigned char code sky[]={                         //谱子
  18. //格式: 音调, 音度, 拍数
  19. //例: 4,1,1 //音调fa,中音,时长半拍
  20. //0代表空音
  21. 0,0,2,
  22. 0,0,2,
  23. 0,0,2,
  24. 6,1,1,
  25. 7,1,1,

  26. 1,2,3,
  27. 7,1,1,
  28. 1,2,2,
  29. 3,2,2,

  30. 7,1,4,
  31. 0,2,2,
  32. 3,1,1,
  33. 3,1,1,

  34. 6,1,3,
  35. 5,1,1,
  36. 6,1,2,
  37. 1,2,2,

  38. 5,1,4,
  39. 0,1,2,
  40. 3,1,2,

  41. 4,1,3,
  42. 3,1,1,
  43. 4,1,2,
  44. 1,2,2,

  45. 3,1,3,
  46. 0,0,1,
  47. 1,2,1,
  48. 1,2,1,
  49. 1,2,1,

  50. 7,1,3,
  51. 4,1,1,
  52. 4,1,2,
  53. 7,1,2,

  54. 7,1,4,
  55. 0,0,2,
  56. 6,1,1,
  57. 7,1,1,

  58. 1,2,3,
  59. 7,1,1,
  60. 1,2,2,
  61. 3,2,2,

  62. 7,1,4,
  63. 0,0,2,
  64. 3,1,1,
  65. 3,1,1,

  66. 6,1,3,
  67. 5,1,1,
  68. 6,1,2,
  69. 1,2,2,

  70. 5,1,4,
  71. 0,0,2,
  72. 2,1,1,
  73. 3,1,1,

  74. 4,1,2,
  75. 1,2,1,
  76. 7,1,2,
  77. 1,2,3,

  78. 2,2,1,
  79. 2,2,1,
  80. 3,2,1,
  81. 1,2,3,
  82. 0,0,2,

  83. 1,2,1,
  84. 7,1,1,
  85. 6,1,1,
  86. 6,1,1,
  87. 7,1,2,
  88. 5,1,2,

  89. 6,1,4,
  90. 0,0,2,
  91. 1,2,1,
  92. 2,2,1,

  93. 3,2,3,
  94. 2,2,1,
  95. 3,2,2,
  96. 5,2,2,

  97. 2,2,4,
  98. 0,0,2,
  99. 5,1,1,
  100. 5,1,1,

  101. 1,2,3,
  102. 7,1,1,
  103. 1,2,2,
  104. 3,2,2,

  105. 3,2,4,
  106. 0,0,2,

  107. 6,1,1,
  108. 7,1,1,
  109. 1,2,2,
  110. 7,1,2,
  111. 2,2,1,
  112. 2,2,1,

  113. 1,2,3,
  114. 5,1,1,
  115. 5,1,3,
  116. 0,0,1,

  117. 4,2,2,
  118. 3,2,2,
  119. 2,2,2,
  120. 1,2,2,

  121. 3,2,4,
  122. 0,0,2,
  123. 3,2,2,

  124. 6,2,4,
  125. 5,2,2,
  126. 5,2,2,

  127. 3,2,1,
  128. 2,2,1,
  129. 1,2,4,
  130. 0,2,1,
  131. 1,2,1,

  132. 2,2,2,
  133. 1,2,1,
  134. 2,2,1,
  135. 2,2,2,
  136. 5,2,2,

  137. 3,2,4,
  138. 0,2,2,
  139. 3,2,2,


  140. 6,2,4,
  141. 5,2,4,

  142. 3,2,1,
  143. 2,2,1,
  144. 1,2,4,
  145. 0,0,1,
  146. 1,2,1,

  147. 2,2,2,
  148. 1,2,1,
  149. 2,2,1,
  150. 2,2,2,
  151. 7,1,2,

  152. 6,1,2,
  153. };

  154. sbit        Buzzer=P3^0;                     //定义buzzer引脚
  155. void delay_ms( unsigned int t)        ;         //毫秒延时12MHz下
  156. void delay_us( unsigned int t)        ;         //微妙延时12MHz下
  157. void play_tone(unsigned int tone);         //播放音调函数,即方波发生器
  158. void time_init( void );                                 //初始化定时器
  159. unsigned char s=0, t_tone=0;             //s用作定时器计时, t_tone保存音调时长
  160. unsigned int  tone=0;                             //tone保存音调,
  161. char *tone_p=sky;                                         //指针指向要播放的曲目

  162. void main( void )
  163. {
  164.         time_init();                                         //初始化定时器
  165.         while(1)
  166.                 if(tone!=0)play_tone(tone);         //一直在播放音调,播放的音调由定时器切换,
  167.                                                                          //音调时常由定时器决定
  168. }                                                                         //如果tone==0 不进入播放

  169. void time_init( void )
  170. {
  171.         TMOD|=0x10;                                                 //使用定时器1
  172.         TH1=(65536-65000)/256;                         //装初值
  173.         TL1=(65536-65000)%256;
  174.         EA =  1;                                                 //开中断,打开定时器开关
  175.         ET1 = 1;
  176.         TR1 = 1;
  177. }

  178. void timer1( void ) interrupt 3                 //定时器1 中断
  179. {
  180.         TH1=(65536-50000)/256;                         //装初值
  181.         TL1=(65536-50000)%256;
  182.         s++;
  183.         if(s>=4*t_tone)                                         //一个音节播放的时间,这里可以通过调t_tone前的系数可以改变时长
  184.         {
  185.                 s=0;                                                 //讲计时器清零
  186.                 if((*tone_p)!=0)                         //如果音不是0
  187.                         tone = tones[*tone_p+7*(*(tone_p+1))-1];  //赋值音调
  188.                 else
  189.                         tone = 0;                             //关了蜂鸣器
  190.                 t_tone = *(tone_p+2);                 //取时间啊
  191.                 tone_p+=3;                                         //移动指针
  192.                 delay_ms(30);                                 //延时一下,不延时特别难听
  193.         }
  194. }


  195. void play_tone(unsigned int tone)         //播音调函数,就是方波发生器
  196. {

  197.                 Buzzer=!Buzzer;                                 
  198.                 delay_us(tone);               
  199. }

  200. ……………………

  201. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
test2.rar (2.16 MB, 下载次数: 542)






作者: zengxuteng    时间: 2019-4-4 13:44
听了天空之城,谢谢!
作者: ptlantu    时间: 2019-4-4 15:39
感谢分享
作者: 快乐眼泪    时间: 2019-4-4 20:50
感谢楼主分享!
作者: wqqe去    时间: 2019-6-16 21:57
可以很厉害
作者: jyk    时间: 2019-6-25 22:52
学习,很不错的分享
作者: 54321gk    时间: 2019-11-25 16:22
jyk 发表于 2019-6-25 22:52
学习,很不错的分享

感谢分享

作者: LYAJJ    时间: 2019-11-27 16:06
感谢分享
作者: 1664532612    时间: 2019-11-27 17:08
感谢分享
作者: 单片机老司机    时间: 2019-11-28 21:36
为什么可以用数字代替音乐
作者: 单片机老司机    时间: 2019-11-28 21:36
如何用数字代替音乐·
作者: xuexuexixi    时间: 2020-2-15 18:07
感谢分享.就是为啥数字可以代替音乐不懂
作者: 浙江杭州    时间: 2020-3-16 17:35
如何用数字代替音乐???不懂
作者: C919_    时间: 2020-3-25 14:29
感谢楼主分享

作者: kiccleaf    时间: 2020-12-1 23:38
不错不错,这个可以学习了
作者: 长风007    时间: 2020-12-2 10:05
天空之城还是很好听的!
作者: 1375626371    时间: 2021-7-5 19:06
这个应该是最完善的版本了,谢谢楼主
作者: 安装现代化NSA    时间: 2025-5-7 23:46
感谢分享
作者: 成一1    时间: 2025-5-31 16:58
浙江杭州 发表于 2020-3-16 17:35
如何用数字代替音乐???不懂

定时器,频率,周期可以改变音调和音长





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1