图形变换 1.docx
《图形变换 1.docx》由会员分享,可在线阅读,更多相关《图形变换 1.docx(23页珍藏版)》请在冰豆网上搜索。
图形变换1
学号:
课程设计
题目
钢琴模拟程序
学院
自动化学院
专业
电气工程及其自动化
班级
姓名
指导教师
2013
年
6
月
26
日
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
自
题目:
钢琴模拟程序设计
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
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日-----月7日调试程序
1月8日-----1月9日撰写课程设计报告
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
目录
摘要1
1.设计意义2
2.设计内容及其设计要求2
3.总体方案论证2
3.1按键与音调频率值的对应2
3.2扬声器的驱动分析3
3.3发声时间4
4.程序设计5
4.1主程序设计及其流程图5
4.2发声子程序SOUND6
5结果分析7
5.1程序调试7
5.2结果记录及分析8
结束语9
参考文献10
附录:
程序代码11
本科生课程设计成绩评定表
摘要
汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。
汇编语言,作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。
高级的汇编器如MASM,TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。
在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。
而此次的《微机原理与接口技术(基于16位机)》的课程设计正是利用这个学期所学的汇编语言来设计一个键盘钢琴的应用程序,要求该汇编语言程序能实现键盘钢琴的功能,就是在键盘上按下自定义的按键之后,可以从主板的蜂鸣器上发出一定频率的音调,而这些音调的频率都是相应音阶的特征频率,故发出的声正好就是音乐的各个音阶声调。
通过这个应用程序,按照音乐的谱子连续地按下相应按键,就可以像钢琴那样发出音乐来,但是局限于扬声器的原因,所发出的音乐没有真正的钢琴那样美妙。
但是现在的一些键盘钢琴的软件已经能驱动声卡,来获得更好更逼真的钢琴音乐效果了。
关键词:
汇编接口钢琴模拟
1.设计意义
键盘钢琴,电脑键盘代替钢琴键演奏钢琴乐曲。
最原始、也是最流行的版本,音符以ABCDEGF为编排。
让不懂音乐的网友可以快速上手,其体积小,简单方便、易传播,因此在网上普及率最高。
键盘钢琴让人可以在闲暇时刻,可以小小地娱乐一下,增加生活的乐趣。
由于一架钢琴过于昂贵,对于一般的普通工薪阶层的人来说,还是很难接触到钢琴的,而键盘钢琴的出现正好让那些业余爱好者,既满足的对钢琴音乐艺术的追求,也更廉价和便捷。
对于初学音乐的人来说,这样的键盘钢琴软件更是训练的好助手,可以帮助你迅速熟悉各音阶音调和旋律节奏。
因此,这样的软件也很多版本,有专业版,也有简单的Flash版,当然也有此次课设要求设计的简陋版。
专业版能提供多种乐器音色、录放功能、音符显示。
不太好的地方是键盘要按下去才发音,没有延时,弹起来不太就手。
Flash版音色也比较好,提供了多键位,也可以自定义键位。
2.设计内容及其设计要求
1.使用汇编语言设计一个弹奏程序,程序运行时使PC机成为一架可弹奏的“钢琴”;
2.屏幕显示钢琴图像;
3.当按下数字1-8时,依次发出1,2,3,4,5,6,7,i八个音调;按下CTRL-C则退出“钢琴”状态;
4.变调:
按下键“U”后,再弹奏和奏时琴键相应的音符频率变高;按下键“D”后,再弹奏和演奏时琴键相应的音符频率变低。
3.总体方案论证
3.1按键与音调频率值的对应
设计汇编语言程序,要实现键盘钢琴,首先是按键的自定义设计,因为题中要求设计的按键音调有8个,并且按u和d可以设置升降调,经上网查找资料,设定钢琴频率如表1-1所示,其中设置了7个倍频,可用u和d来调整倍频数。
表1-1音调频率与倍频的对应关系
倍频数
1
2
3
4
5
6
7
i
1
65
73
82
87
98
110
123
130
2
130
146
164
174
196
220
246
260
3
260
292
328
348
392
440
492
520
4
520
584
656
696
784
880
984
1040
5
1040
1168
1312
1392
1568
1760
1968
2080
5
2080
2336
2624
2784
3136
3520
3936
4160
7
4160
4672
5248
5568
6272
7040
7872
8320
相邻倍频数音调频率之间有着两倍的关系,这样就很方便数据的储存了,只需要将其中一个倍频的频率值存储下了,再进行二倍关系的换算可得到所需要的频率,实际调试过程中最高设置到7倍频比较合适。
程序数据区可存储一倍频的数据:
FREQDB65,73,82,87,98,110,123,130
这样,不仅节省了存储空间,而且降低了存储数据的复杂程度。
倍频数的设置
在数据区设置一个倍频数并且使其初始倍率为1
DIAODB1
在程序中通过u或d的输入可以来修改DIAO中的数据,从而改变并且保持倍频数。
设定好倍频数之后,键盘输入1到8的数字,将输入的ascii码转换成一倍频数据区的所对应的偏移地址,就可以用查表的方法取出所需的一倍频频率,然后在乘上已经设置好的倍频数,即可得到所需要输出的音频。
3.2扬声器的驱动分析
所用该程序主要是驱动电脑主板上的扬声器,根据音阶音调不同的频率值,来是扬声器发出不同的声音,从而产生想弹钢琴一样的感觉,当然音质是不能相提并论的。
(在这里需要说明的是,现在大多数笔记本主板上已没有这个扬声器,但是台式机大多还是有的,在台式机上的效果更好点。
)
在电路上如下图3-1所示:
8255(PB1)
图3.18253的电路连接图
在PC/XT/AT家族中,计时器芯片的3个通道都用其专门的功能,通道2是用来控制计算机的扬声器的声音频率的。
通道2用于产生频率信号,故工作方式在方式3,计数值为6A4H=1190,方波输出频率为1.19MHz/1190=1KHz,此信号决定了扬声器的声调,而通道2的控制字则为0B6H,1.19M约等于十六进制12348CH。
由图1-1可知8253的通道2计数由8255A的PB0控制,当PB0输出为高电平的时候,是门GATE2为高电平。
此时,8253的通道2允许计数,故通道2的输出方波受PB0控制,从而控制扬声器的音调高低。
通道2的输出能否对扬声器产生持续控制还取决于8255A的PB1。
当PB1为“0”时,OUT2不能通过“与门”;反之则可通过“与门”控制扬声器。
所以,扬声器发音时间的长短取决于8255A的PB1信号。
另外,CPU通过8255A的C口,得知5283通道2的状态和扬声器驱动器的状态。
由上可知,需要扬声器正常发声,需要8253和8255A的协同工作,而8253的控制字在网上查的为43H,则同过下面的程序来初始化8253。
MOVAL,0B6H
OUT43H,AL
而通道2的端口地址为42H,由于N值一般计算得出都大于255,故需要一个字的写入,而又因为8253只有八位数据线,故字的写入需要两次,一般将N值直接给AX然后通过下面的程序即可完成。
OUT42H,AL
MOVAL,AH
OUT42H,AL
而8255A能控制8253和扬声器,但是只要PB0和PB1同时为高调平,扬声器就为开,则对8255A的控制就是在对扬声器的控制,在网上得知8255A的B口地址为61H,则可以通过下面的程序实现扬声器的开与关。
INAL,61H
ORAL,3;可以保证PB0和PB1同时为高调平
OUT61H,AL;打开扬声器
MOVAL,AH
ANDAL,0FCH;可以保证PB0和PB1同时为低调平
OUT61H,AL;关闭扬声器
3.3发声时间
因为只要通过8255A将扬声器打开而不关闭,那么只要8253正常工作,扬声器就会一直发声,需要发声时间多长,只需要写一个延时子程序即可,利用LOOP和跳转指令就可以得到一个双循环程序,在根据指令时间依次乘以LOOP循环的次和跳转指令的跳转次数就可以得到想要的延时时间。
子程序循环完毕在将扬声器关闭即可。
延时子程序时间的长短就是发声时间的长短。
4.程序设计
4.1主程序设计及其流程图
图4.1主程序的流程图
如图4-1,主程序的主要任务:
1)如果输入的KEY为“ESC”时,直接跳转至退出EXIT处;
2)如果出输入按键为u或d时,改变倍频并且返回输入;
3)如果输入为1到8时,发出相对应的频率的声音并返回输入;
4)如果输入为其他则直接返回输入。
4.2发声子程序SOUND
图4.2子程序SOUND流程图
子程序SOUND流程图如图3-3所示,其主要任务是完成发声,在该子程序中,分两次向通道2端口42H写入计数初值N的程序语句为:
OUT42H,AL
MOVAL,AH
OUT42H,AL
打开和关闭扬声器的程序为:
INAL,61H
ORAL,3;可以保证PB0和PB1同时为高调平
OUT61H,AL;打开扬声器
MOVAL,AH
ANDAL,0FCH;可以保证PB0和PB1同时为低调平
OUT61H,AL;关闭扬声器
5.结果分析
5.1程序调试
按上面的思路和流程图写好程序后,对程序进行调试:
在选择基频的时候,最初选择的是网上给的数据:
131,147,165,175,196,220,247,262,而在写好程序之后运行发现,输入1到7或u/d是,程序正常运行,但是一旦输入为8的时候,程序就会出现如图5-1所示错误,经过debug过程分析后,发现262超过了db类型的范围。
解决这个问题,最初的方案是把类型从db换成dw,但是认为还要修改后面的程序,所以选择了将基频存储区的数据降到原来的一半运行之后成功解决。
图5.1调试图
5.2结果记录及分析
调试之后,运行结果和课题的设计要求完全相符合。
开始运行程序,能看到如下图5-2所示的“Welcometo"PianoofKeyboard"”程序运行开始提示语和以及如下所示操作提示语,
图5-2操作界面图
进入操作界面之后,按下1到8键,pc机会发出一倍频的所对应的音调;每按下一次u键,倍频自动加1,直到倍频为7时,按下u键,倍频保持为7不变,此时按下1到8键,便会发出对应倍频对应按键的音调;每按下一次d键,倍频减1直到倍频等于1,此时按下1到8键,将发出对应倍频对应音调;当按下出esc、u、d、1到8以外的按键是,界面保持不变。
按esc键结束程序时,出现如图5-3所示的结束语。
图5-3结束界面图
结束语
通过这两周的硬件课程设计,我对微机原理及接口技术这门课有了更深的认识,系统的掌握了微机原理及接口的应用知识。
这次课程设计我做的是用开关模拟电子琴发声。
在老师确定题目后,我便去图书馆查阅了大量的关于开关输入和发声程序设计的书籍,然后确定好自己的方案,对自己的设计有了一个大概的思路。
通过编程,我学会了如何独立的写出程序,提高了自己的分析解决问题的能力,并且使自己所学的知识与实践相结合,应用到实践当中。
课程设计中涉及到许多接口芯片,使我对这些芯片有了更深的认识,对芯片的各种工作方式有了更深的理解,虽然没有进行硬件的调试,但通过设计,我也学到了很多书本上没有的知识。
在设计当中遇到了很多的问题,但通过查找资料,克服了这些问题,提高了自己在实际当中解决问题的能力。
虽然此次课程设计的过程是艰辛的,但结果还是令我比较欣慰的。
在此特别感谢老师对我的指导。
参考文献
[1]周佩玲,彭虎,傅忠谦.微机原理与接口技术(基于16位机),电子工业出版社,2005.
[2]周佩玲,吴耿峰,万炳奎编.十六位微型计算机原理接口及其应用,中国科学技术大学出版社,1995.
[3]周明德.微型计算机系统原理及应用(第四版)习题集与实验指导书,清华大学出版社,2002.
[4]戴梅萼.微型计算机技术及应用(第三版).清华大学出版社,2003.
[5]孙德文.微型计算机技术.高等教育出版社,2001.
[6]王爽.汇编语言.清华大学出版社(第二版),2008
附录:
程序代码
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
DIAODB1
KEYSDB'12345678'
FREQDB65,73,82,87,98,110,123,130
WELCDB'Welcometo"PianoofKeyboard"',0DH,0AH
EXPLDB'Explanation:
',0DH,0AH,
'Key:
12345678Notes1234567i',0DH,0AH,
'Key:
uNotesrisethetone',0DH,0AH,
'Key:
dNoteslowerthetone',0DH,0AH,
'PleaseNoteYourCapsLockTrunedoff',0DH,0AH
ESCQDB'Pleaseplay:
',0DH,0AH,
'(YoucanType"ESC"toexit)',0DH,0AH,'$'
LASTDB0DH,0AH,'Welcomeagain!
','$'
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
START:
MOVAX,DATA
MOVDS,AX;初始化数据区
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,9
INT21H;显示提示语句
INPUT:
MOVAH,7
INT21H;不回显输入键盘的KEY
CMPAL,1BH;判断输入KEY是否为“ESC”
JZEXIT;若输入KEY为“ESC”则跳转到退出EXIT
CMPAL,75H
JNZDOWN1;输入是否为u,不是跳到down1
LEADI,[DIAO]
MOVCL,[DI]
CMPcl,64;倍频数是否大于64(7倍频),大于64跳到out11
J