实验六 音乐发生器接口实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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),开始发声