基于汇编语言的音乐盒设计与实现

HlPH0P

发布日期: 2018-10-15 09:36:17 浏览量: 855
评分:
star star star star star star star star_border star_border star_border
*转载请注明来自write-bug.com

基于汇编语言的音乐盒设计与实现—汇编课设

一 需求分析

设计一个音乐盒,可用在诸如生日礼品等场景里。

包含的功能有播放音乐、切换音乐。默认播放第一首音乐,单曲循环。当拨动控制开关时切换歌曲,总共三首,分别由三个开关控制。当且仅当一个开关开启其它开关关闭时有效,多个开关同时开启时无效。

要求所选多个芯片或模块的加权值总和≥2,并且,所选芯片或模块中必须包含8259或8254芯片的其中一个作为功能模块部分。

二 设计思路

发声:通过将8254(8253)模块,设置为第三种模式,选择0号计数器,00110110B,作为波形发生器。通过输出波形的频率控制音调,通过维持频率波形的时间控制节拍。(1Mhz时钟信号下,频率与音阶对应如下:1=247,2=277,3=311,4=399,5=370,6=415,7=466, 1’=494)。

控制:通过将8255模块,设置为方式0,A端口输入,10010000B,作为控制器。通过读取A端口输入的数据来选择相应的歌曲。每次读取到的数据存入寄存器,与下次读取到的做对比,来判断是否需要切换。切换时,不同开关位状态分别代表不同歌曲,设置的三首音乐分别对应001B,010B,100B。

三 接线图设计

8254:

  • CLK0 => 1Mhz

  • GATE0 => +5V

  • OUT0 => 扬声器

  • CS => 280H~287H

8255:

  • PA0~3 => SW0~3

  • CS => 288H~28FH

四 仿真设计

使用Proteus实现仿真设计,设计图如下所示:

五 程序设计

5.1 程序流程图设计

如下图所示:

