计算机电子琴课程设计报告

更新时间:2023-05-27 23:18:02 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

自动化专业课程设计报告

《微机原理及应用课程设计》

计算机仿真电子琴

班 级 :自动化09-1 姓 名 :许丹阳 学 号 :0918120123

时 间 :2011年12月19号至12月23号 地 点 :电信实验中心第六实验室 指导教师 :李向军 大

自 动 化 研 究 室

大 连 海 洋 大 学 实 验 报 告 纸

学院(系): 专业班级: 姓名: 学号:

题目:计算机仿真电子琴

一、课程设计的目的与要求

1、课程设计的设计目的

本课程的课程设计是自动化专业学生学习完《微机原理及应用》课程后,进行的一次以汇编语言为主,硬件设计为辅的综合训练。本课程设计的目的在于加深对微机原理基本知识的理解,掌握汇编语言程序设计的基本方法;掌握运用微机原理开发系统的基本方法。

2、课程设计的要求

从课程设计的目的出发,通过设计工作的各个环节,达到以下要求: 1、掌握汇编语言程序设计的基本方法以及课程设计所涉及到的基本理论。 2、理解硬件电路的工作原理。

3、进一步理解各种接口电路的应用,例如8255并行接口,8253定时器等。 4、掌握利用PC机扬声器发出不同频率声音的方法。 5、自行设计软件流程图,编制程序。 6、调试程序使其能正常运行。 7、设计完成后,写出设计总结。

3、课程设计的性能指标

1、 在程序运行时使PC即成为一架可弹奏的电子琴。当按下数字键1-8时,依次发出1,2,3,4,5,6,7,I这八个音调。按下CTRL+C或者回车则退出电子琴状态。 2、 在程序运行时使PC自动按要求提示演奏乐曲。

二、课程设计课题的分析

2.1主要的宏和过C程的实现 2.1.SHOW显示宏

为将事先定义的数据段字符串显示在屏幕上,定一个参数为b的宏。将b的地址传到DX。随后调用DOS09号功能调用。将字符串显示到屏幕。调用SHOW的实例为:

SHOW INFO1 SHOW INFO2 SHOW INFO3 SHOW MUSLIST

在此段代码中,程序显示提示作用的字符串和歌曲列表。 SHOW宏具体实现如下: SHOW MACRO b LEA DX,b MOV AH,9 INT 21H ENDM

2.1.2ADDRESS音乐地址宏

歌曲包含节拍和频率。此处定义的音乐地址宏包含两个参数,将歌曲频率地址导入SI将歌曲节拍导入BP。当选择不同的歌曲时,主程序调用该宏,将用户要求的歌曲的频率和节拍导入,以便在MUSIC中实现发声。

音乐地址宏实现如下: ADDRESS MACRO A,B LEA SI,A

LEA BP,DS:B ENDM

2.1.3MUSIC宏

在ADDRESS中,程序已经将歌曲的首个频率地址和首个节拍地址分别导入SI、BP。为了检测歌曲是否结束,在MUSIC中,首先将SI传递到DI,DI与-1相减,如等于0,则得出该频率定义为-1 。在歌曲频率表定义中将-1定为该歌曲结束标志,此时MUSIC跳出结束。

若该频率不为-1。调用通用发生程序GENSOUND,将该音符按照频率和节拍表发声。发声后SI、BP分别加2,跳转到下一个音符的频率和节拍,继续检测歌曲是否结束。如频率不为-1,继续将该音符发声,并循环此过程。

具体实现方法如下: MUSIC PROC NEAR PUSH DS SUB AX,AX

PUSH AX FREG: MOV DI,[SI]

CMP DI,-1 JE END_MUS MOV BX,DS:[BP] CALL GENSOUND ADD SI,2 ADD BP,2 JMP FREG END_MUS:

RET MUSIC ENDP

2.1.4通用发生程序GENSOUND

该发生程序是在修改BEEP发声程序的基础上,以实现为8088/86编写一个任意频率和任意持续时间的通用发声程序。该程序包括以下三个步骤:

(1)在8253/54 中的43端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使得定时器2准备接受计数初值。

