微机原理课程设计乐曲演奏程序设计与实现

合集下载

微机原理与汇编实验-音乐程序

微机原理与汇编实验-音乐程序

微机原理与汇编作业音乐程序实验目的: 了解 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其中,每个音符的音长由软件延时实现。

《微机原理》课程设计说明书_键盘电子乐器

《微机原理》课程设计说明书_键盘电子乐器

《微机原理》课程设计说明书_键盘电子乐器武汉理工大学《微机原理》课程设计说明书课程设计任务书学生姓名: 专业班级: 电气0805班指导教师: 工作单位: 自动化学院题目: 键盘电子乐器初始条件:掌握汇编语言程序设计方法,所设计的程序运行后可通过键盘控制,满足系统功能,并实现该系统设计方案。

在DOS,windows,汇编软件环境下运行。

要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.设计一个用键盘演奏音乐的程序,计时器系统设计编程定时输出――电子音调,用pc机内部8253time~使扬声器发声。

用汇编语言对8253进行编程,使其OUT0上输出一定的频率,将其一定频率输出到喇叭上,演奏出不同的音节。

pc机的数字键(1,7)作为电子音调的音调选择2. 课程设计说明书应包括:a)设计任务及要求b)方案比较及认证c)程序设计基本思想,程序流程图,部分源程序及注解d)调试记录及结果分析e)参考资料f)附录:全部源程序清单g)总结时间安排:2011年元月07日--元月09日选题、查阅资料和方案设计 2011年元月10日--元月14日编程2011年元月15日--元月16日调试程序,改进与提高2011年元月17日撰写课程设计报告(有调试过程及结果的截屏) 2011年元月18日答辩和交课程设计报告指导教师签名: 2011 年元月 6 日系主任(或责任教师)签名: 年月日1武汉理工大学《微机原理》课程设计说明书摘要利用PC上的定时/计数芯片8253A控制PC扬声器发声。

编写内核模块,直接操作扬声器相关端口,或字符设备驱动,供应用程序调用,用键盘使其发出不同的声音。

关键字:8253 定时器中断2武汉理工大学《微机原理》课程设计说明书目录1. 方案比较 ....................................... 42.芯片介绍 (4)2.1 8255芯片简述 (4)2.1.1 8255三种方式下工作 (4)2.2 8253芯片简述 (5)2.2.1 8253六种工作方式 ........................ 63.通用发声程序 ..................................... 7 4.音调与频率和时间的关系 ........................... 11 附录 (13)附录一: (13)附录二: (14)附录三: (26)附录四: (27)附录五: ...................................... 32 参考文献 (33)3武汉理工大学《微机原理》课程设计说明书键盘电子乐器1.方案比较1.1 发声程序循环优点:简单,易于思维缺点:程序过于长,比较繁琐1.2 调用宏,进行发声优点:程序短缺点:不易想到2.芯片介绍2.1 8255芯片简述8255可编程外围接口芯片是Intel公司生产的通用并行I/O接口芯片,它具有A、B、C三个并行接口,+5V单电源供电。

微机原理课程设计——音乐播放器

微机原理课程设计——音乐播放器

一.课程设计目的1.通过D/A装换器产生模拟信号,使PC机作为简易音乐播放器。

2.了解利用数模转换器产生音乐的基本方法。

二.课程设计任务设计并实现一个键控音乐播放器。

要求:(1)自己选用合适的芯片,不少于两种。

(2)自行设计电路并使用汇编语言编写程序完成键控音乐播放器功能。

(3)该播放器有若干首歌曲可以选择,开始时输出说明,要用户选择要播放的歌曲,然后根据用户按键进行播放、退出或出错提示。

三、总体设计方案1、总体设计方案一所有音乐都是由各个不同频率的音阶和其延续时间的长短来实现的。

不同的音乐是由各个音阶按某种排列各自播放一定时间形成的,将各音乐音阶和其延续时间存在数据段中,然后根据不同按键值选择不同的音阶和时间表,再使用计数器产生该音阶频率。

而我们学过的有计数器可以产生各种频率,所以我们主要采用计数器8253产生各音符,用8255并行接口来控制扬声器的开关,达到播放音乐的功能。

