当前位置:文档之家› 音乐演奏程序设计

音乐演奏程序设计

微机原理及接口技术课程设计题目音乐演奏小程序学院自动化学院专业电气工程及其自动化班级姓名指导教师2014 年12 月28 日课程设计任务书学生姓名:专业班级:电气指导教师:工作单位:自动化学院题目: 音乐演奏小程序初始条件:音乐程序,按大写字母“A”,奏一首歌曲;按大写字母“B”;奏另一首歌曲,曲目自选。

按Q退出程序。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)设计任务及要求分析(2)方案比较及认证说明(3)系统原理阐述(4)硬件设计课题需要说明:硬件原理,电路图,采用器件的功能说明(5)软件设计课题需要说明:软件思想,流程图,源程序及程序注释(6)调试记录及结果分析(7)总结(8)参考资料(9)附录:芯片资料或程序清单,软件演示屏幕拷贝图或硬件实物图目录音乐演奏小程序 (1)1 总体要求与设计原理 (1)1.1设计要求 (1)1.2设计原理 (1)2 方案设计 (1)2.1 方案一 (2)2.2方案二 (2)2.3 方案三 (2)2.4 方案选择 (2)3 硬件电路 (2)4 软件设计 (3)4.1 音乐选择模块 (3)4.2 频率产生模块 (3)4.3 控制音符的演奏时间 (4)4.4 音乐乐谱编程 (5)4.5屏幕显示设计 (7)4.6 程序流程图 (9)5 程序调试及运行结果 (10)6 小结与体会 (12)参考文献 (13)附录1 程序源代码 (14)附录2 芯片资料 (18)音乐演奏小程序1 总体要求与设计原理1.1设计要求本文主要编写一段音乐程序,该程序可以进行如下操作:按大写字母“A”,奏一首歌曲;按大写字母“B”;奏另一首歌曲,曲目自选,可重复操作。

按Q退出程序。

1.2设计原理在本次课程设计中大家利用课上所学的各种知识,对自己的课程设计题目进行设计。

我所要设计的题目是音乐程序设计。

看到大多数同学选择了8253定时器,为了与同学区分开来,我在设计的过程选择利用计数器/定时器8254芯片和可编程并行接口8255A芯片,完成2个开关选择歌曲,能用扬声器播放歌曲。

首先我们利用定时器产生各种频率的声音,如“DO”“RE”“ME”然后将各个单音连接起来就组成了一首简单的曲子或者旋律,旋律及拍数可以按音乐简谱而定。

对8255芯片PA0和PA6口的置0和1来选择歌曲。

其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把[SI]是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。

2 方案设计音乐的实现主要是对乐谱中的单音符按照一定的音符频率表转化为计数器的计数频率以及喇叭发声的控制时间,通过计数产生相应的控制动作。

由此可以有三种方案比较和选择。

2.1 方案一音乐程序设计可以实现至少两首歌的可选择播放。

对于歌曲的播放我们采用的是计数器/定时器8254芯片,而对于选择哪首歌播放则是利用可编程并行接口8255A芯片来实现的。

基于8254定时计数接口芯片的工作原理,本次课设实现了音乐演奏系统程序设计。

当运行程序时,扬声器便发出优美的音乐。

首先要解决发声并发出相应音符声音的问题,由8254计数器0在初始化时用来产生一定频率的方波来使扬声器发声,再根据不同音符对应的频率写入计数初值发出相应的音符声。

对8255芯片PA0和PA1口的置0和1来控制扬声器的开关。

其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把[SI]是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。

2.2方案二通过编程使用软件来实现计数和喇叭发声的时间设置,控制8255A并行I/O 接口驱动喇叭发声。

CPU每执行一条指令需要耗费一定的时间,这样可以通过循环的方式设置好循环次数,实现软件计数,然后输出相应的高低电平,驱动喇叭发出对应频率和节拍的声音。

2.3 方案三利用硬件实现频率计数和延时时间的控制,利用8253-5定时/计数器芯片和8255A并行I/O接口芯片。

使8253的一个通道工作在“方波发生器”模式,实端口实现发声时间的计数控制。

这样可以精现对频率的计数;利用8255A的PB3确的控制时间,减少CPU的开支。

2.4 方案选择考虑到我们微机课主要学习了8255A芯片,而我通过查找资料了解到8254的工作原理,,经过再三思索后,我决定放弃选用比较熟悉的8253定时器,转而利用8254定时器和8255A实现本课设要求的功能。

因此我最终选择了方案一。

3 硬件电路硬件连接图如图3所示。

图3 电路连接图4 软件设计4.1 音乐选择模块对8255芯片PA0和PA6口的置0和1来选择歌曲。

其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把[SI]是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。

4.2 频率产生模块所有音乐都是由各个不同频率的音阶和其延续时间的长短来实现的。

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

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