5.2 程序源代码

  1. IOBASE EQU 280H
  2. IO8253_MODE EQU IOBASE+06H
  3. IO8253_0 EQU IOBASE+00H
  4. IO8255_MODE EQU IOBASE+0EH
  5. IO8255_A EQU IOBASE+08H
  6. PAGE 50,70
  7. DATA1 SEGMENT
  8. FREQ1 DW 247,277,311,330,370,415,466,494,0
  9. TIME1 DW 100,100,100,100,100,100,100,200,0
  10. FREQ2 DW 311,311,277,311,311,370,311,277,311,247,247,277,311,370,310,277,277,247,277
  11. DW 311,370,311,415,370,415,377,377,311,370
  12. DW 311,277,311,370,311,277,277,247,0
  13. TIME2 DW 100,50,50,200,50,50,50,50,200,100,50,50,50,50,100,100,50,50,200
  14. DW 150,25,25,50,150,50,50,50,50,200
  15. DW 100,50,50,100,50,50,50,200,0
  16. FREQ3 DW 265,294,330,262,262,294,330,262,330,349
  17. DW 392,330,349,392,392,440,392,349,330,262
  18. DW 392,440,392,349,330,262,294,196,262,294
  19. DW 196,262,0
  20. TIME3 DW 50,50,100,100,100,100,100,50,50,100
  21. DW 100,100,100,100,50,50,100,100,100,100
  22. DW 100,100,50,50,100,100,100,100,100,50
  23. DW 100,100,0,0
  24. DATA1 ENDS
  25. STACK1 SEGMENT PARA STACK
  26. DW 100 DUP(?)
  27. STACK1 ENDS
  28. ;====================
  29. CODE SEGMENT
  30. ASSUME CS:CODE,DS:DATA1
  31. ASSUME SS:STACK1
  32. START:
  33. MOV AX,DATA1
  34. MOV DS,AX
  35. MOV AX,0
  36. MOV SI,AX
  37. MOV DX,IO8255_MODE
  38. MOV AL,90H ;A端口方式0输人
  39. OUT DX,AL
  40. MOV DX,IO8253_MODE ;连接8253的控制端口
  41. MOV AL,36H ;定义8253为通道0,方式3
  42. OUT DX,AL ;二进制,先读低位/后读高位
  43. ;;;MUSIC1===
  44. MUSIC1:
  45. LEA DI,FREQ1 ;取偏移地址
  46. LEA BP,TIME1 ;取时间偏移地址
  47. LOOP1:
  48. MOV AX,[DI] ;取时间偏移地址
  49. CMP AX,0
  50. JE MUSIC1
  51. CALL SPEAKER
  52. XOR AX,AX
  53. MOV DX,IO8255_A ;连接8255输入端口
  54. IN AL,DX ;从手动控制端读入控制选择信息
  55. MOV AH,0
  56. CMP AX,SI ;判断输入的信息变化没有,
  57. JZ AAA1 ;没变则表示没有改变原来的选择
  58. MOV SI,AX
  59. CMP AL,1H ;判断输入的信息
  60. JNZ AAA2 ;选择播放那首音乐
  61. JMP MUSIC1
  62. AAA2:
  63. CMP AL,2H
  64. JNZ AAA3
  65. JMP MUSIC2
  66. AAA3:
  67. CMP AL,4H
  68. JNZ AAA1
  69. JMP MUSIC3
  70. AAA1:
  71. ADD DI,2
  72. ADD BP,2
  73. JMP LOOP1
  74. ;;;===MUSIC1
  75. ;;;MUSIC2===
  76. MUSIC2:
  77. LEA DI,FREQ2 ;取偏移地址
  78. LEA BP,TIME2 ;取时间偏移地址
  79. LOOP2:
  80. MOV AX,[DI]
  81. CMP AX,0
  82. JE MUSIC2
  83. CALL SPEAKER
  84. XOR AX,AX
  85. MOV DX,IO8255_A ;连接8255输入端口
  86. IN AL,DX ;从手动控制端读入控制选择信息
  87. MOV AH,0H
  88. CMP AX,SI ;判断输入的信息变化没有,没变
  89. JZ AAA6 ;则表示没有改变原来的选择
  90. MOV SI,AX
  91. CMP AL,1H ;判断输入的信息,选择播放那首音乐
  92. JNZ AAA4
  93. JMP MUSIC1
  94. AAA4:
  95. CMP AL,2H
  96. JNZ AAA5
  97. JMP MUSIC2
  98. AAA5:
  99. CMP AL,4H
  100. JNZ AAA6
  101. JMP MUSIC3
  102. AAA6:
  103. ADD DI,2
  104. ADD BP,2
  105. JMP LOOP2
  106. ;;;===MUSIC2
  107. ;;;MUSIC3===
  108. MUSIC3:
  109. LEA DI,FREQ3 ;取偏移地址
  110. LEA BP,TIME3 ;取时间偏移地址
  111. LOOP3:
  112. MOV AX,[DI]
  113. CMP AX,0
  114. JE MUSIC3
  115. CALL SPEAKER
  116. XOR AX,AX
  117. MOV DX,IO8255_A ;连接8255输入端口
  118. IN AL,DX ;从手动控制端读入控制选择信息
  119. MOV AH,0H
  120. CMP AX,SI ;判断输入的信息变化没有,没
  121. JZ AAA9 ; 变则表示没有改变原来的选择
  122. MOV SI,AX
  123. CMP AL,1H ;判断输入的信息,选择播放那首音乐
  124. JNZ AAA7
  125. JMP MUSIC1
  126. AAA7:
  127. CMP AL,2H
  128. JNZ AAA8
  129. JMP MUSIC2
  130. AAA8:
  131. CMP AL,4H
  132. JNZ AAA9
  133. JMP MUSIC3
  134. AAA9:
  135. ADD DI,2
  136. ADD BP,2
  137. JMP LOOP3
  138. ;;;===MUSIC3
  139. ;========播放音乐子程序========
  140. SPEAKER PROC
  141. PUSH AX
  142. PUSH BX
  143. PUSH CX
  144. PUSH DX
  145. MOV AX,[DI]
  146. MOV BX,AX
  147. MOV DX,0FH
  148. MOV AX,4240H ;送入记数值clk=1MHZ 0x0F4240 = 1000000
  149. DIV BX
  150. MOV DX,IO8253_0 ;将数送入8253计数器中
  151. OUT DX,AL
  152. MOV AL,AH
  153. OUT DX,AL ;将每个音节的时间周期存入CX
  154. ;MOV CX,2710H ;设0.5s的时间周期所需的循环次数
  155. MOV BX,WORD PTR DS:[BP]
  156. ADD BX,BX
  157. ADD BX,BX
  158. LOOP_TIMES:
  159. MOV AX,2710H ;设最小节拍播放时间为0.5s
  160. ADD AX,AX
  161. ADD AX,AX
  162. DELAY_TIME:
  163. DEC AX
  164. JNZ DELAY_TIME
  165. DEC BX
  166. JNZ LOOP_TIMES
  167. POP DX
  168. POP CX
  169. POP BX
  170. POP AX
  171. RET
  172. SPEAKER ENDP
  173. CODE ENDS
  174. END START

六 实验总结

该小程序锻炼了包括8086汇编语言的编写、各元器件微机接口的运用等。

扬声器发出了音乐声,总体效果还行,第一首是声调测试,1234567;第二首是菊花台;第三首是两只老虎。其中,两只老虎的曲调是百度到的,实际播放节拍不对,推测是时钟信号频率不同导致的。

上传的附件 cloud_download 基于汇编语言的音乐盒设计与实现.7z ( 82.99kb, 23次下载 )
error_outline 下载需要6点积分

发送私信

睡一个慵懒的午觉,我总以为明天会更好

8
文章数
13
评论数
最近文章
eject