钢琴模拟程序设计.docx
《钢琴模拟程序设计.docx》由会员分享,可在线阅读,更多相关《钢琴模拟程序设计.docx(29页珍藏版)》请在冰豆网上搜索。
钢琴模拟程序设计
学号:
课程设计
题目
钢琴模拟程序设计
学院
自动化学院
专业
电气工程及其自动化
班级
姓名
指导教师
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