所有音乐都是由各个不同频率的音阶和其延续时间的长短来实现的。

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

CPU通过对定时器的通道0进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值。

以产生特殊的音响。

当定时器接收的计数值为533H时,能产生896Hz的声音,因此产生其他频率的计数值就可算出来:533Hz×896÷频率=1234DC÷频率在送出频率计数值之前,还要给方式寄存器送一个方式值,该数决定对哪一个通道编程,采用什么模式,送入通道的计数值是一字节还是两字节,是二进制码还是BCD码。

其位组合的格式如下:产生指定频率声音的程序段如下:PLAY: MOV DX,0FHMOV AX , 4240HDIV WORD PTR [SI]MOV DX , MY8254_COUNT0OUT DX , ALMOV AL , AHOUT DX , AL4.3 控制音符的演奏时间控制音符的演奏时间,是设计音乐程序的关键问题。

最直观的方法是按照按照乐谱为每一个音符规定一个演奏时间,但是利用这种方法是调试程序特别困难。

特别是在遇到一首不熟悉的歌曲时,初期很难确定每一个音符的演唱时间,而调试程序的时候费时费力,效果很差,下面,我么么向读者推荐一个记号的方法,即没一个音符规定一个“单位时间”。

单位时间*N=音符的演唱时间其中N为调试参数,一首歌只有一个调试参数。

设计程序时用EQU伪指令定义调试参数,初值先行估计,调试时再修改它。

如何确定每个音符的演奏时间呢?我们知道,音符的节奏分为一拍、半拍、1/4拍、1/8拍等等。

如果在一首歌曲中,音符演奏的时间最短为1/8拍,我们就规定一拍音符的单位时间为8,半拍音符的单位时间为4,1/4拍音符的单位时间为2,1/8拍音符的单位时间为1。

以“友谊地久天长”这首歌为例,最短音符为1/8拍,我们就定义一个单位时间为8。

所示,途中第一行是一段曲谱,第3行是相应音符的单位时间,编程时,首先将一个音符的频率转化成计数初值写入2号计数器,然后将音符的单位时间乘以调试参数N,在调用延时子程序,就可以控制音符的演奏时间了,调试时,只需改变调试参数N即可。

4.4 音乐乐谱编程当运行程序时,扬声器便发出优美的音乐。

首先要解决发声并发出相应音符声音的问题,由8254计数器0在初始化时用来产生一定频率的方波来使扬声器发声,再根据不同音符对应的频率写入计数初值发出相应的音符声。

音符频率表示见表1所示,编程产生各种音符的频率时可参照此表。

音符频率表1 (单位:赫兹)音符频率表2音符频率表34.5屏幕显示设计程序运行时,屏幕显示第一界面如下:Music Player--------------------------------PLEASE SELECT A MUSIC--------------------------------A Mother’s kiss(妈妈的吻)B Friendship forever(友谊天长地久)Q EXIT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 选择A、B分别演奏相应的音乐,选择Q键结束程序运行。

当输入别的按键信号时,显示出错提示信息,界面如下:ERROR! IMPUT A B or QPLEASE INPUT AGAIN!Music Player---------------------PLEASE SELECT A MUSICA Mother’s kiss(妈妈的吻)B Friendship forever(友谊天长地久)Q EXIT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@按照提示信息重新输入正确字符即可。

上述提示信息在数据段定义,类型为字节型。

首先调用BIOS中断的10H号功能设置文本模式。

程序如下:MOV AH,00H ;BIOS 10子功能MOV AL,02H ;80*25彩色文本模式INT 10H ;BIOS 10功能调用然后调用背景清屏子程序使文本屏幕清空,为输入信息作准备,清屏子程序如下:CLR PROC NEARMOV BH,0 ;第0页MOV BL,00011010B ;字符属性,蓝底绿字不闪烁MOV DX,0000H ;0行0列MOV AL,' ' ;输出的字符MOV CX,80*25 ;循环次数MOV AH,02H ;BIOS 10H子功能调用,置光标位置INT 10HMOV AH,09H ;BIOS 10H子功能调用,输出字符INT 10HRETCLR ENDP最后输出提示语字符。

输出提示语字符时,需要多次使用一段相同的输出代码,将该代码定义为宏,可以避免多次重复书写相同的代码。

不定义为子程序是为了避免多次调用使执行速度减慢。

相应宏定义语句为:SHOW MACRO bLEA DX, b ;将相应字符段的偏移地址装入DXMOV AH, 9 ;DOS 21H号中断9子功能输出多字符INT 21HENDM则相应的字符提示信息输出代码为:CALL CLRshow INFO1show INFO2show INFO3show INFO4show MUSLIST4.6 程序流程图主程序流程图如图4.1。

相关主题