微机原理及接口技术音乐发生器实验
- 格式:doc
- 大小:75.00 KB
- 文档页数:8
微机原理与汇编作业音乐程序实验目的: 了解 IBM PC/XT 机内发音电路原理及发音电路中各接口芯片的作用。
掌握8253定时/记数器芯片和8255并行接口芯片的编程方法。
掌握音乐程序的设计、编程方法。
实验内容: 编程, 使计算机扬声器演奏乐曲《新年好》。
计算机发音的软、硬件基础:计算机扬声器控制电路如下图8253时钟频率1.19318Mhz扬声器控制电路由上图可见, 计算机扬声器的发音由机内 8253 芯片(定时/计数器)和8255 芯片 (并行接口) 共同控制。
当 8255 PB0 端(B 口 0 端•)•为•1 •时,8253 通道 2 的输出端 (OUT2)便输出一定频率的方波信号; 当 8255 PB1 端(B 口 1 端) 也为 1 时, 此信号就可经驱动、低通后送往扬声器发音。
8253 OUT2 端输出方波的频率取决于通道2设置的分频值, 频率值与分频值的关系为:1.19318MHz/频率值=1234dch/频率值=分频值(其中 1.19318MHz 是 8253 的时钟频率)设置 8253 芯片, 使扬声器发音的程序段为:mov al,0b6h (8253 初始化: 选通道 2, •输出方波信号。
•out 43h,al 43H 是 8253 芯片控制口的口地址)mov dx,12hmov ax,34dchdiv di (计算分频值, 赋给 ax。
di 中存放声音的频率值。
)out 42h,almov al,ah (向通道 2 写入分频值, 先写低字节, 后写高字节。
out 42h,al 42H 是 8253 芯片通道 2 的口地址). . . (软件延时)设置 8255 芯片, 扬声器进行开/关操作的程序段为:in al,61hmov ah,al (读取 8255 B口的八位数据。
61H 是 8255 B口的口地址)or al,3 (所读数据和 3 相或, 使低两位置 1)out 61h,al (将相或后的数据再写入 8255 B口, 开扬声器)......mov al,ahout 61h,al (将读取的原数据再写入 8255 B口, 关扬声器)需编程演奏的乐曲如下:C 调音符和发音频率(Hz)的对应关系如下表:音符频率音符频率音符频率1 138 1 262 1 5242 147 2 294 2 5873 165 3 330 3 6594 175 4 349 4 6985 196 5 392 5 7846 220 6 440 6 8807 247 7 494 7 988其中,每个音符的音长由软件延时实现。
信息科学与技术学院微机原理与接口技术课程设计报告题目名称:基于PROTEUS实现音乐播放器的设计学生姓名:王浩宇关问鼎徐然冉启幸学号: 05 51 24 78专业班级: 13 电信指导教师:刘恩博2015年 7月 9 日目录一.课程设计题目基于PROTEUS实现音乐播放器的设计二.课程设计任务及要求设计要求:1.实现播放音乐;2.实现多首音乐连续播放和选择播放;3.要求通过PROTUES完成此项功能,并完成PCB电路图。
三.总体方案与设计说明每个音符的对应频率表1 每个音符的对应频率设计说明该音乐播放器通过用8086中央处理器、74LS373地址锁存电路、74LS138译码电路、定时/计数器8253A来实现功能。
8086中央处理器输出地址码A16-A19和数据AD0-AD15,将AD0-AD7输入地址锁存器输出A0-A7,再将A0-A7通过译码器进行译码输出作为8253的片选信号,8253产生不同频率的脉冲来模拟音符,通过时间的长短来模拟音长,从而设计出一个功能完整的音乐播放器。
四.硬件电路设计及描述芯片介绍(1)8086中央处理器8086中央处理器是Intel系列的16位微处理器,有16根数据线和20跟地址线。
它主要由执行部件EU(Execution Unit)和总线接口部件BIU(Bus interface Unit)两部分组成。
8086拥有四个16位的通用寄存器,也能够当作八个8位寄存器来存取,以及四个16位索引寄存器(包含了堆栈指标)。
资料寄存器通常由指令隐含地使用,针对暂存值需要复杂的寄存器配置。
它提供64K 8 位元的输出输入(或32K 16 位元),以及固定的向量中断。
大部分的指令只能够存取一个内存位址,所以其中一个操作数必须是一个寄存器。
运算结果会储存在操作数中的一个。
为了能够简单有效地进行对8086操作,故采用最小模式进行工作。
要使8086处于最小模式,首先要将MN/MX端置为高电平。
微机原理与接口技术课程设计论文题目:音乐流水灯姓名:鞠强学号:201330020228班级:1330202专业:自动化2015年6月一、实验任务及要求任务:1、掌握综合使用基本输入输出设备、通用接口芯片、专用接口芯片的方法;2、掌握实时处理程序的编制和调试方法。
要求:用8255、8253、8259配合8086使蜂鸣器发出唱歌声同时还能够使用数码管进行边跳舞边唱歌实验。
二、硬件连线键盘的控制、LED显示模块:采用74系列模块控制键盘的行信号Q_0、Q_1、Q_2、Q_3分别与开放的输入信号Q0、Q1、Q2、Q3相连,键盘的列信号P_0、P_1、P_2和开放的输出信号P0、P1、P2相连。
74芯片的片选信号CS1接地址译码信号340H, CS2接地址译码信号360H。
蜂鸣器发声控制:由8255模块控制;PC0直接与蜂鸣器相连,CS_4连接到实验仪中部的地址输出端CS_4中断处理模块:由8259控制8259的片选CS-1连地址输出300H,INT1连总线输入INTR,8259模块的INT-A连总线的INTA,8259的SP/1连+5V, 8259的IRQ0连接到8253的OUT0。
三、程序流程图主程序初始化各阶段寄存器及相关变量初始化8253、8255芯片设置中断向量、开放8253中断屏蔽开放处理器中断中断服务程序保护现场判断时间是否不小于59分55秒报时扫描键盘G 键?调用启停子程序S COUNT COUNT=40? ADDONE 子程序COUNT 清0显示时间,调用显示时间子程序结束中断(发EOI 命令)恢复现场中断返回Y YN Y四、实验源代码DATA SEGMENT AT 0 USE16ORG 1000HHOUR DW ?MIN DW ?SEC DW ?SLL DB ?COUNT DB ?DATA ENDSCODE SEGMENT USE16ASSUME CS:CODE,DS:DATAORG 1500HBEG:JMP STARTTAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,00H ;0~F 的共阴极七段译码表00H表示不显示任何东西KEYCOD DB 0EEH,0DEH,0BEH,0EDH,0DDH,0BDH,0EBH,0DBH,0BBH,0E7H,0D7H,0B7H ;行列编码值KEYV AL DB 0,1,2,3,4,5,6,7,8,9,0AH,0BH ;所有键的键面值PORT1 EQU 340H ;数码管段选端口PORT2 EQU 360H ;数码管位选端口,键盘矩阵的行列端口START: MOV EAX,60000000HMOV CR0,EAXMOV AX,DATAMOV DS,AXMOV HOUR,0203H ;小时分钟以及秒的初始化MOV MIN,0509HMOV SEC,0502HLEA BX,TABMOV SLL,0 ;开始暂停标志位置0MOV COUNT ,0 ;中断次数计数初始值为0;8255初始化,用于产生报时的脉冲MOV EAX,80808080H;控制字MOV DX,20CH ;后面的是4个8255的控制端口20C-20F (这个地址由实验台决定)OUT DX,EAX ;初始化8255,A、B、C口均为方式0输出MOV DX,20BHMOV AL,0FFHOUT DX,AL;8253初始化,用于产生周期为25ms的中断MOV AL,00110110B ;计数器0,先低后高,方式三,二进制MOV DX,32cH ;写往控制口OUT DX,ALMOV DX,320H ;计数器0写初值:47KHz*25msMOV AX,1175OUT DX,ALMOV AL,AHOUT DX,ALMOV AL,0FEH ;IR0开屏蔽OUT DX,ALXOR AX,AX ;装载中断向量MOV ES,AXMOV DI,08H*4MOV AX,OFFSET INTSRMOV ES:[DI],AXMOV AX,SEG INTSRMOV ES:[DI+2],AXSTI ;开中断JMP $INTSR PROC ;中断服务程序CMP MIN,0509H ;比较当前时间是否在59分55秒~00分00秒之间JL NEXT1CMP SEC,0505HJL NEXT1MOV DX,20BHMOV AL,00H ;蜂鸣器低有效,报时OUT DX,ALJMP NEXT2NEXT1: CMP MIN,0JNE NEXT3CMP SEC,0JNE NEXT3MOV DX,20BHMOV AL,00H ;蜂鸣器低有效,报时OUT DX,ALJMP NEXT2NEXT3: MOV DX,20BHMOV AL,0FFHOUT DX,ALNEXT2: CMP COUNT,20 ;用8255产生0.5ms的蜂鸣JLE NEXT4MOV DX,20BHMOV AL,0FFHOUT DX,ALNEXT4:CMP SLL,0JZ LOBCALL TSTARTLOB: CALL KEYCHECK ;检测有无键按下CMP AL,0AH ;启停键按下,调用启停程序JNZ NEXT5CALL TSTARTJMP NEXT6NEXT5: CMP AL,0BH ;设置键按下,调用设置时间程序JNZ NEXT6CALL SETTIMEINTSR ENDPTSTART PROC ;控制时间暂停和开始。
北邮微机原理硬件实验-实验报告微机原理与接口技术硬件实验报告姓名:曹爽学号:2013210640班级:20132111242016年1月10日目录实验一:熟悉实验环境及IO的使用 (5)一、实验目的5二、实验内容及要求5三、实验步骤5四、程序流程图6五、源代码6六、思考题7七、实验结果和心得体会8实验二:8255A并行接口应用 (9)一、实验目的9二、实验内容及要求9三、实验步骤10四、程序流程图11五、源代码12六、实验结果和心得体会16实验三:8253计数器/定时器的应用 (17)一、实验目的17二、实验内容及要求17三、8253定时器17四、电路的调试与连接18五、实验连接图18六、程序流程图20七、源代码21八、思考题23九、实验结果和心得体会23实验一:熟悉实验环境及IO的使用一、实验目的1.通过实验了解和熟悉实验台的结构、功能及使用方法。
2.通过实验掌握直接使用Debug 的I、O命令来读写IO 端口。
3.学会Debug 的使用及编写汇编程序。
二、实验内容及要求1.学习使用Debug命令,并用I、O命令直接对端口进行读写操作。
2.用汇编语言编写跑马灯程序。
(使用EDIT编辑工具)实现功能。
A. 通过读入端口状态(ON为低电平),选择工作模式(灯的闪烁方式、速度等)。
B. 通过输出端口控制灯的工作状态(低电平灯亮)。
注意:电源打开时不得插拔电缆及各种器件。
连接电路时一定要在断电的情况下连接,否则可能会烧坏整个实验系统。
三、实验步骤这里仅简要叙述利用EDIT工具编写汇编写跑马灯程序的步骤。
编写:C>EDIT 文件名.asm编译:C>MASM 文件名.asm连接:C>LINK 文件名.obj运行:C>文件名.exe或用Debug进行调试。
四、程序流程图图1.4.1 程序流程图五、源代码CODE SEGMENTASSUME CS:CODESTART: MOV AH,0FEH ;将初始灯设为右起第1灯亮LOOP0: MOV DX,0EEE0H ;将I/O端口地址设为EEE0IN AL,DX ;从端口读入数据,提取拨码开关右起第3位状态AND AL,20HCMP AL,20HJNZ STOP ;若状态为‘0’,则保持位置不变,暂停IN AL,DX ;提取拨码开关右起第2位状态AND AL,40HCMP AL,40HJNZ FAN ;若状态为‘0’,则右移亮灯位置ROL AH,1 ;左移亮灯位置STOP: JMP DISPFAN: ROR AH,1DISP: MOV AL,AHOUT DX,AL ;输出到端口,亮灯MOV CX,8000H ;外循环次数MOV BX,8000H ;内循环次数LOOP1: DEC BXJNZ LOOP1 ;内循环,BX减少到0MOV BH,80H ;重设内循环次数80H次IN AL,DXAND AL,10HCMP AL,10H ;提取拨码开关右起第4位状态JNZ S ;若为‘1’,则设置内循环次数为10H次MOV BH,10HS: LOOP LOOP1 ;外循环,CX减少到0IN AL,DXAND AL,80HCMP AL,80H ;提取拨码开关右起第1位状态JNZ LOOP0 ;若为‘0’,则继续显示,否则结束程序MOV AH,4CHINT 21HCODE ENDSEND START六、思考题通过实验说明用debug中的a命令录入实验中给出的小程序中,有些语句可以不写出“h”字符的原因。
课程设计(论文)
课程名称:微型计算机基本原理与接口技术
题目:音乐发生器设计
院(系):信息与控制工程系
专业班级:电子信息科学与技术
姓名:
学号: 201206030110
指导教师:张爱萍
2015年 1 月 23 日
摘要
音乐发生器实现的一个主要步骤是乐谱编程。
通过相应的频率表将乐谱中对应的音符转换为计数器的初值,节奏通过延时子程序利用硬件实现频率计数和延时时间的控制,利用8253和8255a 使8253的通道2工作在“方波发生器”模式,实现对频率的计数。
知道了音调与频率和时间的关系,就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表。
用发生器能演奏一首完整的歌。
关键词:定时计数器8253,8255A可编程并行接口,音乐发生器
目录
1绪论 (1)
2设计原理 (2)
3设计程序 (4)
4系统联调 (9)
5总结 (10)。
HUNAN CITY UNIVERSITY微机原理与接口技术实验报告实验题目:音乐发生器接口实验专业:计算机科学与技术(嵌入式方向)学生姓名:李国红班级学号: 1006402-20分组成员:蔡祥1106402-09 吕赟1106402-38 指导教师:刘德峰2013 年5月13日一、实验时间2013年5月13日9:40~11:40二、实验地点一实验楼321机房三、设计课题 音乐发生器接口实验 四、实验目的通过音乐发生器实验,学习如何利用8253定时/计数器进行声音控制电路的设计原理与方法。
五、实验小组成员李国红1106402-20 蔡祥1106402-09 吕赟1106402-38六、实验原理1.音乐发生器驱动模块电路原理如图2.1.12所示。
模块包含喇叭SPK ,LM386A ,74LS08,以及74LS245和LED 等。
其中LED 是配合演奏音乐时产生发光效果而设置的。
图2.1.12 音乐发生器模块板电路原理框图2.利用8253控制发声原理与方法的详细阐述,参考计算机接口技术相关参考书.七、算法及流程图20 芯 定 时 器 / 并 行 口 插 座50 芯 扩 展 总 线实验现象:启动程序,音乐发生器奏出两只老虎的音乐.8个LED 全亮. 按ESC 键停止.主程序流程图(a )主程序图2.1.13 音乐ASM 程序流程图(b )延时子程序图2.1.14 音乐CPP程序流程图八、实验步骤步骤一:硬件连线跳线设置:将电源模块的JP7跳接.单线连接如右图:排线连接如右图:步骤二:将平台的电源开关拔到“内”的位置上。
在配套集成环境下进行硬件检测,达到初始化芯片的目的步骤三:(示实验步骤)打开集成环境在“演示实验”菜单下点开“基本接口实验”。
在“基本接口实验”中的“定时记数器实验”中选择“音乐发生器”实验进行演示。
步骤四:(学生实验步骤)打开集成环境在“文件”菜单下学生可以选择新建自己的C++/ASM文件或者集成环境自带的C++/ASM参考程序进行调试、运行。
实验报告(2016 / 2017 学年第二学期)课程名称微机原理与接口技术实验名称音乐播放程序设计实验时间2017 年 6 月13 日学院电子信息学院指导教师严华学生学号学院(系) 电子信息学院专业光电信息科学与工程1、实验目的通过编写程序控制8253和8255A芯片,实现一个简单的音乐播放程序。
2、实验原理我们在这次课设选择了音乐程序设计,音乐程序设计可以实现至少两首歌的可选择播放。
对于歌曲的播放我们采用的是计数器/定时器8253芯片,而对于选择哪首歌播放则是利用可编程并行接口8255A芯片来实现的。
基于8253定时计数接口芯片的工作原理,本次课设实现了音乐演奏系统程序设计。
当运行程序时,扬声器便发出优美的音乐。
首先要解决发声并发出相应音符声音的问题,由8253计数器0在初始化时用来产生一定频率的方波来使扬声器发声,再根据不同音符对应的频率写入计数初值发出相应的音符声。
对8255芯片PA0和PA1口的置0和1来控制扬声器的开关。
其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把[SI]是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。
3、实验容A.实验环境搭建B. 编程由于选取的乐曲音符音调幅度较大,故利用表格,算出其初值计数初值= 1193180 (8253输入频率)/ 音符频率以下为程序代码#include <dos.h>#include <stdio.h>#define INIT_T2 0xb6#define PORT_T2 0x42#define CTRL_T 0x43#define PORT_PB 0x61#define DDO 4554#define DRUI 4058#define DMI 3616#define DFA 3419#define DSO 3044#define DLA 2712#define DXI 2415#define DO 2281#define RUI 2033#define MI 1811#define FA 1709#define SO 1522#define LA 1356#define XI 1208#define GDO 1140#define GRUI 1015#define GMI 905#define GFA 854#define GSO 761#define GLA 678#define GXI 604void sing(unsigned int frq,unsigned int ms) {unsigned char value;union{unsigned int divisor;unsigned char d[2];}tone;if (frq!=0){tone.divisor=frq;outportb(CTRL_T,INIT_T2); outportb(PORT_T2,tone.d[0]); outportb(PORT_T2,tone.d[1]);value=inportb(PORT_PB); outportb(PORT_PB,(value|0x03));}delay(ms);outportb(PORT_PB,(value|0xfc)); }void main(){sing(DSO,400);sing(DLA,400);sing(DO,400);sing(RUI,400);sing(MI,600);sing(RUI,200);sing(RUI,400);sing(DO,400);sing(DLA,1600);sing(0,1600);sing(DSO,400);sing(DLA,400);sing(DO,400);sing(RUI,400);sing(MI,400);sing(SO,800);sing(RUI,2000);sing(0,2000);sing(RUI,800);sing(DSO,400);sing(RUI,400);sing(RUI,400);sing(MI,400);sing(RUI,400);sing(DO,1600);sing(0,2000);sing(RUI,400);sing(RUI,400);sing(RUI,400);sing(DSO,400);sing(DLA,400);sing(DO,400);sing(DLA,2000);sing(0,2000);sing(FA,800);sing(FA,400);sing(MI,400);sing(RUI,400);sing(DO,400);sing(0,2000); sing(RUI,400); sing(RUI,400); sing(RUI,400); sing(RUI,400); sing(DSO,400); sing(DLA,400); sing(DO,400); sing(DLA,2000); sing(0,2000); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(LA,2000); sing(0,2000); sing(LA,400); sing(LA,400); sing(LA,400); sing(GDO,400); sing(LA,400); sing(LA,400); sing(SO,2000); sing(0,2000); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(LA,400); sing(GDO,400); sing(LA,2000); sing(0,800); sing(SO,400); sing(LA,400); sing(GRUI,400); sing(GMI,2800); sing(GRUI,3200); sing(0,1600); sing(SO,400); sing(LA,400); sing(GDO,400); sing(GRUI,400); sing(GMI,600); sing(GRUI,200); sing(GRUI,400); sing(GDO,400); sing(LA,3200); sing(SO,400); sing(LA,400);sing(GRUI,400); sing(GMI,600); sing(GSO,600); sing(GRUI,3600); sing(0,400); sing(GRUI,400); sing(GRUI,400); sing(SO,400); sing(GRUI,400); sing(GRUI,400); sing(GMI,400); sing(GRUI,400); sing(GDO,3200); sing(0,400); sing(GRUI,400); sing(GRUI,400); sing(GRUI,400); sing(SO,400); sing(LA,400); sing(GDO,400); sing(LA,3600); sing(0,1600); sing(LA,3200); sing(0,400); sing(GFA,400); sing(GFA,400); sing(GFA,400); sing(GMI,400); sing(GRUI,400); sing(GDO,400); sing(GMI,400); sing(GRUI,1600); sing(0,1600); sing(0,400); sing(GFA,400); sing(GFA,400); sing(GLA,400); sing(GSO,400); sing(GFA,400); sing(GMI,400); sing(GRUI,2000); sing(0,2000); sing(GRUI,400); sing(GRUI,400); sing(SO,400); sing(GRUI,400); sing(GRUI,400); sing(GMI,400); sing(GRUI,400); sing(GDO,1600); sing(0,2000);sing(GRUI,400);sing(GRUI,400);sing(SO,400);sing(LA,400);sing(GDO,400);sing(LA,3600);}运行结果如下4、实验中遇到的问题一开始程序中的#define DDO 4554语句为#define 1DO 4554,程序运行时显示编译出错,我意识到1DO有可能不符合宏名定义要求,通过查阅有关资料后发现,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线,随后修改了程序。
河南科技学院《微机原理及接口技术》课程设计报告题目:电子音乐小组成员:指导老师:完成时间:2014年6月5号目录1.设计目的................................................................................... 错误!未定义书签。
2.设计要求与内容....................................................................... 错误!未定义书签。
3.设计及原理............................................................................... 错误!未定义书签。
3.1设计思路....................................................................... 错误!未定义书签。
3.2硬件总体框图(总体框图后再分别对各模块电路说明)错误!未定义书签。
4.软件设计................................................................................... 错误!未定义书签。
5.总结........................................................................................... 错误!未定义书签。
6 参考文献.................................................................................. 错误!未定义书签。
7附录(一般附上源程序代码)............................................... 错误!未定义书签。
第1篇一、实验目的1. 理解微机原理中音频信号处理的基本概念和原理。
2. 掌握音频信号的采集、处理和播放的实验方法。
3. 通过实验加深对音频数字信号处理的理解和应用。
二、实验原理音频信号处理是微机原理中一个重要的组成部分,主要包括音频信号的采集、处理和播放。
本实验主要涉及以下原理:1. 音频信号的采集:通过麦克风将模拟音频信号转换为数字信号。
2. 音频信号的处理:对采集到的数字音频信号进行采样、量化、编码等处理。
3. 音频信号的播放:将处理后的数字音频信号通过扬声器播放出来。
三、实验设备1. 微机原理实验平台2. 麦克风3. 扬声器4. 信号发生器5. 示波器6. 调制解调器四、实验步骤1. 音频信号的采集1.1 连接麦克风和实验平台,确保麦克风与信号发生器连接正确。
1.2 打开实验平台,设置采样频率和量化位数,确保音频信号的采集质量。
1.3 使用信号发生器产生一个正弦波信号,通过麦克风采集并显示在实验平台上。
2. 音频信号的处理2.1 对采集到的音频信号进行采样,采样频率为44.1kHz。
2.2 对采样后的音频信号进行量化,量化位数为16位。
2.3 对量化后的音频信号进行编码,编码格式为PCM(脉冲编码调制)。
2.4 将编码后的音频信号存储到实验平台的内存中。
3. 音频信号的播放3.1 将存储在内存中的音频信号通过扬声器播放出来。
3.2 使用示波器观察播放的音频信号波形,确保音频信号的播放质量。
五、实验结果与分析1. 音频信号的采集通过实验,成功采集到信号发生器产生的正弦波信号,并显示在实验平台上。
2. 音频信号的处理通过实验,成功对采集到的音频信号进行采样、量化、编码等处理,并将处理后的音频信号存储到实验平台的内存中。
3. 音频信号的播放通过实验,成功将处理后的音频信号通过扬声器播放出来,并使用示波器观察播放的音频信号波形,确保音频信号的播放质量。
六、实验总结1. 通过本次实验,我们深入了解了微机原理中音频信号处理的基本概念和原理。
微机原理及接口技术音乐发生器实验姓名:学号:学科专业:指导教师:1 需求分析1.1 利用8253定时/计数器进行声音控制电路的设计,产生不同频率的音频电信号。
1.2利用MFID实验平台和音乐发生器模块进行硬件连接,利用MF2KI集成开发环境进行音乐发生器程序设计,调试,直至听到正常的乐曲。
1.3 当程序执行时,开始演奏“First Love”,歌曲结束或按任意键停止演奏。
2 概要设计2.1硬件设计本例硬件设计分两个部分,一部分是频率发生器设计,其硬件电路原理如图2.1.1所示。
采用计数通道0(T0),工作在3方式,输出OUT。
连到扬声器,控制发声,GATE0由PC5控制,CLK0=1.19318MHZ。
另一部分是定时器设计,本例利用系统的资源,即利用BIOS的软件中断INT1CH,进行定时,故不需自行设计硬件。
2.2 软件设计包括1个主程序(main),1个发声子程序(sound),1个延时子程序(time_delay)以及1个修改后的软中断INT1CH的服务程序。
它们之间的关系是:主程序调用发声子程序,发声子程序又调用延时子程序。
其中,发声子程序是利用定时器,发出指定频率(在DI中设定频率)和指定持续时间(在BX中设计55ms的倍数)的声音。
主程序的主要功能是循环将乐曲中每个音符的频率与延时数据分别送到DI与BX中,直到乐曲末尾,并调用发声子系统,使其产生音乐。
延时子程序的延时,是采用定时中断INT1CH来实现,它每隔55ms由硬件定时中断调用1次,把调用次数累加起来就是延时此,延时子程序实际上就是对INT1CH 软中断进行计数的时间。
3详细设计3.1 实验资源配置3.1.1 电源:机内供电,将平台板JP-1跳接块置于1-2位置。
3.1.2 I/O端口地址:8253的四个端口地址分配。
3.1.3 电缆线:采用20芯扁平电缆。
3.1.4软件资源:MF2KI集成环境与工具软件。
3.2 实验原理3.2.1音乐乐曲的两个基本要素是音高和节拍。
因此,要产生一个歌曲的音乐就要对音高和节拍进行控制。
音高是指每个音符发声的高低,即音符的频率。
节拍是指每个音符发声的长短,即音符持续的时间,也就是延时。
因此,组成乐曲的每个音符的频率值和持续时间是编写歌曲音乐程序所需要的两个数据。
音符的频率根据声学原理,8度音阶与频率之间有固定的关系,音符-频率关系如表3.2.1所示。
(图2.2.1)符号-频率对照表:(3.2.1)3.2.2音符的持续时间要根据乐曲的速度及每个音符的节拍数来确定。
在4/4拍中,四分音符为1拍,每小节4拍,全音符持续4拍,二分音符持续2拍,四分音符持续1拍,八分音符持续半拍。
如果给全音符分配1秒的时间,则二分音符的持续时间为0.5秒,四分音符的持续时间为0.25秒,八分音符的持续时间为0.125秒。
音符-延时对照表3.2.3程序设计:sstack segment stackdw 200 dup(?)sstack endsdata segmentbg db 'Two tigers ...'db 0ah,0dhdb 'press any key to stop! ',0ah,0dh,'$'freq dw 494,440,392,349,262,262,392, 440,392, 392,349dw 494,440,392,349,262,262, 349, 349,330,262,220,262dw 262,294,175,196,220,175, 175,196, 175,165, 175, 175dw 175, 175,262,262,175,165,220,220,196,175,165dw 175,394,175,196,220,175,220,247,220,175,131,165dw 175,262,262,220,220,247262,247,220,175,196,220dw 220,175,220,394,330,330,330,349,330,262,220,294,294dw 175,220,349,330,330,349,392,392,349,349,392,440,392,392,349dw 330,349,349,349,349,330,330,349,392,262,523,523,523dw 131,440,392,440,392,392,349,392,392,392,440,349,330,349dw 349,440,392,440,392,349,392,392,392,392,440,349,330,349dw 349,440,392,440,392,349,392,440,494,523,523,494,440,392, 349dw330,349,392,440,349,294,392,330,349,349,440,392,440,392,392,349, 392 dw392,440,349,330,349,349,440,440,349,392,440,494,523,523,523,494,349dw 440,392,349,330,349,392,440,349,523,262,494,440,349,392,392,349time dw 16,8,8,8,4,8,32,16,8,8,32dw 16,8,8,8,4,4,8,8,8,16,16,24,dw 16,8,8,8,4,16,8,4,24,8,4,4,32dw 16,8,8,8,4,8,32,16,8,8,32dw 16,8,8,8,4,4,8,8,8,16,16,24dw 16,16,8,4,16,8,4,4,8,4,4,32dw 16,8,8,8,4,8,4,4,8,4,8,4,4,8,16,8dw 16,8,4,8,8,8,4,4,8,4,8,4,4,32,32dw 32,16,8,8,32,32,8, 16,8,4,8,8,8,dw 16,16,24,32,8,8,4,16,32,16,16,16,8,8dw 16,16,24,32,8,8,4,16,32,16,16,16,8,8dw 6,8,4,8,8,8,4,4,8,4,8,4,4,32,32dw 16,16,24,32,8,8,4,16,32,16,16,16,8,8,32,32dw 16,8,8,8,4,8,4,4,8,4,8,4,4,8,16,8,32dw 16,8,8,8,4,8,4,4,8,4,8,4,4,8,16,8,32dw 16,8,4,8,8,8,4,4,8,4,8,4,4,32,32,32old_seg dw ?old_off dw ?data endscode segmentassume cs:code, ds:data, ss:sstackstar proc far ;程序开始mov ax,datamov ds,axmov ax,sstackmov ss,axpush di ;寄存器压栈push sipush bppush bxmov al,90h ;8255初始化mov dx,303hout dx,almov al,0ch ;关闭8253的T2计数器(8255的PC6=0)mov dx,303hout dx,almov al,00h ;关闭喇叭(8255的PC0=0)mov dx,303hout dx,almov al,0b6h ;8253初始化mov dx,307hout dx,almov dx,offset bg ;显示提示信息mov ah,9int 21hmov si,offset freq ;设置频率指针→simov bp,offset time ;设置延时指针→bppp: mov ah, 0bh ;检测是否有任意键按下?int 21hcmp al,00jne end_sing ;若有,则结束演凑mov di,[si] ;取1个音符的频率→dicmp di,0 ;检测是否是乐曲结尾je end_sing ;若是,则结束演凑mov dx,12h ;计算音符的频率所对应的8253计数初值mov ax,34dch ;1.19318MHzdiv dimov dx,306h ;向8253装入计数初值out dx,al ;先装低字节mov al,ahout dx,al ;再装高字节mov dx,303h ;打开喇叭(8255的PC0=1)mov al,01hout dx,almov al,0dh ;打开8253的T2(PC6=1),开始发声out dx,almov bx,ds:[bp] ;取1个音符的延时次数→bxcall time_delay ;调用延时子程mov dx,303h ;关闭8253的T2(PC6=0)mov al,0chout dx,almov al,00h ;关闭喇叭(PC0=0)out dx,aladd si,2 ;取下1 个音符的频率add bp,2 ;取下1 个音符的延时次数jmp pp ;继续end_sing:mov dx, 303h ;关闭8253的T2mov al, 0chout dx, almov al, 00h ;关闭喇叭out dx, alpop bx ;寄存器出栈pop bppop sipop dimov ax,4c00h ;返回DOSint 21hstar endpnew_intr proc ;新中断服务程序dec bx ;该服务程序只将延时次数-1iretnew_intr endptime_delay proc near ;延时子程序pushf ;压栈push dspush espush bxmov ah,35h ;取原中断(INT1CH)的向量,并保存mov al,1chint 21hmov old_off, bxmov bx, esmov old_seg, bxpop bxpop espush dsmov ah, 25h ;设置新中断服务程序的向量mov al, 1chmov dx, seg new_intrmov ds,dxlea dx, new_intrint 21hpop dsTD: cmp bx,0h ;延时次数已到?jnz TD ;未到,则继续mov ah,25h ;已到,则恢复原中断向量mov al,1chmov dx,old_segpush dxmov dx,old_offpop dsint 21hpop dspopf;time delay endrettime_delay endpcode endsend star ;程序结束。