2、总体设计方案二可以使用0832(数模转换器)来产生频率,原理图:提出这个方案是因为我想产生模拟信号,来驱动扬声器,这样产生的声音更加圆润感觉更连续,效果更好点。

我们想把一个周期的波形分成32份,然后每份给8253一个值让他转换成模拟信号,不同的频率可以用8253计数器控制,比如要产生261Hz的频率,使用1MHz的话,周期就为1/261=3.83ms,分成32份,每份间隔时间就是3.83ms/32=0.12ms,换句话说就是送计数器0的初值为1M/261/32=120次。

3、各个音符的对应频率表:音符频率/HZ 半周期/us 音符频率/HZ 半周期/us低1DO 262 1908 #4FA# 740 0676#1DO# 277 1805 中5SO 784 0638低2RE 294 1700 #5SO# 831 0602#2RE# 311 1608 中6LA 880 0568低3M 330 1516 #6LA# 932 0536低4FA 349 1433 中7SI 988 0506#4FA# 370 1350 高1DO 1046 0478低5SO 392 1276 #DO# 1109 0451#5SO# 415 1205 高2RE 1175 0426低6LA 440 1136 #2RE# 1245 0402#6LA# 466 1072 高3M 1318 0372低7SI 494 1012 高4FA 1397 0358中1DO 523 0956 #4FA# 1480 0338#1DO# 554 0903 高5SO 1568 0319中2RE 578 0842 #5S0# 1661 0292#2RE# 622 0804 高6LA 1760 0284中3M 659 0759 #6LA# 1865 0268中4FA 698 0716 高7SI 1976 0253四.部分电路设计及功能解说1、频率发生电路使用8253产生音符频率。

微机课程设计报告计算机钢琴的程序编写

微机课程设计报告计算机钢琴的程序编写

微机课程设计报告计算机钢琴的程序编写微机课程设计题目计算机钢琴的程序编写学院物信学院专业电子信息工程班级电信班姓名学号指导教师一.实验目的1.掌握利用pc机扬声器发出不同频率声音的方法。

2.学习利用系统功能调用从键盘上读取字符的方法。

二.实验内容编写程序,程序运行时使pc机成为一架可弹奏的”钢琴”。

当按下数字1-8时,或者按下小键盘上的1-8时,依次发出1,2,3,4,5,6,7,i八个音调.按下ESC键则退出”钢琴”状态。

三.设计思想1. 分析这个设计课题,应使用到8253和8255芯片。

通过给8253定时器装入不同的计数值,可以使其输出不同频率的波形.当与门打开后,经过放大器的放大作用,便可驱动扬声器发出不同频率的音调.要使音调的声音持续一端时间,只要插入一端延时程序之后,再将扬声器切断(关闭与门).另外,要使计算机成为可弹奏的钢琴,需要使用系统调用的01H功能以接收键入字符,并且要建立一张表,使键入字符与频率构成一个对应关系.键入字符1 2 3 4 5 6 7 8 音符1 2 3 4 5 6 7 8(i) 频率值524 588 660 698 784 880 988 1048四.设计过程一.扬声器的驱动分析该程序主要是驱动电脑主板上的扬声器,根据音阶音调不同的频率值,来是扬声器发出不同的声音,从而产生想弹钢琴一样的感觉,当然音质是不能相提并论的。

在电路上如下图2-1所示:8255(PB1)图2-18253的电路连接图在PC/XT/AT家族中,计时器芯片的3个通道都用其专门的功能,通道2是用来控制计算机的扬声器的声音频率的。

通道2用于产生频率信号,故工作方式在方式3,计数值为6A4H=1190,方波输出频率为1.19MHz/1190=1KHz,此信号决定了扬声器的声调,而通道2的控制字则为0B6H,1.19M约等于十六进制*****CH。

由图1-1可知8253的通道2计数由8255A的PB0控制,当PB0输出为高电平的时候,是门GATE2为高电平。

微机原理课程设计电子琴

