视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
实验六 音乐发生器接口实验
2025-09-25 23:12:39 责编:小OO
文档
湖北科技学院计算机科学与技术学院

《微机接口技术》实验报告

学号: 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
 2.音乐发生器控制参考程序

①流程图

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                         ;程序结束下载本文

显示全文
专题