《微机接口技术》实验报告
学号: 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++语言程序开发工具
六、实验的硬件连接与软件编程
1.硬件连接:
| F区 | Q区 | E区 |
| PC0 | 门控(启/停) | |
| (控制)音调 | OUT2 |
①流程图
A.ASM流程图 如图2.1.13所示,包括一个主程序和一个延时子程序。
B.CPP流程图 如图2.1.14所示。
实验代码:
;*------------------------------------------------------*/
;* 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,'$'
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),开始发声
out dx,al
mov bx,ds:[bp] ;取1个音符的延时次数→bx
call time_delay ;调用延时子程
mov dx,303h ;关闭8253的T2(PC6=0)
mov al,0ch
out dx,al
mov al,00h ;关闭喇叭(PC0=0)
out dx,al
add si,2 ;取下1 个音符的频率
add bp,2 ;取下1 个音符的延时次数
jmp pp ;继续
end_sing:
mov dx, 303h ;关闭8253的T2
mov al, 0ch
out dx, al
mov al, 00h ;关闭喇叭
out dx, al
pop bx ;寄存器出栈
pop bp
pop si
pop di
mov ax,4c00h ;返回DOS
int 21h
star endp
new_intr proc ;新中断服务程序
dec bx ;该服务程序只将延时次数-1
iret
new_intr endp
time_delay proc near ;延时子程序
pushf ;压栈
push ds
push es
push bx
mov ah,35h ;取原中断(INT1CH)的向量,并保存
mov al,1ch
int 21h
mov old_off, bx
mov bx, es
mov old_seg, bx
pop bx
pop es
push ds
mov ah, 25h ;设置新中断服务程序的向量
mov al, 1ch
mov dx, seg new_intr
mov ds,dx
lea dx, new_intr
int 21h
pop ds
TD: cmp bx,0h ;延时次数已到?
jnz TD ;未到,则继续
mov ah,25h ;已到,则恢复原中断向量
mov al,1ch
mov dx,old_seg
push dx
mov dx,old_off
pop ds
int 21h
pop ds
popf
;time delay end
ret
time_delay endp
code ends
end star ;程序结束下载本文