微机原理课程设计电子琴
微机原理课程设计电子琴
一、教学内容ቤተ መጻሕፍቲ ባይዱ
本节课为微机原理课程的实践环节,选取《微机原理与应用》教材第七章“微机接口技术”及第十章“微机在仪器仪表中的应用”为理论依据,设计了一堂以“电子琴”制作为主体的课程。教学内容主要包括:1.微机与电子琴硬件接口原理,特别是I/O接口地址译码及编程;2.利用基本微机接口实现电子琴音调的控制,包括键盘扫描、音调发生器的使用;3.电子琴软件编程,通过编写简单的BIOS调用或DOS中断实现音色的播放与控制;4.熟悉并掌握电子琴的制作流程,包括电路设计、程序编写、调试与优化等。通过本节课的学习,学生将能理论与实践相结合,深入理解微机接口技术,增强动手能力与创新能力。
5、教学内容
本节课将是对电子琴项目的一个总结和应用拓展,教学内容如下:1.电子琴功能的创新设计,鼓励学生思考如何添加新的功能,如录音、播放、节奏伴奏等;2.介绍微机与其他外设的通信接口,如USB、蓝牙等,为电子琴的远程控制或数据传输打下基础;3.电子琴的电源管理设计,讲解如何为电子琴设计稳定的电源供应系统;4.实践电子琴的组装和外壳设计,提升学生的工业设计和实际动手能力;5.组织学生进行课堂展示和答辩,培养他们的表达能力和公众演讲技巧。通过本节内容的实践,学生将能够综合运用所学知识,发挥创造力,完成一个具有实用性和创新性的电子琴项目,并在此过程中提升自身的工程实践能力和团队合作精神。
2、教学内容
本节课进一步深化微机原理的应用,以“电子琴”项目为载体,教学内容具体包括:1.电子琴键盘布局设计与实现,让学生了解如何通过微机接口读取键盘输入;2.音阶生成算法介绍,探讨如何通过编程产生不同音调;3.利用微机定时器/计数器产生稳定的时钟信号,保证音色的准确性与连贯性;4.简单的乐曲编程与演奏,指导学生如何将音符组合成乐曲并进行演奏;5.电子琴功能的扩展,如增加音量控制、音色选择等,提高电子琴的交互性和趣味性。

微机原理课程设计

微机原理课程设计

微机原理 课程设计一、课程目标知识目标:1. 让学生理解微机的基本原理和结构,掌握微处理器的工作机制。

2. 使学生掌握汇编语言的基本指令,能够阅读和编写简单的汇编程序。

3. 帮助学生了解微机系统中内存、I/O设备的基本原理及其与CPU的交互方式。

技能目标:1. 培养学生运用汇编语言进行程序设计的能力,能够实现基本的输入输出、逻辑判断和循环等操作。

2. 培养学生分析和解决微机系统常见问题的能力,如调试程序、处理硬件故障等。

3. 提高学生动手实践能力,通过课程设计项目,使学生能够独立完成一个简单的微机系统设计与实现。

情感态度价值观目标:1. 培养学生对微机原理及计算机科学的兴趣,激发他们探索精神和技术创新意识。

2. 培养学生团队协作精神,学会与他人共同分析问题、解决问题,提高沟通能力。

3. 引导学生认识到微机技术在国家经济发展和国防建设中的重要作用,增强学生的社会责任感和使命感。

课程性质:本课程为理论与实践相结合的课程,注重培养学生的实际操作能力和实际应用能力。

学生特点:学生已具备一定的电子技术和计算机基础知识,对微机原理有一定了解,但缺乏实践经验。

教学要求:教师需结合课程性质、学生特点,采用案例教学、项目驱动等教学方法,引导学生主动学习,提高学生的实践能力和综合素质。

在教学过程中,注重分解课程目标,确保学生能够达到预定的学习成果。

二、教学内容1. 微机原理概述:介绍微机的发展历程、基本结构及工作原理,重点讲解CPU、内存、I/O设备等核心组件的作用和相互关系。

相关教材章节:第一章 微机原理概述2. 汇编语言基础:讲解汇编语言的基本概念、语法和指令系统,使学生掌握汇编程序的编写和调试方法。

相关教材章节:第二章 汇编语言基础3. 微机系统编程:学习微机系统中的程序设计方法,包括顺序程序设计、分支程序设计、循环程序设计等。

