微机原理课程设计电子琴的设计之欧阳化创编.docx

上传人:b****8 文档编号:9506984 上传时间:2023-05-19 格式:DOCX 页数:26 大小:202.50KB
下载 相关 举报
微机原理课程设计电子琴的设计之欧阳化创编.docx_第1页
第1页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第2页
第2页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第3页
第3页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第4页
第4页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第5页
第5页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第6页
第6页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第7页
第7页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第8页
第8页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第9页
第9页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第10页
第10页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第11页
第11页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第12页
第12页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第13页
第13页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第14页
第14页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第15页
第15页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第16页
第16页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第17页
第17页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第18页
第18页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第19页
第19页 / 共26页
微机原理课程设计电子琴的设计之欧阳化创编.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

微机原理课程设计电子琴的设计之欧阳化创编.docx

《微机原理课程设计电子琴的设计之欧阳化创编.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计电子琴的设计之欧阳化创编.docx(26页珍藏版)》请在冰点文库上搜索。

微机原理课程设计电子琴的设计之欧阳化创编.docx

微机原理课程设计电子琴的设计之欧阳化创编

课程设计任务书

时间:

2021.02.06

创作:

欧阳化

学生姓名:

刘沛专业班级:

电气0901

指导教师:

张锐工作单位:

自动化学院

题目:

计算机电子琴软件软件设计

初始条件:

1.用于调试程序的IBM兼容PC机一台;

2.安装DOS/WIN98操作系统或运行于DOS/WIN98兼容方式;

3.EDIT等文本编辑器输入80x86汇编程序,MASM5.0编译及链接程序。

要求完成的主要任务:

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

1.使用汇编语言设计一个运行于计算机的电子琴软件,软件应实现弹奏功或演奏。

其中弹奏:

用户每按一琴键弹奏相应音符;演奏:

按下某键后自动弹奏预存琴谱功能;还可以附加变调、变速和记录创作等其它功能。

2.说明书撰写格式应符合《课程设计说明书统一书写格式》。

时间安排:

1.程序框图设计,3天

2.编程,4天

3.调试,3天

4.编写设计报告,4天

指导教师签名:

年月日

系主任(或责任教师)签名:

年月日

摘要································································

1设计任务和思路····················································1

1.1设计任务······················································1

1.2设计思路······················································1

2更件部分工作原理··················································2

2.18255工作原理·················································2

2.28253工作原理·················································2

3程序流程图························································4

3.1主程序流程图··················································4

3.2演奏子程序流程················································5

3.3音乐播放子程序流程············································6

3.4弹奏子程序流程图··············································6

3.5发音子程序流程图·············································7

4各部分功能实现说明················································7

4.1发音部分功能实现··············································7

4.2变调功能的实现················································8

4.3弹奏功能的实现················································8

4.4演奏功能的实现················································9

4.4.1歌曲选择功能实现········································9

4.4.2音乐播放功能实现········································9

5程序运行结果·····················································10

结束语·····························································12

参考文献···························································13

附录程序清单······················································14

成绩评定表·························································19

摘要

汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。

利用汇编语言能够直接访问与硬件相关的存储器或I/O端口,从而最大限度地发挥硬件的功能。

本文主要介绍了利用汇编语言设计一个运行于计算机的电子琴软件,软件能够实现弹奏,演奏的功能,当按下弹奏键时,实现弹奏功能,发出音符对应频率的声音,按下演奏键时,实现演奏功能,播放预存的音乐,按下指定的音调选择按键后,选择低音,中音或高音,则分别用低音,中音或高音进行弹奏或演奏。

首先介绍了PC机内扬声器的控制电路,接着介绍了相关接口芯片8255和8253的内部结构和工作原理,接着讲述了各部分功能的具体实现方法。

 

关键词:

汇编语言,8255,8253,扬声器

计算机电子琴软件设计

1设计任务和思路

1.1设计任务

使用汇编语言设计一个运行于计算机的电子琴软件,软件应实现弹奏功能或演奏功能。

其中弹奏:

用户每按一琴键弹奏相应音符;演奏:

按下某键后自动弹奏预存琴谱功能;还可以附加变调、变速和记录创作等其它功能。

软件预想功能为:

按数字1-8为弹奏功能;按字母p为演奏功能;按d选择低音,按z选择中意,按g选择高音。

1.2设计思路

电子琴的设计实际上就是要设计一个程序,能够通过该程序控制PC机内扬声器的发声规律,按下相应的按键后,扬声器能发出指定频率的声音。

PC机内的扬声器是通过并行接口芯片8255和定时芯片8253来控制发音的,其电路连接方式如下图所示。

 

图1PC机内扬声器控制电路