(2)在8253/54中的42H端口装入一个16位计数值,已建立将要产生的声音频率。 (3)把输出端口61H的0、1两位置1,发出声音。

具体实现如下:

GENSOUND PROC

MOV BX, 200 PUSH AX PUSH BX

PUSH CX PUSH DX PUSH DI

MOV AL, 0B6H OUT 43H, AL

MOV DX, 12H MOV AX, 533H*896 DIV DI

OUT 42H, AL MOV AL, AH

OUT 42H, AL IN AL, 61H MOV AH, AL

OR AL, 3 OUT 61H, AL PUSH AX

WAIT1: MOV CX, 1200 DELA1: IN AL, 61H AND AL, 10H CMP AL, AH JE DELA1 MOV AH,AL LOOP DELA1

DEC BX JNZ WAIT1 POP AX MOV AL, AH

OUT 61H, AL POP DI POP DX POP CX POP BX POP AX RET GENSOUND ENDP

该GENSOUND程序能产生19~65535Hz的声音,这个频率的下限是使除法不产生溢出的最小值。其上限65535是多余的,因为人能听到的声音最高频率为20000Hz。

此外一般情况下,GENSOUND程序产生的声音不单单和频率有关,还和CPU有关。CPU工作频率越高,时延越短,产生的声音越急促。为了使程序产生一个与CPU工作频率无关的合适时延,在MUSCI中调用了一个时间延时程序WAITF。

2.1.5RETU退出

当程序要求退出时,主程序会调用RETU进行退出。RETU程序内容实际为一个BIOS功能调用。 RETU:

MOV AH,4CH INT 21H

2.2主程序实现

2.2.1数据段定义

数据段分别定义了INFO1、INFO2、INFO3 、INFO4、INFO5各字符串分别显示程序运行之初对用户的提示。MUSLIST 中显示用户能选择的三首歌曲列表。

程序用MUS_FREG、MUS_TIME分别定义了音乐频率和节拍。使得发声程序可以按照理想的要求发出连续的乐曲。节拍和频率定义原理如下:

乐曲是按照一定的高低、长短和强弱关系组成的音调,在每一首乐曲中,每个音符的音高和音长与发声系统中的频率、节拍有关。可参考下表:

音名 唱名

C D E F G A B C

1 2 3 4 5 6 7 i频率(HZ)

262 294 330 349 392 440 492 523

其中,阶从低音C(262HZ)到高音C(523HZ)。组成乐曲的音符的频率值和持续时间是乐曲程序发声所必需的两组数据,频率可以查上表,音符的持续时间根据乐曲的速度及每个音符的节拍数来确定。在4/4拍中,四分音符为一拍,每小节四拍,全音符持续四拍,二分音符持续二拍,四分音符持续一拍,八分音符持续半拍。如果给全音符分配1秒(100*10ms)的时间,则二分音符持续时间为0.5秒,四分音符持续时间为0.25秒,八分音符持续时间为0.125秒。

知道了音调及频率、时间的关系后,可以按照乐曲的乐谱将每个音符的频率和持续时间定义为两个数据表,然后编写程序依次取出表中的频率值和时间值。

“玛丽有只小羊羔”的乐谱如下:

3 2 1 2 | 3 3 3 —| 2 2 2 — | 3 5 5 —| 3 2 1 2 | 3 3 3 3 | 2 2 3 2 | 1 —— | 可设置该乐曲的频率表如下:

MUS1_ F DW 330,294,262,294,3DUP (330) DW 3DUP (294),330,392,392

DW 330,294,262,294,4DUP (330)

DW 294,294,330,294,262,-l

设置该乐曲的节拍时间表如下:一般延迟时间取10ms的倍数。 MUSl- T DW 6 DUP (25*8),50*8 DW 2 DUP (25*8,25*8,50*8) DW 12 DUP (25*8),100*8

2.2.2堆栈段定义

程序定义了一个长度了200的堆栈段,如下: STACK SEGMENT

DB 200 DUP ('STACK') STACK ENDS

2.2.3初始化

程序初始化使用了BIOS功能调用。使用0AH号功能设置显示方式。本程序对显示要求较为简单,故使用40x25黑白文本、16级灰度方式显示。若要求改变显示方式,可以根据0AH功能设置表自行添加。

