找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5133|回复: 2
收起左侧

单片机演奏音乐实验 汇编语言

[复制链接]
ID:105323 发表于 2016-2-22 01:37 | 显示全部楼层 |阅读模式








    利用单片机演奏音乐大概是单片机爱好者感兴趣的问题之一。这里我们用网站提供的实验板来做这个实验,并且了解单片机演奏音乐的基本原理,和相关的源程序。 
   首先来完成必要的硬件部分,硬件部分比较简单,如下图:
   
   AT89C51单片机的P2.5口控制一个8550的三极管,三极管控制电磁蜂鸣器的电源通断。
  我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的高电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。
   例如,要产生200HZ的音频信号,200HZ音频的变化周期为1/200秒,即5ms。这样,当P2.5的高电平或低电平的持续时间为2.5ms时就能发出200HZ的音调。
    乐曲中,每一音符对应着确定的频率,我们将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就可以实现演奏效果。
    此外,结束符和体止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。
    为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不同的音符。
程序框图如图2所示。

    下面给出程序序请单,可直接在51实验板上进行演奏。本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。网友也可以自行找出一首歌,将乐曲翻译成码表输入机器,而程序不变。本实验方法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。 
;标题 '八月桂花香'发声程序 




  1. ORG 0000H
  2. LJMP START
  3. ORG 000BH
  4. INC 20H ;中断服务,中断计数器加1
  5. MOV TH0,#0D8H
  6. MOV TL0,#0EFH ;12M晶振,形成10毫秒中断
  7. RETI
  8. START: 
  9. MOV SP,#50H
  10. MOV TH0,#0D8H
  11. MOV TL0,#0EFH
  12. MOV TMOD,#01H
  13. MOV IE,#82H
  14. MUSIC0:
  15. NOP
  16. MOV DPTR,#DAT ;表头地址送DPTR
  17. MOV 20H,#00H ;中断计数器清0
  18. MUSIC1:
  19. NOP
  20. CLR A ;A清零
  21. MOVC A,@A+DPTR ;查表取代码
  22. JZ END0 ;是00H,则结束
  23. CJNE A,#0FFH,MUSIC5 ;如果是休止符,往下执行
  24. LJMP MUSIC3
  25. MUSIC5:
  26. NOP
  27. MOV R6,A ;R6=18H音符的频率
  28. INC DPTR DPTR加一
  29. MOV A,#0
  30. MOVC A,@A+DPTR ;取节拍代码送R7
  31. MOV R7,A ;R7=30H音符发音的时间
  32. SETB TR0 ;启动计数 
  33. MUSIC2:
  34. NOP
  35. CPL P2.5 ;P2.5是音乐输出引脚
  36. MOV A,R6
  37. MOV R3,A ;R3=R6=18H
  38. LCALL DEL
  39. MOV A,R7
  40. CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?
  41. ;不等,则继续循环
  42. MOV 20H,#00H ;等于,则取下一代码
  43. INC DPTR
  44. LJMP MUSIC1
  45. MUSIC3:
  46. NOP ;休止100毫秒
  47. CLR TR0 
  48. MOV R2,#0DH ;R2=13
  49. MUSIC4:
  50. NOP
  51. MOV R3,#0FFH ;R3=255
  52. LCALL DEL
  53. DJNZ R2,MUSIC4
  54. INC DPTR
  55. LJMP MUSIC1
  56. END0:
  57. NOP
  58. MOV R2,#0FFH ;歌曲结束,延时1秒后继续
  59. MUSIC6:
  60. MOV R3,#00H
  61. LCALL DEL
  62. DJNZ R2,MUSIC6
  63. LJMP MUSIC0
  64. DEL:
  65. NOP
  66. DEL3: 
  67. MOV R4,#02H
  68. DEL4: 
  69. NOP
  70. DJNZ R4,DEL4
  71. NOP
  72. DJNZ R3,DEL3
  73. RET
  74. NOP
  75. DAT: 
  76. DB 18H, 30H, 1CH, 10H
  77. DB 20H, 40H, 1CH, 10H 
  78. DB 18H, 10H, 20H, 10H
  79. DB 1CH, 10H, 18H, 40H
  80. DB 1CH, 20H, 20H, 20H
  81. DB 1CH, 20H, 18H, 20H 
  82. DB 20H, 80H, 0FFH, 20H
  83. DB 30H, 1CH, 10H , 18H
  84. DB 20H, 15H, 20H , 1CH
  85. DB 20H, 20H, 20H , 26H
  86. DB 40H, 20H , 20H , 2BH
  87. DB 20H, 26H, 20H , 20H 
  88. DB 20H, 30H , 80H , 0FFH
  89. DB 20H, 20H, 1CH , 10H
  90. DB 18H, 10H, 20H , 20H
  91. DB 26H, 20H , 2BH , 20H
  92. DB 30H, 20H , 2BH , 40H
  93. DB 20H, 20H , 1CH , 10H
  94. DB 18H, 10H, 20H, 20H
  95. DB 26H, 20H , 2BH, 20H
  96. DB 30H, 20H, 2BH , 40H
  97. DB 20H, 30H, 1CH , 10H
  98. DB 18H, 20H , 15H , 20H
  99. DB 1CH, 20H , 20H , 20H
  100. DB 26H, 40H, 20H , 20H 
  101. DB 2BH, 20H, 26H , 20H 
  102. DB 20H, 20H, 30H , 80H
  103. DB 20H, 30H, 1CH , 10H
  104. DB 20H, 10H, 1CH , 10H
  105. DB 20H, 20H, 26H , 20H
  106. DB 2BH, 20H, 30H , 20H
  107. DB 2BH, 40H, 20H , 15H
  108. DB 1FH, 05H, 20H , 10H
  109. DB 1CH, 10H, 20H , 20H
  110. DB 26H, 20H, 2BH , 20H
  111. DB 30H, 20H, 2BH , 40H
  112. DB 20H, 30H, 1CH , 10H
  113. DB 18H, 20H , 15H , 20H
  114. DB 1CH, 20H , 20H , 20H
  115. DB 26H, 40H, 20H , 20H
  116. DB 2BH, 20H, 26H , 20H
  117. DB 20H, 20H, 30H, 30H 
  118. DB 20H, 30H, 1CH, 10H
  119. DB 18H, 40H, 1CH, 20H
  120. DB 20H, 20H, 26H, 40H
  121. DB 13H, 60H, 18H , 20H
  122. DB 15H, 40H, 13H , 40H
  123. DB 18H, 80H, 00H
  124. end
复制代码













回复

使用道具 举报

ID:846897 发表于 2020-11-21 15:48 | 显示全部楼层
请问怎么增加多个曲目呀
回复

使用道具 举报

ID:876573 发表于 2021-4-14 11:50 | 显示全部楼层
有没有详细一点的教程啊? 想学学一下,楼主能不能分享一下多首曲目,带上一首、下一首、以及开始及暂停按键的程序啊,谢谢!我自己实在是想不出节奏来
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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