相关教材章节:第三章 微机系统编程4. 内存与I/O设备:介绍内存管理、I/O设备控制原理,分析微机系统中内存、I/O设备的访问方法。

微机原理课程设计--音乐演奏

微机原理课程设计--音乐演奏

学院:计算机科学技术专业:计算机科学与技术(工)班级:计10-1班姓名:学号:指导教师:2013年3月10日微机原理与汇编语言课程设计任务书一、题目:音乐演奏二、设计的目的1.了解PC机扬声器系统的电路结构;2.学习扬声器发生的编程方法;3.掌握定时器/计数器8253的工作原理及编程方法。

三、设计要求1.用菜单选择乐曲,让扬声器按节拍演奏连续的音乐;2.至少三首歌曲,按下”O”键第1首,按下”E”键第2首,按下”T”键第3首,按下”Q”键推出。

四、设计内容采用PC系列微机演奏3首(或以上)音乐。

五、课程设计工作量一般每人的程序量应在100行有效程序行以上。

不得抄袭,否则给不及格成绩。

六、课程设计工作计划2013年3月4日1-2节指导教师讲课,学生准备文献资料;2013年3月4日~2013年3月8日每人完成自己程序并能独立演示;2013年3月8日下午验收,学生撰写课程设计报告。

指导教师签字:专业主任签章:微机原理与汇编语言课程设计指导教师评语与成绩目录第1章概述 (1)1.1选题来源 (1)1.2选题目的 (1)1.3选题意义 (1)第2章总体设计方案 (2)2.1硬件总体设计 (2)2.1软件总体设计 (3)第3章总体设计方案 (3)3.1 硬件设计 (3)3.1.1 8253内部结构 (3)3.1.2 8253的控制字 (5)3.2 软件设计 (5)3.2.1 音乐演奏 (6)3.2.2 界面设计 (7)第4章调试与运行结果说明 (8)第5章课程设计总结 (8)第6章谢启 (9)参考文献 (10)附录 (11)第1章概述1.1选题来源音乐是我们精神生活必不可缺的一部分,它遍布在我们生活的每一个角落。

运动时,上网时,看书时我们总是喜欢听着音乐,它可以使我们的生活更有旋律性,节奏感,使我们更好的的陶冶情操,养性怡情,让我们的生活富有活力。

21世纪是信息时代,掌握坚实计算机专业知识,是我们计算机专业学生所必须做到的,汇编语言开发是机算计应用技术的一项内容,我们的老师高瞻远瞩的为我们提供了音乐演奏这个课题,不仅可以使我们更好的夯实我们的专业知识,还让我们掌握了一些基于PC机音乐播放的前沿技术。

微机原理音乐播放程序设计

微机原理音乐播放程序设计

实验报告(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)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线,随后修改了程序。

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

1乐曲演奏程序设计与实现
1.1设计目的
1.掌握可编程计数器/定时器8253的工作原理及应用。

2.掌握并行接口芯片8255的工作原理及应用。

1.2设计内容
1.确定每个音符的发声频率,以确定乐曲演奏的音调。

2.确定每个音符的节拍长度,以确定乐曲演奏的节奏。

3.完成乐曲演奏程序的编写与调试。

1.3设计要求
1.基本要求:用软件定时方法控制乐曲的演奏节奏。

2.提高要求:用PC机内部定时器0控制乐曲的演奏节奏。

3.更高要求:由键盘输入的值决定乐曲演奏的节奏。

1.4设计原理与硬件电路
(一)发声原理
PC系统板上8253的接口电路如上图所示,8253包括3个独立的16位计数器和1个控制字寄存器,系统分配给8253的端口地址为40H~43H。

PC机上的大多数输入/输出(I/O)都是由系统插件板上的8255(或8255A)可编程外围接口芯片(PPI)管理的。

8255包括3个数据端口和1个控制端口,系统分配给8255的端口地址为60H~63H。

当8255的PB端口(61H)的第0位为1时,控制8253定时器来驱动扬声器,当第1位为1时,扬声器的门电路接通,并一直保持到位1变为0时关闭。

即控制电路能以位触发和定时器控制两种不同的方式驱动扬声器发声。

下面主要介绍利用定时器产生声音的原理。