由图可知,扬声器是由8253通道2产生的方波信号和8255的PB1相与后驱动发声的,且通道2的门信号由8255的PB0提供,要想让扬声器发声,PB0和PB1必须同时为高电平,因此,可以通过对8255的PB0和PB1的设置来控制扬声器的开通和关断,而其发音频率可以通过对8253通道2的计数初值的设置来控制。

所设计程序的任务就是要通过对按键的判断来设置8255的PB0和PB1输出电平的高低,以及8253通道2计数初值的设置。

计数初值N=时钟频率/音阶频率.各音阶的频率如下表所示。

表1各音符频率表

音符

1

2

3

4

5

6

7

频率(低)

131

147

165

175

196

220

247

频率(中)

262

294

330

349

392

440

494

频率(高)

524

588

660

698

784

880

988

 

2硬件部分工作原理

2.18255工作原理

8255的内部结构图如图2所示,它有3个数据端口,分为两组,A组由A口和C口高四位组成,B组由B口和C口低四位组成。

其方式控制字如图3所示。

 

图28255内部结构图

 

PC机内8255的A口,B口,C口和控制口的端口地址分别为:

60H,61H,62H,63H。

2.28253工作原理

8253芯片中有3个计数通道,称为通道0,1,2,它们与外部电路相连的信号线有3根:

CLK,GATE,OUT,CLK是脉冲输入端,GATE是门控信号,OUT是输出信号,计数器工作在减1状态。

其内部结构图和方式控制字格式如图4,图5所示。

其中当计数器工作在方式3时,输出信号为方波信号。

 

图48253内部结构图

D7

D6

D5

D4

D3

D2

D1

D0

 

图58253控制字格式

PC机内8253的通道0,通道1,通道2,控制口的端口地址分别为:

40H,41H,42,43H。

因为扬声器是由通道2来控制的,故应选择通道2,工作方式选为方式3,输出的信号则为方波信号。

 

3程序流程图

3.1主程序流程图

主程序的流程图如下图所示:

 

图6主程序流程图

3.2演奏子程序流程图

当按键为p为时,调用音乐播放子程序,音乐播放子程序的流程图如下图所示。

 

图7音乐播放子程序流程图

 

3.3音乐播放子程序流程图

演奏时,通过判断按键为1或2来调用音乐播放子程序1或2,音乐播放子程序流程图如图8所示。

 

图8音乐播放子程序流程图

 

3.4弹奏子程序流程图

当按键为1-8时,调用演奏子程序,演奏子程序的流程图如下图所示:

 

图9演奏子程序流程图

 

3.5发音子程序流程图

在弹奏和演奏时都需调用发音子程序,发音子程序的作用是控制扬声器的发音,其流程图如下:

 

图10发音子程序流程图

4各部分功能实现说明

4.1发音部分功能实现

由更件的连接形式可知,扬声器的开断是由8255的PB0和PB1以及8253通道2同时控制的,PB0和PB1同时为高电平时,扬声器开,有一个为低电平时,扬声器关断,又知8255B口地址为61H,8253通道2地址为42H,控制口地址为43H。

具体程序编写如下。

8253初始化程序段:

moval,10110110b;选择8253的通道2,并设置为工作方式3

out43h,al

movax,bx

out42h,al;将计数初值的低8位写入计数通道

moval,ah

out42h,al;将计数初值的高8位写入计数通道

开扬声器程序段:

inal,61h;读入B口数据

oral,03h;将PB0和PB1置1

out61h,al;将设置好的数据送回B口

关扬声器程序段:

inal,61h;读入B口数据

andal,0fch;将PB0和PB1置0

out61h,a;将设置好的数据送回B口

4.2变调功能的实现

扬声器发音的频率是由8253产生方波的频率决定的,而方波频率又是由通道的计数初值来决定的,因此可以通过改变通道的计数初值来实现变调功能。

计数初值N=时钟频率/音阶频率,时钟频率为1.19318MHZ=1234DCH,可以将相应音调对应的时钟频率存入内存单元,当选择相应的音调时,计算计数初值时,采用对应的时钟频率值,具体程序如下。

cmpal,'d';为d则选择低音

jnej1

movnum2,50

jmpchoice

j1:

cmpal,'z';为z则选择中音

jnej2

movnum2,12h

jmpchoice

j2:

cmpal,'g';为g则选择高音

jneloop0

movnum2,06h

其中,num1和num2中存放的是时钟频率值,num1中固定为34DCH,选择低音时,num2值设为50,中音时设为12H,高音时设为06H。

计算计数初值程序如下:

movax,num1

movdx,num2

div音符频率

通过这样的设置,即可实现电子琴的变调功能。

4.3弹奏功能的实现

