標(biāo)題: 51單片機蜂鳴器播放音樂天空之城PPT教程+程序+Proteus仿真 [打印本頁]

作者: zc98    時間: 2019-3-30 21:01
標(biāo)題: 51單片機蜂鳴器播放音樂天空之城PPT教程+程序+Proteus仿真
前兩天上單片機課,講了蜂鳴器有關(guān)內(nèi)容,順便寫了個蜂鳴器播放音樂的小程序;
程序在code文件夾下,使用keil4編譯,并附帶仿真,仿真環(huán)境為Proteus7.8;
想強調(diào)的一個問題是音調(diào)之間加延時真的很重要,不然特別難聽
ppt中講解了蜂鳴器的有關(guān)知識,最后有關(guān)于執(zhí)行流程的講解

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


ppt教程預(yù)覽:


單片機源程序如下:
  1. /***************
  2. author:zc
  3. description: 蜂鳴器播放音樂 天空之城
  4.                           晶振11.0592Mhz
  5.                           實現(xiàn)方法:
  6.                                           while(1)循環(huán)中生成音調(diào)方波;
  7.                                         定時器1記錄每個音調(diào)的時長并切換音調(diào)
  8. ****************/

  9. #include "reg51.h"
  10. #include "intrins.h"
  11. unsigned int tones[]=                            //C調(diào)音調(diào)
  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. //格式: 音調(diào), 音度, 拍數(shù)
  19. //例: 4,1,1 //音調(diào)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);         //播放音調(diào)函數(shù),即方波發(fā)生器
  158. void time_init( void );                                 //初始化定時器
  159. unsigned char s=0, t_tone=0;             //s用作定時器計時, t_tone保存音調(diào)時長
  160. unsigned int  tone=0;                             //tone保存音調(diào),
  161. char *tone_p=sky;                                         //指針指向要播放的曲目

  162. void main( void )
  163. {
  164.         time_init();                                         //初始化定時器
  165.         while(1)
  166.                 if(tone!=0)play_tone(tone);         //一直在播放音調(diào),播放的音調(diào)由定時器切換,
  167.                                                                          //音調(diào)時常由定時器決定
  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;                                                 //開中斷,打開定時器開關(guān)
  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)                                         //一個音節(jié)播放的時間,這里可以通過調(diào)t_tone前的系數(shù)可以改變時長
  184.         {
  185.                 s=0;                                                 //講計時器清零
  186.                 if((*tone_p)!=0)                         //如果音不是0
  187.                         tone = tones[*tone_p+7*(*(tone_p+1))-1];  //賦值音調(diào)
  188.                 else
  189.                         tone = 0;                             //關(guān)了蜂鳴器
  190.                 t_tone = *(tone_p+2);                 //取時間啊
  191.                 tone_p+=3;                                         //移動指針
  192.                 delay_ms(30);                                 //延時一下,不延時特別難聽
  193.         }
  194. }


  195. void play_tone(unsigned int tone)         //播音調(diào)函數(shù),就是方波發(fā)生器
  196. {

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

  200. ……………………

  201. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
test2.rar (2.16 MB, 下載次數(shù): 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
學(xué)習(xí),很不錯的分享
作者: 54321gk    時間: 2019-11-25 16:22
jyk 發(fā)表于 2019-6-25 22:52
學(xué)習(xí),很不錯的分享

感謝分享

作者: LYAJJ    時間: 2019-11-27 16:06
感謝分享
作者: 1664532612    時間: 2019-11-27 17:08
感謝分享
作者: 單片機老司機    時間: 2019-11-28 21:36
為什么可以用數(shù)字代替音樂
作者: 單片機老司機    時間: 2019-11-28 21:36
如何用數(shù)字代替音樂·
作者: xuexuexixi    時間: 2020-2-15 18:07
感謝分享.就是為啥數(shù)字可以代替音樂不懂
作者: 浙江杭州    時間: 2020-3-16 17:35
如何用數(shù)字代替音樂???不懂
作者: C919_    時間: 2020-3-25 14:29
感謝樓主分享

作者: kiccleaf    時間: 2020-12-1 23:38
不錯不錯,這個可以學(xué)習(xí)了
作者: 長風(fēng)007    時間: 2020-12-2 10:05
天空之城還是很好聽的!
作者: 1375626371    時間: 2021-7-5 19:06
這個應(yīng)該是最完善的版本了,謝謝樓主
作者: 安裝現(xiàn)代化NSA    時間: 2025-5-7 23:46
感謝分享




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1