钢琴模拟程序设计.docx

上传人:b****8 文档编号:9324416 上传时间:2023-02-04 格式:DOCX 页数:29 大小:213.23KB
下载 相关 举报
钢琴模拟程序设计.docx_第1页
第1页 / 共29页
钢琴模拟程序设计.docx_第2页
第2页 / 共29页
钢琴模拟程序设计.docx_第3页
第3页 / 共29页
钢琴模拟程序设计.docx_第4页
第4页 / 共29页
钢琴模拟程序设计.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

钢琴模拟程序设计.docx

《钢琴模拟程序设计.docx》由会员分享,可在线阅读,更多相关《钢琴模拟程序设计.docx(29页珍藏版)》请在冰豆网上搜索。

钢琴模拟程序设计.docx

钢琴模拟程序设计

学号:

课程设计

 

题目

钢琴模拟程序设计

学院

自动化学院

专业

电气工程及其自动化

班级

姓名

指导教师

 

2014

1

7

课程设计任务书

学生姓名:

专业班级:

指导教师:

工作单位:

自动化学院

题目:

钢琴模拟程序设计

要求完成的主要任务:

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

1.使用汇编语言设计一个弹奏程序,程序运行时使PC机成为一架可弹奏的“钢琴”。

2.屏幕显示钢琴图像;

3.当按下数字1-8时,依次发出1,2,3,4,5,6,7,i八个音调;按下CTRL-C则退出“钢琴”状态。

4.变调:

按下键“U”后,再弹奏和演奏时琴键相应的音符频率变高;按下键“D”后,再弹奏和演奏时琴键相应的音符频率变低;

5.撰写课程设计说明书。

内容包括:

摘要、目录、正文、参考文献、附录(程序清单)。

正文部分包括:

设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。

时间安排:

12月26日-----12月28日查阅资料及方案设计

12月29日-----1月2日编程

1月3日-----1月7日调试程序

1月8日-----1月9日撰写课程设计报告

 

指导教师签名:

年月日

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

年月日

目录

目录1

绪论2

1课程设计的目的和意义3

1.1课程设计的意义3

1.2课程设计的目的3

2课程设计的内容4

2.1设计内容与要求4

3可编程定时器/计数器芯片82534

3.18253的主要特性4

3.28253的内部结构5

3.38253的控制字和初始化编程6

4电路连接7

4.1工作原理7

5课程设计过程8

5.1设计思路8

6程序流程图设计9

7软硬件各模块内容9

7.1开启扬声器9

7.2关闭扬声器10

8演奏单音符10

9控制演奏时间11

10程序清单及详细注释11

11程序运行结果24

小结25

参考文献26

本科生课程设计成绩评定表27

 

绪论

微机原理的汇编语言是面向机器的程序设计语言。

在汇编语合中,用助记符代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。

这样用符号代替机器语言的二进制码,就把机器语音变成了汇编语言。

于是汇编语言亦称为符号语言。

使用汇编语言编写的程序,机器个能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。

汇编语言把汇编程序翻译成机器语言的过程称为汇编。

其特点如下:

1.微机原理的汇编是面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。

2.具有直接和简捷的特点。

3.可有效地访问、控制计算机的各种硬件设备。

4.目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。

5.经常与高级语言配合使用,应用十分广泛。

关键词:

简洁速度快高效汇编语言

 

1课程设计的目的和意义

1.1课程设计的意义

微机原理及接口技术课程设计是通过解决特定的现实问题,从而对所学的课程内容进行全面、系统的总结、巩固和提高的一项十分重要课程实践活动。

在了解了汇编语言的特点,并且选择相应的课题,在老师的指导下,应由学生独立完成。

其中课程设计要求同学们熟悉汇编语言的编程、连接、调试、‘运行等步骤,以及更重要的在设计中所设计的相关软硬知识。

通过课程设计,一方面提高运用汇编语言变成解决实际问题的能力;另一方面使同学们更深入的了解计算机系统内部的有关知识,提高了同学们的学习兴趣并且为以后的学习和系统开发奠定良好的基础。

