找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17717|回复: 16
收起左侧

51单片机蜂鸣器播放音乐天空之城PPT教程+程序+Proteus仿真

  [复制链接]
ID:255871 发表于 2019-3-30 21:01 | 显示全部楼层 |阅读模式
前两天上单片机课,讲了蜂鸣器有关内容,顺便写了个蜂鸣器播放音乐的小程序;
程序在code文件夹下,使用keil4编译,并附带仿真,仿真环境为Proteus7.8;
想强调的一个问题是音调之间加延时真的很重要,不然特别难听
ppt中讲解了蜂鸣器的有关知识,最后有关于执行流程的讲解

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

ppt教程预览:
0.png 0.png

单片机源程序如下:
  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, 下载次数: 540)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:359022 发表于 2019-4-4 13:44 | 显示全部楼层
听了天空之城,谢谢!
回复

使用道具 举报

ID:73182 发表于 2019-4-4 15:39 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:399179 发表于 2019-4-4 20:50 | 显示全部楼层
感谢楼主分享!
回复

使用道具 举报

ID:563985 发表于 2019-6-16 21:57 | 显示全部楼层
可以很厉害
回复

使用道具 举报

ID:427818 发表于 2019-6-25 22:52 | 显示全部楼层
学习,很不错的分享
回复

使用道具 举报

ID:649188 发表于 2019-11-25 16:22 | 显示全部楼层
jyk 发表于 2019-6-25 22:52
学习,很不错的分享

感谢分享
回复

使用道具 举报

ID:650865 发表于 2019-11-27 16:06 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:650945 发表于 2019-11-27 17:08 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:643576 发表于 2019-11-28 21:36 | 显示全部楼层
为什么可以用数字代替音乐
回复

使用道具 举报

ID:643576 发表于 2019-11-28 21:36 | 显示全部楼层
如何用数字代替音乐·
回复

使用道具 举报

ID:693587 发表于 2020-2-15 18:07 | 显示全部楼层
感谢分享.就是为啥数字可以代替音乐不懂
回复

使用道具 举报

ID:709595 发表于 2020-3-16 17:35 | 显示全部楼层
如何用数字代替音乐???不懂
回复

使用道具 举报

ID:596950 发表于 2020-3-25 14:29 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:846386 发表于 2020-12-1 23:38 | 显示全部楼层
不错不错,这个可以学习了
回复

使用道具 举报

ID:337139 发表于 2020-12-2 10:05 | 显示全部楼层
天空之城还是很好听的!
回复

使用道具 举报

ID:398588 发表于 2021-7-5 19:06 | 显示全部楼层
这个应该是最完善的版本了,谢谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表