当按键为数字1-8时,选择弹奏功能,通过对按键的判断,求得其偏移地址,然后通过查表得其相应频率值,再由上述计算计数初值的方法求得计数初值,然后将计数初值送人8253的通道2,最后调用发音子程序即实现弹奏功能。

具体程序段如下:

subal,31h;求偏移量

shlal,1

movbl,al;保存偏移量

movbh,0

movax,num1;计算计数初值

movdx,num2

divwordptr[tab+bx]

movbx,ax;保存计数初值

 

4.3演奏功能的实现

4.3.1歌曲选择功能实现

当按键为p时,选择演奏功能,播放预存的音乐,由于预存了两首歌曲,因此需进行选择,按下p后,显示输入提示信息,按1或2选择对应的歌曲,然后调用相应的音乐播放子程序,播放完后显示输入提示信息,按q退出,按c继续。

具体程序实现如下:

loop2:

movdx,offsetmesg1;显示输入提示信息

movah,09h

int21h

movah,07h;从键盘读入一个字符

int21h

cmpal,'q';为q则退出

jechoice

cmpal,'1';为1则选择歌曲1

jnenext1

callmusic1

jmploop3

next1:

cmpal,'2';为2则选择歌曲2

jneloop2;不为q,1,2则重新选择

callmusic2

loop3:

movdx,offsetmesg2;播放完后显示输入提示信息

movah,09h

int21h

movah,7;从键盘读入一个字符

int21h

cmpal,'q';为q则返回

jechoice

cmpal,'c';为c则继续播放

jeloop2

jmploop3

 

4.3.2音乐播放功能实现

选择歌曲后,调用对应的音乐播放子程序,音乐播放需用到循环结构,首先将计数器清零,接着计数器自增1,求得偏移量,然后通过查表的到相应的频率,再计算计数初值,将计数初值送人8253计数通道,调用发音子程序,若计数器的值大于歌曲长度,则返回。

具体程序段如下。

 

movcl,0;将计数器清零

ad:

inccl;计数器值自增1

cmpcl,31;计数器值若大于歌曲长度,则返回

jereturn

moval,cl

subal,1;求偏移量

shlal,1

movbl,al;保存偏移量

movbh,0

movax,num1;计算计数初值

movdx,num2

divwordptr[song2+bx]

movbx,ax

callspeaker;调用发音子程序

jmpad

 

5程序运行结果

运行程序后,显示如下界面,等待输入字符。

图11程序运行结果图1

按提示输入字符,按q则退出,按d选择低音,按z选择中音,按g选择高音,选择音调后,显示如下界面:

图12程序运行结果图2

等待输入字符,按q则退出,按p则演奏,按数字1-8则弹奏。

按下p后,程序运行如下:

图13程序运行结果图3

按提示输入字符,按下q则返回,按下1或2进行歌曲选择,歌曲播放完后程序运行如下:

图14程序运行结果图4

按提示按下键盘,若按下q,则推出,若按下c,则继续播放歌曲。

下面是按下c后的运行结果:

图15程序运行结果图5

 

结束语

通过这次课程设计,我从中学到了许多从课本上学不到的东西,锻炼了自己编程的能力,最后程序运行时能够实现目标,我感到很有成就感,从中也获得了很多乐趣,当然,最重要的是加深了我对课本理论知识的理解。

当刚看到这个课设题目时,我感到无从下手,因为我都不知道PC机的内部具体结构,从理论课上只是了解了CPU的结构和工作原理,以及几个接口芯片的工作原理,还有汇编语言的一些基本指令。

但我没有被吓到,我冷静下来思考后,发现其本质就是控制PC机内扬声器的发音,通过查阅资料我了解了PC机内扬声器的电路连接形式,发现它是由接口芯片8255和8253共同控制的,8255的PB0作为8253通道2的门信号,而8255的PB1和8253通道2的输出相与后的信号作为扬声器的驱动信号,了解了其内部接线方式后,思路也就有了,要想让扬声器发声,8255的PB0和PB1必须同时为高电平,其中之一为低电平时,扬声器就不能发声,而发声的音调则可通过改变8253的计数初值来实现,接下来的任务就是通过编程来控制8255和8253,从而间接地控制扬声器的发声规律,而8255和8253这两个接口芯片在理论课上都已介绍过,对其工作原理和编程方法都有一定的了解,看到这些熟悉的内容时,我淡定了很多。

