找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 19944|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)蜂鳴器播放音樂(lè)天空之城PPT教程+程序+Proteus仿真

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
前兩天上單片機(jī)課,講了蜂鳴器有關(guān)內(nèi)容,順便寫(xiě)了個(gè)蜂鳴器播放音樂(lè)的小程序;
程序在code文件夾下,使用keil4編譯,并附帶仿真,仿真環(huán)境為Proteus7.8;
想強(qiáng)調(diào)的一個(gè)問(wèn)題是音調(diào)之間加延時(shí)真的很重要,不然特別難聽(tīng)
ppt中講解了蜂鳴器的有關(guān)知識(shí),最后有關(guān)于執(zhí)行流程的講解

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


ppt教程預(yù)覽:


單片機(jī)源程序如下:
  1. /***************
  2. author:zc
  3. description: 蜂鳴器播放音樂(lè) 天空之城
  4.                           晶振11.0592Mhz
  5.                           實(shí)現(xiàn)方法:
  6.                                           while(1)循環(huán)中生成音調(diào)方波;
  7.                                         定時(shí)器1記錄每個(gè)音調(diào)的時(shí)長(zhǎng)并切換音調(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,中音,時(shí)長(zhǎng)半拍
  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)        ;         //毫秒延時(shí)12MHz下
  156. void delay_us( unsigned int t)        ;         //微妙延時(shí)12MHz下
  157. void play_tone(unsigned int tone);         //播放音調(diào)函數(shù),即方波發(fā)生器
  158. void time_init( void );                                 //初始化定時(shí)器
  159. unsigned char s=0, t_tone=0;             //s用作定時(shí)器計(jì)時(shí), t_tone保存音調(diào)時(shí)長(zhǎng)
  160. unsigned int  tone=0;                             //tone保存音調(diào),
  161. char *tone_p=sky;                                         //指針指向要播放的曲目

  162. void main( void )
  163. {
  164.         time_init();                                         //初始化定時(shí)器
  165.         while(1)
  166.                 if(tone!=0)play_tone(tone);         //一直在播放音調(diào),播放的音調(diào)由定時(shí)器切換,
  167.                                                                          //音調(diào)時(shí)常由定時(shí)器決定
  168. }                                                                         //如果tone==0 不進(jìn)入播放

  169. void time_init( void )
  170. {
  171.         TMOD|=0x10;                                                 //使用定時(shí)器1
  172.         TH1=(65536-65000)/256;                         //裝初值
  173.         TL1=(65536-65000)%256;
  174.         EA =  1;                                                 //開(kāi)中斷,打開(kāi)定時(shí)器開(kāi)關(guān)
  175.         ET1 = 1;
  176.         TR1 = 1;
  177. }

  178. void timer1( void ) interrupt 3                 //定時(shí)器1 中斷
  179. {
  180.         TH1=(65536-50000)/256;                         //裝初值
  181.         TL1=(65536-50000)%256;
  182.         s++;
  183.         if(s>=4*t_tone)                                         //一個(gè)音節(jié)播放的時(shí)間,這里可以通過(guò)調(diào)t_tone前的系數(shù)可以改變時(shí)長(zhǎng)
  184.         {
  185.                 s=0;                                                 //講計(jì)時(shí)器清零
  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);                 //取時(shí)間啊
  191.                 tone_p+=3;                                         //移動(dòng)指針
  192.                 delay_ms(30);                                 //延時(shí)一下,不延時(shí)特別難聽(tīng)
  193.         }
  194. }


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

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

  200. ……………………

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

所有資料51hei提供下載:
test2.rar (2.16 MB, 下載次數(shù): 542)





評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏16 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:359022 發(fā)表于 2019-4-4 13:44 | 只看該作者
聽(tīng)了天空之城,謝謝!
回復(fù)

使用道具 舉報(bào)

板凳
ID:73182 發(fā)表于 2019-4-4 15:39 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

地板
ID:399179 發(fā)表于 2019-4-4 20:50 | 只看該作者
感謝樓主分享!
回復(fù)

使用道具 舉報(bào)

5#
ID:563985 發(fā)表于 2019-6-16 21:57 | 只看該作者
可以很厲害
回復(fù)

使用道具 舉報(bào)

6#
ID:427818 發(fā)表于 2019-6-25 22:52 | 只看該作者
學(xué)習(xí),很不錯(cuò)的分享
回復(fù)

使用道具 舉報(bào)

7#
ID:649188 發(fā)表于 2019-11-25 16:22 | 只看該作者
jyk 發(fā)表于 2019-6-25 22:52
學(xué)習(xí),很不錯(cuò)的分享

感謝分享
回復(fù)

使用道具 舉報(bào)

8#
ID:650865 發(fā)表于 2019-11-27 16:06 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

9#
ID:650945 發(fā)表于 2019-11-27 17:08 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

10#
ID:643576 發(fā)表于 2019-11-28 21:36 | 只看該作者
為什么可以用數(shù)字代替音樂(lè)
回復(fù)

使用道具 舉報(bào)

11#
ID:643576 發(fā)表于 2019-11-28 21:36 | 只看該作者
如何用數(shù)字代替音樂(lè)·
回復(fù)

使用道具 舉報(bào)

12#
ID:693587 發(fā)表于 2020-2-15 18:07 | 只看該作者
感謝分享.就是為啥數(shù)字可以代替音樂(lè)不懂
回復(fù)

使用道具 舉報(bào)

13#
ID:709595 發(fā)表于 2020-3-16 17:35 | 只看該作者
如何用數(shù)字代替音樂(lè)???不懂
回復(fù)

使用道具 舉報(bào)

14#
ID:596950 發(fā)表于 2020-3-25 14:29 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

15#
ID:846386 發(fā)表于 2020-12-1 23:38 | 只看該作者
不錯(cuò)不錯(cuò),這個(gè)可以學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

16#
ID:337139 發(fā)表于 2020-12-2 10:05 | 只看該作者
天空之城還是很好聽(tīng)的!
回復(fù)

使用道具 舉報(bào)

17#
ID:398588 發(fā)表于 2021-7-5 19:06 | 只看該作者
這個(gè)應(yīng)該是最完善的版本了,謝謝樓主
回復(fù)

使用道具 舉報(bào)

18#
ID:1132489 發(fā)表于 2025-5-7 23:46 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表