实验六 音乐发生器接口实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

湖北科技学院计算机科学与技术学院《微机接口技术》实验报告

学号: 124221031 姓名:李亮亮

实验题目:音乐发生器接口实验报告

指导老师:范建军

实验日期: 2014.12.26

一、实验目的

通过音乐发生器实验,学习如何利用8253定时/计数器进行声音控制电路的设计原理与方法。

二、实验内容

基本实验 程序执行,开始演奏儿歌“两只老虎”,歌曲结束或按任意键停止演奏。

三、实验要求

利用MFID 实验平台和音乐发生器模块进行硬件连接,利用MF2KI 集成开发环境进行音乐发生器控制程序设计,调试,直至听到正常的乐曲。

四、实验原理

1.音乐发生器驱动模块电路原理如图2.1.12所示。模块包含喇叭SPK ,LM386A ,74LS08,以及74LS245和LED 等。其中LED 是配合演奏音乐时产生发光效果而设置的。

图2.1.12 音乐发生器模块板电路原理框图

2.利用8253控制发声原理与方法的详细阐述,参考“微机接口技术及应用”教材第3.3节(P43)。

五、实验资源配置

1.电源:机内供电,将平台的电源开关拔到“内”的位置上,并将模块电源JP7接通 2.电缆线:采用单线/20芯扁平线

3.本实验所用到资源:E (8253),F (8255)Q (音乐发生器)L (跳线)四个模块 4.I/O 端口地址:8255的4个端口地址为300H ~303H 。其中A 口=300H ,B 口=301H ,C 口=302H ,命令口=303H 。8253的四个端口地址为304H ~307H 。其中通道0为304H,通道1为305H,通道2为306H,命令口为307H

5.软件资源:MF2KI 集成开发环境软件提供了丰富的汇编语言和C/C++语言程序开发工

20

芯 定 时 器 / 并 行 口 插 座

50 芯 扩 展 总 线

排 阻

六、实验的硬件连接与软件编程

1.硬件连接:

F区Q区E区

PC0 门控(启/停)

(控制)音调OUT2

2.音乐发生器控制参考程序

①流程图

A.ASM流程图如图2.1.13所示,包括一个主程序和一个延时子程序。

B.CPP流程图如图2.1.14所示。

开始

初始化8255和8253

取歌曲的第一个音符的频率和时延

是否按了任意键或遇到了音符频率的结束

根据频率计算计数初值并送往8253 置8255的PC 6、PC 0为1,使扬声器发声

调用延时子程序

置8255的PC 6、PC 0为0,再次关闭扬声器

返回DOS

置8255的PC 6、PC 0为0,关闭扬声器

取下一个音符的频率和时延

结束

Y

N

主程序流程图

初始化歌曲的频率及时延 (a )主程序

获取并保存中断1CH 的中断向量 向中断1CH 装入新的中断向量

音符的延时次数已到?

恢复中断1CH 原来的中断向量

N

Y

延时子程序流程图

图2.1.13 音乐ASM 程序流程图

(b )延时子程序

实验代码:

;*------------------------------------------------------*/

;* Music.asm(音乐发生器接口实验) */ ;* 音乐发生器程序Source File */ ;* Copyright (c) 2001 by HUST */ ;* Modify Date 2005.4.10 */

;*------------------------------------------------------*/

sstack segment stack

dw 200 dup(?) sstack ends

data segment

bg db 'Two tigers ...' db 0ah,0dh

db 'press any key to stop! ',0ah,0dh,'$'

开始

获取中断0X1C 的中断向量

设置新中断向量 初始化8255 初始化8253 取歌曲的第一音符的

频率及时延

是歌曲的结束符或任意键按下?

按音符频率计算计数初值并装入8253 打开扬声器 置PC 6=1,PC 0=1

音符的延时到否?

关闭扬声器 置PC 6=0,PC 0=0 取下一个音符的频率 与时延

关闭扬声器

置PC 6=0,PC 0=0 恢复中断0X1C 的中断向量

结束

Y

N

Y

N

图2.1.14 音乐CPP 程序流程图

freq dw 2 dup(262,294,330,262) ;"两只老虎"乐曲中,音符的频率(音阶)dw 2 dup(330,349,392) ;其中,0频率表示结尾

dw 2 dup(392,440,392,349,330,262)

dw 2 dup(294,196,262),0

time dw 10 dup(8),16,8,8,16 ; "两只老虎"乐曲中,音符的延时(节拍)dw 2 dup(4,4,4,4,8,8) ;其中4,8,16表示延时的次数

dw 2 dup(8,8,16)

old_seg dw ?

old_off dw ?

data ends

code segment

assume cs:code, ds:data, ss:sstack

star proc far ;程序开始

mov ax,data

mov ds,ax

mov ax,sstack

mov ss,ax

push di ;寄存器压栈

push si

push bp

push bx

mov al,90h ;8255初始化

mov dx,303h

out dx,al

mov al,0ch ;关闭8253的T2计数器(8255的PC6=0)

mov dx,303h

out dx,al

mov al,00h ;关闭喇叭(8255的PC0=0)

mov dx,303h

out dx,al

mov al,0b6h ;8253初始化

mov dx,307h

out dx,al

mov dx,offset bg ;显示提示信息

mov ah,9

int 21h

mov si,offset freq ;设置频率指针→si

mov bp,offset time ;设置延时指针→bp

pp: mov ah, 0bh ;检测是否有任意键按下?

int 21h

cmp al,00

jne end_sing ;若有,则结束演凑

mov di,[si] ;取1个音符的频率→di

cmp di,0 ;检测是否是乐曲结尾

je end_sing ;若是,则结束演凑

mov dx,12h ;计算音符的频率所对应的8253计数初值

mov ax,34dch ;1.19318MHz

div di

mov dx,306h ;向8253装入计数初值

out dx,al ;先装低字节

mov al,ah

out dx,al ;再装高字节

mov dx,303h ;打开喇叭(8255的PC0=1)

mov al,01h

out dx,al

mov al,0dh ;打开8253的T2(PC6=1),开始发声

相关文档
最新文档