1.2课程设计的目的

通过课程设计可以更进一步锻炼同学们在微型计算机应用方面的实际应用能力。

在当今社会计算机科学飞速发展,因此,学习这方面的知识必须要紧密联系实际,所以说掌握这方面的知识更要强调实际问题的能力。

通过设计可以体现学生如何面对一个实际问题,如何自己收集资料,如何自己去学习新的知识,如何去制定解决问题的方案并通过实践不断地区分析和解决在完成设计上的一切问题,最终到所需目的。

 

2课程设计的内容

1

2

2.1设计内容与要求

1.使用汇编语言设计一个弹奏程序,程序运行时使PC机成为一架可弹奏的“钢琴”。

2.屏幕显示钢琴图像;

3.当按下数字1-8时,依次发出1,2,3,4,5,6,7,i八个音调;按下CTRL-C则退出“钢琴”状态。

4.变调:

按下键“U”后,再弹奏和演奏时琴键相应的音符频率变高;按下键“D”后,再弹奏和演奏时琴键相应的音符频率变低;

5.撰写课程设计说明书。

内容包括:

摘要、目录、正文、参考文献、附录(程序清单)。

正文部分包括:

设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。

 

3可编程定时器/计数器芯片8253

3.18253的主要特性

8253是为微型计算机配套而设计的一个可编程定时器/计数器芯片,24引脚双列直插式封装。

其主特性是:

1.片内具有3个独立的16位减法计数器,每个计数器又可分成两个8位的计数器。

2.计数频率为0~2Mhz。

3.两种计数方式:

即二进制或BCD方式计数。

4.六种工作方式,即可对系统时钟脉冲计数实现定时,又可对外部事件进行计数。

5.可由软件或硬件控制开始计数或停止计数。

3

3.1

3.28253的内部结构

8253的内部结构主要由以下的几个部分组成:

(1)、数据总线缓冲器:

数据缓冲器为8位、双向、三态的缓冲器,CPU通过它,一方面可以向控制寄存器写入控制字,向计数器写计数初值;另一方面可以从计数器读取当前计数值。

(2)、读/写逻辑电路:

读/写控制逻辑从系统总线接收输入信号,经过译码,实现8253各部分的控制

(3)、控制字寄存器:

接收从CPU来的控制字,并由控制字的D7,D6位的编码决定控制字节写入哪个计数器的控制寄存器

(4)、计数器

1.一片8253内部有3个独立的计数器,每个计数器对外有3只引肢,GATA:

门控信号;计数脉冲输入端;OUT:

计数器输出端。

2.通常在系统设计时,A1,A0接系统地址线A1A0,因此一片8253占用4个连续的口地址,即当CS=0时:

A1A0=00选中0号计数器;A1A0=01选中1号计数器;

A1A0=10选中2号计数器;A1A0=11选中控制器寄存器;

3.计数器有两种启动方式:

软件启动和硬件启动。

软件启动:

在GATE为高电平时,装入计数初值后,每个CLK信号下降沿使计数器计数一次。

硬件启动:

装入计数初值后不计数,等到GATE信号出现低电平到高电平的跃变之后,每个CLK信号下降沿使计数器计数一次。

4.每个计数器有6种工作方式可供选择

方式0:

软件启动的“事件计数器”,减1计数,计数值减到0时输出高电平;

方式1:

硬件启动时的“单脉冲发生器”,减1计数,计数值减到0时输出负脉冲;

方式2:

软件启动的“脉冲发生器”,减1计数,计数值减到1时输出负脉冲;

方式3:

软件启支的“方波发生器”,减2计数;

方式4:

软件启动的“单脉冲发生器”,减1计数,牙地数值减到0时输出负脉冲;、

方式5:

硬件启动的“单脉冲发生器”,减1计数,计数值减到0时输出负脉冲。

其中,方式2、方式3具有初值自动重装的功能,因此,工作在方式2、方式3的时候,计数器能够输出连续信号。