START:

MOV AX,DATA MOV DS,AX MOV aH, 0 MOV AL,00 INT 10H

2.2.4程序执行过程

详细参见附录中INPUT部分,以及程序流程图。

主流程图

乐曲演奏子程序工作流程图 电子琴子程序工作流程图

三、课程设计的结果

1、程序代码如下:

DATA SEGMENT

INFO1 DB 0AH, 0DH, 'WELCOME YOU TO COME HERE!MY DEAR TEACHER$' DB 0AH, 0DH, 'THIS IS A MUSIC PROGRAM!'

DB 0AH, 0DH, 'PLEASE SELECLT WHICH SONG YOU LIKE BEST!' INFO4 DB 0AH, 0DH, 'INPUT ERROR!$'

INFO5 DB 0AH, 0DH, 'PLEASE INPUT AGAIN!$'

MUSLIST DB 0AH, 0DH, '=========================' DB 0AH, 0DH, 'Press1 HuanLeSong' DB 0AH, 0DH, 'Press2 TWO TIGERS' DB 0AH, 0DH, 'Press3 SCALE PLAY ' DB 0AH, 0DH, 'Press4 EXIT'

DB 0AH, 0DH, '=========================' DB 0AH, 0DH, '$'

MUS_FRQ1 DW 330, 330, 350, 393, 393, 350, 330, 294 DW 262, 262, 294, 330, 330, 294, 294

DW 330, 330, 350, 393, 393, 350, 330, 294 DW 262, 262, 294, 330, 294, 262, 262

DW 294, 294, 330, 262, 294, 330, 350, 330, 262 DW 294, 330, 350, 330, 262, 262, 294, 393 DW 330, 330, 350, 393, 393, 350, 330, 294 DW 262, 262, 294, 330, 294, 262, 262, -1 MUS_TIM1 DW 50,50,100,100,100 DW 100,100,50,50,100,100 DW 100,100,100,50,50,100 DW 100,100,100,100,100,50 DW 50,100,100,100,100,100

MUS_FRQ2 DW 262,294,330,262 DW 262,294,330,262 DW 330,349,392 DW 330,349,392

DW 392,440,392,349,330,262 DW 392,440,392,349,330,262 DW 294,196,262 DW 294,196,262,-1

MUS_TIM2 DW 200, 4 DUP(100), 200, 200, 200 DW 200, 4 DUP(100), 200, 200, 200 DW 200, 4 DUP(100), 200

DW 4 DUP(100), 200, 4 DUP(100), 400

TABLE DW 262, 294, 330, 349, 392, 440, 494, 525

NUMB DB 0AH, 0DH, 'Keyboard number 1~8 keys play notes of the scale' DB 0AH, 0DH, 'Enter or Ctrl+C to exit' DB 0AH, 0DH, '$' DATA ENDS

STACK SEGMENT PARA STACK 'STACK' STA DB 200 DUP('STACK') STACK ENDS

CODE SEGMENT

ASSUME DS: DATA, SS: STACK, START: MOV AX, DATA MOV DS, AX MOV ES, AX

MOV AX, STACK MOV SS, AX MOV aH, 1 MOV AL,00 INT 10H

SHOW MACRO B MOV DX, OFFSET B MOV AH, 09H INT 21H ENDM

SHOW INFO1 LOP: SHOW MUSLIST MOV AH, 01H INT 21H CMP AL, 34H JZ RETU CMP AL, 31H JNZ c0

CALL MUSIC1 JMP EXIT1

C0: CMP AL, 32H JNZ E0

CALL MUSIC2 JMP EXIT1

E0: CMP AL, 33H JNZ EXIT SHOW NUMB CALL MUSIC3

CS: CODE,

ES: DATA

EXIT1: SHOW INFO5 JMP LOP

EXIT: SHOW INFO4 SHOW INFO5 JMP LOP

RETU: MOV AX, 4C00H INT 21H

MUSIC1 PROC LEA SI, MUS_FRQ1 LEA BP,DS: MUS_TIM1 FREQ1: MOV DI, [SI] CMP DI,-1

JE END_MUS1 MOV BX, DS: [BP] CALL GENSOUND ADD SI,2 ADD BP,2 JMP FREQ1 END_MUS1:RET MUSIC1 ENDP