有了思路之后,我并没有急着写程序,因为我怀疑是不是每台PC机的扬声器接线方式都是这样的,所以我开始只编了一段控制扬声器发音的程序,来看看程序运行时扬声器到底发不发音,结果发声了,这让我很惊喜,也很有动力,更加激发了我的兴趣,接下来我就开始编写实现指定功能的程序了,首先是最简单的弹奏功能,通过对按键的判断来发出相应频率的声音,因为要判断按键,所以很自然地就想到了CMP指令,在计算计数初值时,因为要用到相应音符的频率,所以需要将按键转换为音符的频率,我开始想用课本上常见的XLAT换码指令,但AL存放的数最大为128,很明显容量不够,于是我采用了基址+变址的寻址方法,在编程的过程中,由于要程序实现多个功能,所以用子程序的结构会比较方便,需要完成某个功能时,只需调用相应子程序就可以了,这样会使得程序的结构清楚明了;在开扬声器和关扬声器之间需要一定的延时,当把计数器置为0ffffh时,延时还是显得太短,于是延时我采用了AX和CX相配合的方式,使得延时达到预期的目的;在完成基本功能后,我还试着加上一些附加功能,比如变调,录音,通过我的不断尝试,终于把变调功能实现了,但录音功能没能像预期的那样。

总之,这次课程设计让我学到了许多从课本上学不到的知识,加深了对理论知识的理解,激发了我对汇编语言的兴趣。

上理论课时,只是老师讲,我们听,那些指令让我感到很枯燥,因为不知道它到底有什么作用,而这次课程设计刚好把这些指令应用到了实际中来,加深了对各种指令功能的理解,最后功能实现时,感到很有成就感,觉得汇编语言很神奇,激发了我对它的兴趣。

 

参考文献

[1]彭虎,周佩玲.微机原理与接口技术(第二版).电子工业出版社,2010

[2]陈慧杰.计算机扬声器发声的控制.内蒙古民族大学出版社,2001

[3]PeterAbel著,沈美明等译.IBMPC汇编语言设计程序.人民邮电出版社,2002

[4]冯继超.微机原理实验指导书.武汉理工大学出版社,2010

 

附录程序清单

datasegment

mesgdb'pressqtoquit,pressdorzorhtochoseyindiao',0ah,0dh,'$'

mesg1db'pressqtoreturn,press1or2tochosemusic',0ah,0dh,'$'

mesg2db'pressqtoreturn,pressctocontinue',0ah,0dh,'$'

mesg3db'pressqtoreturn,pressptoplaymusic,press1~8tohandplay',0ah,0dh,'$'num1dw34dch

num2dw12h

tabdw262,294,330,347,392,440,494,524

song1dw262,294,330,262,262,294,330,262

dw330,347,392,330,347,392,392,440

dw392,347,330,262,392,440,392,347

dw330,262,392,262,392,392,262,392;两只老虎

song2dw330,330,347,392,392,347,330,294

dw262,262,294,330,330,294,294,330

dw330,347,392,392,347,330,294,262

dw262,294,330,294,262,262;欢乐颂

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

loop0:

movdx,offsetmesg;显示输入提示信息

movah,09h

int21

loop1:

movah,07h;读入字符

int21h

cmpal,'q';为q则退出

jedone

cmpal,'d';为d,选择低音

jnej1

movnum2,50

jmpchoice

j1:

cmpal,'z';为z选择中音

jnej2

movnum2,12h

jmpchoice

j2:

cmpal,'g';为g选择高音

jneloop0

movnum2,06h

choice:

movdx,offsetmesg3

movah,09h

int21h

put1:

movah,07h

int21h

cmpal,'q';为q则返回

jeloop0

cmpal,'p';为p选择演奏

jnenext

callplay

jmpput1

next:

cmpal,'1';为1-8,选择弹奏

jlloop1

cmpal,'8'

jgput1

callhand

jmpput1

handprocnear;弹奏子程序

subal,31h

shlal,1

movbl,al

movbh,0

movax,num1

movdx,num2

divwordptr[tab+bx]

movbx,ax

callspeaker

ret

handendp

 

playprocnear;演奏子程序

loop2:

movdx,offsetmesg1

movah,09h

int21h

movah,07h;读入字符

int21h

cmpal,'q';为q则返回

jechoice

cmpal,'1';为1,播放歌曲1

jnenext1

callmusic1

jmploop3

next1:

cmpal,'2';为2,播放歌曲2

jneloop2

callmusic2

loop3:

movdx,offsetmesg2

movah,09h

int21h

movah,7;读入字符

int21h

cmpal,'q';为q则退出

jechoice

cmpal,'c';为c则继续

jeloop2

jmploop3

ret

playendp

music1procnear;音乐1播放子程序

movcl,0

ad:

inccl

cmpcl,33

jereturn

moval,cl

subal,1;取偏移量

shlal,1

movbl,al;保存偏移量

movbh,0

movax,num1;计算计数初值

movdx,num2

divwordptr[song1+bx]

movbx

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2