微机原理课程设计 电子琴课程设计报告.docx
《微机原理课程设计 电子琴课程设计报告.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计 电子琴课程设计报告.docx(29页珍藏版)》请在冰豆网上搜索。
微机原理课程设计电子琴课程设计报告
计算机与信息工程系
《系统接口设计》报告
电子琴课程设计
院系:
计算机信息工程系
专业:
计算机应用
班级:
Z090551班
学号:
Z09055115
姓名:
刘莎
指导老师:
赵国增
完成时间:
2011年6月10日
评语:
成绩:
批阅教师签名:
批阅时间:
摘要
随着科技的高速发展,计算机已经经过了好几代的更新,然而计算机的运行的基本原理依然没有改变的。
而今,我们通过两年的学习,已经初步了解了计算机的基本结构和原理,并且已经学会了用汇编语言进行基本的程序编写。
而本次课程设计的主要目的就是巩固所学过的知识,用汇编语言熟练地运用三大结构,进一步掌握一些指令的功能、掌握子程序的定义及调用和中断的使用,同时熟练运用通用寄存器和堆栈来进行编写一个完整的具有某种特定功能的程序。
这个简易的电子琴设计采用了软硬件结合的方法完成了设计的要求不。
应用了8255和8253的芯片,CPU和8086达到软硬件的结合。
从而实现了PC机电子琴的弹奏和播放音乐的两种功能:
1、弹奏用户每按奏一个键盘琴键就会发出相应的音符;
2、按下键盘上某些特定的键后,会自动弹奏预存琴谱的功能。
键的控制:
ESC或者ENTER:
退出;
Q,W,E,R,T,Y,U音符高音键;
A,S,D,F,G,H,J音符中音键;
Z,X,C,V,B,N,M音符低音键;
1,2,3,4,5,6,7音符重音键;
按P键进入音乐播放菜单,显示菜单后,按Q键返回上一级菜单,1,2,3,4键播放预存曲谱的歌曲。
在本次课程设计中,考察了我们编程的技巧、运用Debug动态调试工具进行程序的调试的能力。
同时,本道设计题目还检查了学生对汇编语言这门课程的基本知识的掌握程度。
只有掌握汇编语言基本编程方法,掌握程序各部分功能及其相互联系、相互作用,并要熟悉基本的音乐知识,才能独立的把程序写出来,才能把程序写好。
关键字:
课程设计、汇编语言、指令、中断、寄存器
第1章电子琴课程设计
1.1电子琴课程设计的目的与意义
1.1.1电子琴课程设计的目的
本课程设计主要是通过汇编语言用软件编程的方法实现简单的PC仿真电子琴。
通过在《微机原理与接口技术》课程上所学的汇编知识和相关芯片知识,来完成本课程设计。
学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。
通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。
1.1.2电子琴课程设计的意义
通过此课程设计可提高我们独立思考问题解决问题的能力,学会怎样去查资料,有效的利用网络所提供的有效资源。
提高我们主动学习的能力。
1.2电子琴课程设计的内容与要求
1.2.1电子琴课程设计的内容
通过汇编语言用软件编程的方法实现简单的PC仿真电子琴。
1.2.2电子琴课程设计的要求
1、按键发音
(1)当从键盘上敲击q~u时,音响发出哆、唻、咪、发、嗦、啦、唏、唗的重低音节。
(2)当从键盘上敲击a~j时,音响发出哆、唻、咪、发、嗦、啦、唏、唗的低音节。
(3)当从键盘上敲击z~m时,音响发出哆、唻、咪、发、嗦、啦、唏、唗的中音节。
(4)当从键盘上敲击1~7时,音响发出哆、唻、咪、发、嗦、啦、唏、唗的高音节。
(5)按Esc或者Enter键时退出程序。
2、屏幕显示所有操作的提示信息。
1.3电子琴课程设计应解决的主要问题
该课程设计应该解决的主要问题有:
(1)查找出哆、唻、咪、发、嗦、啦、唏、唗七个音节所对应的重低音、低音、中音、高音的频率值。
(2)所有提示信息的显示。
(3)音乐的自动播放问题,其中包括音乐的节拍值、每个音节的频率值、如何设定频率和停顿时间。
(4)蜂鸣器的开启与关闭。
第2章电子琴课程设计的原理、思路和流程图
2.1电子琴课程设计的原理
2.1.1各个音节频率的设定
(1)对于一个特定的D/A转换接口电路,CPU执行一条输出指令将数据送入D/A,即可在其输出端得到一定的电压输出。
给D/A转换器输入按正弦规律变化的数据,在其输出端即可产生正弦波。
对于音乐,每个音节都有对应的频率。
各音节对应频率值(如表1—1):
表1-1
音节
哆
唻
咪
发
嗦
啦
唏
重低音频率(单位:
HZ)
131
147
165
175
196
220
247
低音频率(单位:
HZ)
262
294
330
349
392
440
494
中音频率(单位:
HZ)
523
587
659
698
784
880
988
高音频率(单位:
HZ)
1046
1175
1318
1397
1568
1760
1975
(2)产生一个正弦波的数据可取32(小于亦可),各不同频率的区别,可通过调节向D/A转换器输出数据的时间间隔,例如:
发重低音“哆”的频率为131HZ,周期为(1/131)ms,定时时间可以由8253配合8255来实现。
按下某键后发音时间的长短可以由发出的正弦波的个数多少来控制。
2.1.2电路连接图
8253和8255的电路连接图(如图2-1)
图2-1
2.2电子琴课程设计思路
在本次课程设计中,根据复杂程序设计思想——模块化程序设计,分析和确定程序总体设计目标:
电子琴基本功能及部分扩展功能后,将总体目标划分为若干模块(子程序,具体可见下)。
程序设计的思路按以下顺序进行:
1.分析与确定程序总体设计目标
2.将总体目标划分为若干模块
3.定义每个模块的具体任务,明确它与其他模块间的通信方式
4.编写源程序,进行调试,包括:
<1>音乐弹奏
用户可以根据自己的兴趣爱好,自己按键弹奏音乐或者选择退出程序。
<2>音乐播放
音乐菜单中列出了4首音乐,用户可以根据喜好选择收听其中的任何一首音乐或者选择退出程序。
5.模块连接,形成完整的程序
6.编写程序文档
2.3电子琴课程设计的流程图
(1)主菜单的流程图(如图2-2)
图2-2
(2)播放音乐子程序的流程图(如图2-3)
图2-3
(3)弹奏音乐子程序的流程图(如图2-4)
图2-4
第3章电子琴课程设计的源代码
datasegment;数据定义段
assumeds:
data;建立数据段寄存器寻址
msg_1db'<<---WelcomeyoutothisOS.--->>$',0dh,0ah;定义字节
msg_2db0dh,0ah,'InthisOS.youcanpressbelowkeystoenjoy:
$'
msg_8db0dh,0ah,'Youcanpress''p''toplaymusic!
Orplayamusicbyyourself$'
msg_3db0dh,0ah,'SuperLow:
q-w-e-r-t-y-u$'
msg_4db0dh,0ah,'Low:
a-s-d-f-g-h-j$'
msg_5db0dh,0ah,'Mid:
z-x-c-v-b-n-m$'
msg_6db0dh,0ah,'Hig:
1-2-3-4-5-6-7$'
msg_7db0dh,0ah,'Anytimeyoucanpress''Esc''or''Enter''toexit.$'
msg_9db0dh,0ah,'Pleaseselectthemusic(press''q''toexitthemainmenu):
$'
msg_10db0dh,0ah,'1.Huaxin$'
msg_11db0dh,0ah,'2.Jinglebells$'
msg_12db0dh,0ah,'3.Happybirthdaytoyou$'
msg_13db0dh,0ah,'4.Happynewyear$'
msg_21db0dh,0ah,'$'
note_tdw131,147,165,175,196,220,247;重低音
dw262,294,330,349,392,440,494;低音
dw523,587,659,698,784,880,988;中音
dw1046,1175,1318,1397,1568,1760,1975;高音
dw0;休止符0
;'1','2','3','4','5','6','7';从低到高
key_tdb'q','w','e','r','t','y','u';重低音
db'a','s','d','f','g','h','j';低音
db'z','x','c','v','b','n','m';中音
db'1','2','3','4','5','6','7';高音
db'0';休止符0
;画心
music_n1db'b','c','c','x','z','x','x','b','c'
db'0','b','c','c','x','z','x','b','n'
db'c','0','b','c','c','x','z','x','z','j'
db'z','x','j','g','h','d','g'
db'h','h','c','x','z','j','j','g','h'
db'g','g','h','h','z','j','h','g'
db's','d','d','d','g','h','h','j','z','g'
db'z','x','x','c','c','b','c','c','x','z','x'
db'z','j','z','x','j','g','h','d','g'
db'h','h','c','x','z','j','g','h','h','0'
db'd','d','g','h','h','z','j','h','g','h'
db'h','d','d','d','g','h','h','j','z','g','z'
db'x','x','c','c','b','c','c','x','z'
db'x','z','j','z','x','j','g','h','d','g','h'
db'h','c','x','z','j','g','h','h','b','c'
db'c','x','z','x','x','b','c','c','c','b','c'
db'c','x','z','x','b','n','x','c','c'
db'b','c','c','x','z','x','z','j'
db'z','x','j','g','h','d','g','h','h','c'
db'x','z','j','g','h','h',0
music_d1db4,4,8,4,4,8,4,4,16
db8,4,4,8,4,4,8,4,4
db16,8,4,4,8,4,4,8,4,4
db4,4,4,4,8,4,4
db8,4,4,4,4,8,8,4
db4,4,8,4,4,4,4,8
db4,2,16,4,4,8,4,4,4,4
db4,4,4,4,8,4,4,8,4,4,8
db4,4,4,4,4,4,8,4,4
db8,4,4,4,4,8,4,2,8,8
db4,4,4,8,4,4,4,4,4,4
db4,4,8,4,4,8,4,4,4,4,4
db4,4,4,16,4,4,8,4,4
db8,4,4,4,4,4,4,8,4,4,8
db4,4,4,4,8,4,4,16,4,4
db8,4,4,8,4,4,4,4,8,4,4
db8,4,4,8,4,4,4,4,8
db4,4,8,4,4,8,4,4
db4,4,4,4,8,4,4,8,4,4
db4,4,8,4,4,32
;铃儿响叮当
music_n2db'g','c','x','z','g','0','g','h','g','c','x','z'
db'h','0','h','a','h','v','c','x','j','g','b','b','v','x','c','z'
db'g','c','x','z','g','0','g','h','g','c','x','z','h','v','c','x'
db'b','b','b','b','n','b','v','x','z'
db'c','c','c','c','c','c','c','b','z','x','c'
db'v','v','v','v','c','c','c','x','x','z','x','b'
db'c','c','c','c','c','c','c','b','z','x','c'
db'v','v','v','v','c','c','b','b','v','x','z',0
music_d2db4,4,4,4,8,4,2,2,4,4,4,4
db8,4,2,2,4,4,4,4,8,8,4,4,4,4,8,4
db4,4,4,4,8,4,2,2,4,4,4,4,4,4,4,4
db4,4,4,4,4,4,4,4,16
db4,4,8,4,4,8,4,4,4,2,16
db4,4,8,4,4,8,4,4,4,4,8,8
db4,4,8,4,4,8,4,4,4,2,16
db4,4,8,4,4,8,4,4,4,4,16,32
;生日快乐
music_n3db'g','g','h','g','z','j'
db'g','g','h','g','x','z'
db'g','g','b','c','z','j','h'
db'v','v','c','z','x','z',0
music_d3db4,4,8,8,8,16
db4,4,8,8,8,16
db4,4,8,8,8,8,8
db4,4,8,8,8,16,32
music_n4db'z','z','z','g','c','c','c','z','z','c','b','b','v','c','x','x','c'
db'v','v','c','x','c','z','z','c','x','g','j','x','z',0
;新年好
music_d4db4,4,8,8,4,4,8,8,4,4,8,8,4,4,16,4,4
db8,8,4,4,8,8,4,4,8,8,4,4,32
jiepaidb?
;节拍变量定义
speeddb2;播放速度控制
jiangedb1;音符间隔停顿时间
dataends;数据定义段结束
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;代码段定义
codesegment;代码定义段
assumecs:
code;建立代码段寄存器寻址
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;字符显示
showmacrostr;宏定义,输入参数:
字符串str
leadx,str;装入str的有效地址
movah,09h;调用中断21,09h显示字符串
int21h
endm;宏定义结束
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;主函数
mainprocfar;主函数过程定义
movax,data;取数据段地址
movds,ax;装载数据段寄存器ds,使之指向当前数据段
showmsg_21
showmsg_1;调用宏,显示字符串
showmsg_2
showmsg_8
showmsg_3
showmsg_4
showmsg_5
showmsg_6
showmsg_7
showmsg_21
movbx,0;设定查表数组下标初值
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;按键扫描
key_scan:
moval,6
movjiepai,al;初始化节拍
movbx,0000h;初始化指针
movah,00h;利用bios的16号中断,扫描键盘按键
int16h;AL中返回按键的ASCII码
cmpal,0dh;判断是否为Enter键
jzexit;是回车键就退出
cmpal,1bh;判断是否为Esc键
jzexit;是退出键就退出
cmpal,'p';判断是否为p键
jzplay;是p键就playmusic
lookup:
cmpkey_t[bx],al;取出对应频率值
jenext
incbx;指针+1
jmplookup
next:
shlbx,1;指针×2,计算频率表指针
movcx,note_t[bx];取得对应数组下标值的频率值
callbeep;调用固定频率子程序
jmpkey_scan;否则继续扫描
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
exit:
;退出
movah,4ch;调用中断21,4ch退出系统
int21h
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;音乐播放菜单
play:
showmsg_9
showmsg_10
showmsg_11
showmsg_12
showmsg_13
showmsg_21
input:
movah,00h;利用bios的16号中断,扫描键盘按键
int16h;AL中返回按键的ASCII码
cmpal,'q';判断是否为Enter键
jzstart;是'q'键就退到主菜单
cmpal,'1';判断是否为数字1
jznext6;是'1'键就播放相对应的歌曲
cmpal,'2';判断是否为数字2
jznext7;是'2'键就播放相对应的歌曲
cmpal,'3';判断是否为数字3
jznext8;是'3'键就播放相对应的歌曲
cmpal,'4';判断是否为数字4
jznext9;是'4'键就播放相对应的歌曲
jmpinput;否则继续扫描按键
next6:
callplay_m1
next7:
callplay_m2
next8:
callplay_m3
next9:
callplay_m4
start:
callmain
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;音乐播放程序1
play_m1procnear
next5:
movbx,0
next3:
moval,music_n1[bx];取出music频率值
pushax
moval,music_d1[bx];取出music节拍
movjiepai,al
popax
cmpal,0;是否为音乐结束标志符
jeinput;是则退出play
pushbx;保存bx,bx为music频率指针
movbx,0
look1:
cmpkey_t[bx],al;查表取出对应频