3.2

3.38253的控制字和初始化编程

(1).初始化编程分两步进行,首先向控制寄存器写入控制字,预置相关计数器的工作方式,通报计数初值的写入顺序;承受后向使用的计数器写入计数初值。

计数初值的计算公式如下:

计数初值=Fclk/Fout

(2).8253的控制字

控制字格式如下图所示,对于8253而言,D7D6=人1是无效控制字,对于8254而言,D7D6=11是读出命令的标志之一。

图3.18253的控制字格式

4电路连接

4.1工作原理

PC机扬声器电路以及相关接口电路如下:

图4.18253与驱动电路接线图

PC中的定时电路有三个通道,通道3用于发声,通道1用于控制系统内部的时钟。

大家都十分清楚用DOS的"TIME"命令可以观察并修改系统内部的一个时钟,这个时钟之所以能连续运转主要依靠定时器的通道1。

  通道1的工作方式和通道3一样,但是系统启动时设定其发出一个频率固定为18.2Hz的信号,这个信号直接送到系统中的"中断控制器"。

每一个"Hz"都产生一个硬件中断,一般称这个硬中断为"IRQ0",对应的中断号是08H。

也就是说,当计算机启动后,我们的机器看上去十分平静,但实际上CPU非常忙碌。

在定时器的控制下每隔55毫秒就要执行一个08H号中断,这个中断的主要工作就是连续地计数。

  在内存"0040H:

006CH"处有四字节的存储空间专门用于保存计数值,CPU每执行一次08H中断,这四字节的计数值就被加1,不难算出这个计数值每增加1091后时间恰好过了1分钟,每增加65454后时间恰好过了1小时。

系统内部的时钟之所以能准确走时,靠得就是08H中断和这四字节的计数值。

因此我们要想精确的定时,必须依靠时钟计数值才行。

由于PC计算机的时钟晶振为1.1931816MHz,根据频率的公式:

f=1/T

则频率周期为T=1/f

定时器的计数器为16位计数器,则最大的计数值为65536,那么其定时时间为:

t=65536*T=65536/f=0.0549254(秒)

即:

PC定时器每秒可中断18.2065次。

5课程设计过程

5.1设计思路

1.先进行七种频率的设定

表5-1各种音调对应的频率

2,初始化8253计数器,调键盘输入功能调用

3输入对应的一个字符,如果是其他任意键将退出如果在1~8则将指针指向所对应的频率,通过初值转换程序转换成所对应的初值。

4.开启扬声器,程序后附。

将初值通过42端口输出。

延时一定的时间,转入下一个,初始化8253,等待键盘输入。

 

6程序流程图设计

图6.1程序流程图

7软硬件各模块内容

7.1开启扬声器

 

图7.1扬声器的开启电路

如图所示,PC系列机的发声系统其核心部件为系统定时器的2号计数器,系统初始化时,2号计数器的工作方式为方波发生器,计数初值为二进制数,用户只需改变计数初值就能得到不同的频率的方波输出门控制信号GATE2和扬声器输入8255芯片PB0相连,PB0和PB1端同时为高电平时可使扬声器发声,PB0和PB1同时为0时,扬声器关闭。

2号计时器的端口地址为42H,8255端口地址为61H,执行如下程序时可以打开扬声器:

PUSHAX

INAL,61H

ORAL,03H

OUT61H,AL

POPAL

1

2

3

4

5

6

7

7.1

7.2关闭扬声器

执行如下的程序可以关闭扬声器:

INAL,61H

ANDAL,0FCH

OUT61H,AL

 

8演奏单音符

每一种曲调中,各个音符有不同的频率对2号计数器只需设置不同的计数初值即可输出不同的频率,从而发出不同的音调,计数初值的计算公式如下:

计数初值=1.193182MHZ/输出频率

1.193182MHZ转换成十六进制数应该为1234DEH,因此接通扬声器的前提下,执行下列的程序段即可发出与频率对应的音调

MOVDX,12H