利用机器硬件8253定时器可以产生声音。

CPU通过对定时器2(端口地址为42H)进行编程,使其寄存器接收一控制声音频率的16位计数值,8255端口B的PB0 和PB1均为1时扬声器才可以发声,发声得频率由OUT2决定,以产生特殊的音响。

当定时器2工作在方式3下接收的计数值为533H时,能产生896Hz的声音,因此产生其它频率(Freq)的计数值就可由下式计算出来:
533H×896÷Freq=1234DCH÷Freq
当定时器2用于发声时,一般采用模式3,在模式3下,输出线为“1”和为“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。

(二)乐曲程序原理
乐曲是按照一定的高低、长短和强弱关系组成的音调,在一首乐曲中,每个音符的音
高和音长与频率和节拍有关,而组成乐曲的每个音符的频率值和持续时间是乐曲程序发声所
知道了音调与频率和时间的关系,我们就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两数据表,然后编写程序依次取出表中的频率值和时间值,调用发声程序发出各种声音。

1.5 程序流程图
主程序 发音子程序
1.6程序代码
data segment
song db 'music:TWO TIGERS$'
mess db 'input time:$'
mus_freq dw 2 dup(262,300,330,262) ;频率表
dw 2 dup(330,349,392)
dw 2 dup(392,440,392,349,330,262)
dw 2 dup(294,196,262),0
mus_time dw 10 dup(10) ;节奏表
dw 20
dw 2 dup(10)
dw 20
dw 4 dup(5)
dw 2 dup(10)
dw 4 dup(5)
dw 4 dup(10)
dw 20
dw 2 dup(10)
dw 20
data ends
code segment
assume cs:code,ds:data
main proc far
start: push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
cli ;关中断
mov ax,351ch ;取原中断服务程序的入口地址 int 21h
push es ;保存段地址
push bx ;保存偏移地址
push ds
mov dx,offset delay ;设置用户中断服务程序段地址 mov ax,seg delay ;设置中断服务程序偏移地址 mov ds,ax
mov ax,251ch ;设置中断向量
int 21h
pop ds
mov al,36h ;重设8253定时器0控制字
out 43h,al
mov ax,11926 ;重写8253定时器0时间常数 out 40h,al
out 40h,al
lea si,mus_freq
lea bp,mus_time
lea dx,song ;显示乐曲名
mov ah,9
int 21h
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
lea dx,mess ;提示输入节奏控制值
mov ah,9
int 21h
mov ah,1
int 21h
mov cl,al
sub cl,30h
freq: mov di,[si]*2 ;取频率值
cmp di,0 ;乐曲是否结束
je end_mus
mov ax,ds:[bp] ;取节奏
mul cl
mov bx,ax
call gensound ;调用发声程序
add si,2
add bp,2
jmp freq
end_mus:cli ;关中断
mov al,36h ;恢复定时器0的初始设置值 out 43h,al
mov ax,0
out 40h,al
mov al,ah
out 40h,al
pop dx ;恢复中断服务程序初始值 pop ds
mov ax,251ch
int 21h
sti
ret
main endp
gensound proc near ;发音子程序
push bx
push cx
push dx
push di
mov al,0b6h ;初始化定时器2
out 43h,al
mov dx,12h
mov ax,3280h
div di ;计算定时器时间常数
out 42h,al
mov al,ah
out 42h,al
in al,61h
mov ah,al
or al,3
out 61h,al ;打开扬声器
sti ;开中断
wait0:cmp bx,0 ;硬件延时
jnz wait0
cli
mov al,ah
out 61h,al ;关闭扬声器
pop di
pop dx
pop cx
pop bx
pop ax
ret
gensound endp
delay proc near ;中断服务程序
push ax
dec bx
mov ah,20h
out 20h,al
pop ax
iret
delay endp
code ends
end start
1.7程序及硬件系统调试情况
在调试过程中,遇到的主要问题有:乐曲不能停止,最后一个音长响。

经调试发现,音频表的终止频率设置不当,经调整后程序正常结束。

在程序运行过程中发现音量偏低,可以把频率表中的频率扩大几倍后再利用定时器发声,以提高音量。

相关文档
最新文档