MUSIC2 PROC LEA SI, MUS_FRQ2 LEA BP,DS: MUS_TIM2 FREQ2: MOV DI, [SI] CMP DI,-1

JE END_MUS2 MOV BX, DS: [BP] CALL GENSOUND ADD SI,2 ADD BP,2 JMP FREQ2 END_MUS2:RET MUSIC2 ENDP

MUSIC3 PROC NEAR PUSH AX PUSH BX PUSH CX

LOP5: MOV AH, 01H INT 21H CMP AL, 0DH JE EXIT5

CMP AL, 31H JB LOP5

CMP AL, 38H

JA LOP5 AND AX, 0FH SHL AX, 1 SUB AX, 2 MOV SI, AX

MOV BX, OFFSET TABLE

MOV DI, [BX][SI]

CALL GENSOUND JMP LOP5 EXIT5: POP CX POP BX POP AX RET MUSIC3 ENDP

GENSOUND PROC

MOV BX, 200 PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI

MOV AL, 0B6H OUT 43H, AL

MOV DX, 12H MOV AX, 533H*896 DIV DI

OUT 42H, AL MOV AL, AH

OUT 42H, AL IN AL, 61H MOV AH, AL

OR AL, 3 OUT 61H, AL PUSH AX

WAIT1: MOV CX, 1200 DELA1: IN AL, 61H AND AL, 10H CMP AL, AH JE DELA1 MOV AH,AL LOOP DELA1

DEC BX JNZ WAIT1 POP AX

MOV AL, AH

OUT 61H, AL POP DI POP DX POP CX POP BX POP AX RET GENSOUND ENDP CODE ENDS END START END START

2.、实验现象

点击“运行”后,可以见到如下界面:

图: 初始化电子琴界面

图:按数字键后电子琴界面

在进行操作的时候只要在键盘上按1-2这四个数字键就可以任意听取歌曲1—歌曲4,按数字键3时进入电子琴界面,这时候1-8分别表示音乐CDEFGABC这几个音符。按回车后退出电子琴操作界面,这时候按4退出程序。

四、课程设计的心得与体会

此次课程设计,我感觉到真的受益匪浅,真正感受到学习的乐趣,本来一直感觉课程设计是一门及其枯燥无味的课程项目,但是在此次实验中却品尝到摸索求知,不断试验的美味。

一直觉得上课讲的那些知识基本都能消化,但是到了真正轮到自己去运用它的时候,我发现实际操作起来并不那么方便。我感觉到有时候很明显的现象往往能蒙蔽你的双眼。同样在汇编语言就遇到这样问题,在实验过程中,我和李帅帅就碰到这样的问题:BX和CX共同决定着延时程序当中的延时时间,BX是循环变量,自然而然我们会把它放在循环体之外,可是并不是每个循环体之外都是可行的,经过一次次不断尝试和分析,原因在于:之前我们一直将mov BX,100该语句放在lop5中(很自然以为不在循环体外),但是仔细一分析,当每

一次调用gensound语句时都是经过了BX语句的,由此可以看出,并不是所有循环体语句都只是由一个大段语句构成,有时候更多的是多个语句段共同组成一个循环体。最后我们将BX语句换到gensound中,发现延迟时间分别随着BX和CX发生这变化。

在课程设计中,我发现许多知识都是紧密联系的,其中谱写歌谱时就需要一些音乐知识,在画流程图时,我就自己搜索网上资料找了edraw的软件进行绘制。

我该觉课程设计在大学中真的很重要,它是一次对我们学生在这一学期中对于该门功课最有效并且也很实际的一种检验和考核,也是今后我们大学生通往走向社会的一块奠基石。

五、参考文献

[1] 王忠民.微型计算机原理(第二版).西安:西安电子科技大学出版社,2007年 [2] 马春燕.微机原理与接口技术实验与学习辅导.北京:电子工业出版社.2007年 [3] 刘卫国,陈昭平,张颖.MATLAB程序设计与应用.北京:高等教育出版社,2002年 [4] 百度知识

本文来源:https://www.bwwdw.com/article/1fa4.html

Top