MOVAX,34DEH

MOVCX,频率值

DIVCX

OUT42H,AL

MOVAL,AH

MOV42H,AL

 

9控制演奏时间

hhhPROCNEAR

PUSHCX

PUSHDX

MOVDX,500

dl1:

MOVCX,1000

dl2:

LOOPdl2

DECDX

JNZdl1

POPDX

POPCX

RET

hhhENDP

 

10程序清单及详细注释

;画横线

DRAWLINE0MACROSTART_X,START_Y,END_X,COLOR

LOCALPAINT

PUSHAX

PUSHBX

PUSHCX

PUSHDX

MOVAH,0CH

MOVAL,COLOR

MOVBX,0

MOVCX,START_X

MOVDX,START_Y

PAINT:

INT10H

INCCX

CMPCX,END_X

JCPAINT

POPDX

POPCX

POPBX

POPAX

ENDM

;画竖线

DRAWLINE1MACROSTART_X,START_Y,END_Y,COLOR

LOCALPAINT

PUSHAX

PUSHBX

PUSHCX

PUSHDX

MOVAH,0CH

MOVAL,COLOR

MOVBX,0

MOVCX,START_X

MOVDX,START_Y

PAINT:

INT10H

INCDX

CMPDX,END_Y

JCPAINT

POPDX

POPCX

POPBX

POPAX

ENDM

;画斜线向右倾斜

DRAWOBILQUEMACROSTART_X,START_Y,END_X,COLOR

LOCALPAINT2

PUSHAX

PUSHBX

PUSHCX

PUSHDX

MOVAH,0CH

MOVAL,COLOR

MOVBX,0

MOVDX,START_Y

MOVCX,START_X

PAINT2:

INT10H

DECCX

INCDX

CMPCX,END_X

JAPAINT2

POPDX

POPCX

POPBX

POPAX

ENDM

;画填充矩形

DRAWMACROSTART_X,START_Y,END_X,END_Y,COLOR

LOCALDRAW_NEXT

PUSHAX

PUSHBX

PUSHCX

PUSHDX

MOVAH,0CH;写像素点

MOVAL,COLOR;设置颜色

MOVBH,0;选用页号0

MOVCX,START_X;列起始点

MOVDX,START_Y;行起始点

DRAW_NEXT:

INT10H;画点

INCCX;画横线

CMPCX,END_X;比较行是否画完

JNEDRAW_NEXT;画另一行

MOVCX,START_X;另一行的起始点

INCDX

CMPDX,END_Y;比较列是否画完

JNEDRAW_NEXT;未完继续画

POPDX

POPCX

POPBX

POPAX

ENDM

datasegment

f1dw524,588,660,698,784,880,988,1048

WELCDB'Welcometo"PianoofKeyboard"',0DH,0AH,0DH,0AH

DB'********************************************************************************'

DB'Explanation:

'

DB0DH,0AH,'Key:

12345678'

DB0DH,0AH,'High-uMiddle-qLow-dEXIT:

c'

DB0DH,0AH,'********************************************************************************','$'

reminderDB0DH,0AH,'Reminder:

Pleaseplaythekey:

"12345678"andreplayuordagain',0DH,0AH,'$'

lastDB0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,''

DB0DH,0AH,0DH,0AH,0DH,0AH,'*******************'

DB0DH,0AH,'*!

!

!

THANKYOU!

!

!

*'

DB0DH,0AH,'*******************','$'

WHITEDB0FH

BLACKDB0

YELLOWDB0EEH

GRAYDB8

TABFCDW192,294,330,350,393,441,495

BUFFERDW0

DTIMEDW10

TONEFDW0

TABOLINEDW240,290,340,390,440,490

BLACKLDW225,275,375,425,475

BLACKRDW255,305,405,455,505

BBLDW180,230,330,380,430

BBRDW211,261,361,411,461

WLDW101,151,201,251,301,351,401

WRDW150,200,250,300,350,400,451;定义数据段

dataends

codesegment

assumecs:

code,ds:

data

hhhprocnear;延迟子程序

pushdx

pushcx

movdx,500

dl1:

movcx,1000

dl2:

loopdl2

decdx

jnzdl1

popdx

popcx

ret

hhhendp

start:

movax,data;主程序

movds,ax;初始化ds

MOVAH,00H

MOVAL,12H

INT10H

MOVSI,190;SI=START_X;绘制钢琴图

MOVDI,140;DI=START_Y

MOVBP,540;BP=END_X

DRAWW4:

DRAWLINE0SI,DI,BP,WHITE

DECSI

DECBP

INCDI

CMPDI,230

JCDRAWW4;画阴影

DRAW100,230,450,250,GRAY;侧面阴影

MOVSI,140

PAINTSIDE4:

DRAWOBILQUE540,SI,450,GRAY

INCSI

CMPSI,160

JCPAINTSIDE4;黑键阴影

MOVSI,140

PAINTSIDE04:

DRAWOBILQUE255,SI,210,BLACK

INCSI

CMPSI,150

JCPAINTSIDE04

MOVSI,140

PAINTSIDE14:

DRAWOBILQUE305,SI,260,BLACK

INCSI

CMPSI,150

JCPAINTSIDE14

MOVSI,140

PAINTSIDE24:

DRAWOBILQUE405,SI,360,BLACK

INCSI

CMPSI,150

JCPAINTSIDE24

MOVSI,140

PAINTSIDE34:

DRAWOBILQUE455,SI,410,BLACK

INCSI

CMPSI,150

JCPAINTSIDE34

MOVSI,140

PAINTSIDE44:

DRAWOBILQUE505,SI,460,BLACK

INCSI

CMPSI,150

JCPAINTSIDE44;画分割线

MOVSI,240

REDRAW04:

MOVDI,SI

SUBDI,90

DRAWOBILQUESI,140,DI,BLACK

ADDSI,50

CMPSI,540

JCREDRAW04

MOVSI,150

REDRAW14:

DRAWLINE1SI,230,250,BLACK

ADDSI,50

CMPSI,440

JCREDRAW14;画黑键盘

MOVBX,0

PAINTB4:

MOVSI,OFFSETBLACKL

MOVDI,OFFSETBLACKR

MOVSI,[SI+BX]

MOVBP,[DI+BX]

MOVDI,140

DRAWB4:

DRAWLINE0SI,DI,BP,BLACK

DECSI

DECBP

INCDI

CMPDI,185

JCDRAWB4

ADDBX,2

CMPBX,9

JCPAINTB4;黑键底下阴影

MOVBX,0

PAINTBB4:

MOVSI,OFFSETBBL

MOVDI,OFFSETBBR

MOVSI,[SI+BX]

MOVBP,[DI+BX]

DRAWSI,185,BP,195,BLACK

ADDBX,2

CMPBX,9

JCPAINTBB4

LEADX,WELC

MOVAH,09H

INT21H

sound:

movah,1h

int21h

cmpal,'c'

jzexit

cmpal,'u';判断是否为频率并且判断数字1~8

jzsound1

cmpal,'d'

jzsound2

cmpal,'1'

jbremind

cmpal,'8'

jaremind

subal,31h

movbl,2

mulbl

movah,0;ax高8位为0

movsi,ax;保护AL于SI中,以待后用,作为参数传递

movbx,f1[si]

movax,0000h

movdx,0012h

divbx

movbx,ax

movdx,43h;控制字

moval,0b6h

outdx,al;写入控制端口

moval,bl

out42h,al;先写低8位

moval,bh

out42h,al;后写高8位

inal,61h;读PB口当前状态

movah,al

oral,03h;使PB0、PB1均为1,打开与门

out61h,al;接通扬声器

callhhh;调用hhh

moval,ah

andal,0fch;使PB0、PB1均为0,关闭与门

out61h,al

jmpsound

sound1:

movah,01h

int21h

cmpal,'c'

jzexit

cmpal,'q'

jzsound

c

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

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1