微机原理——简易电子琴
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程名称:微型计算机原理与接口技术
设计题目:模拟简易电子琴
一、题目分析
题目:模拟简易电子琴
1.由于题目要求该程序有多个功能,而且是分工合作,所以采用菜单选择形式实现多功能实现在一个程序里,再用不同的子函数实现不同的功能,用主函数在不同的输入指令下调用不同的子程序来实现不同的功能。
2.为了使计算机无需音响输出设备就可以发声,我们利用ROM BIOS中的BEEP子程
序,它能根据BL中给出的时间计数值控制8254定时器,产生持续声音。通过对BEEP的修改可以使其产生任一频率的声音。用汇编语言编写的程序GENSOUND,能使PC机发出指定频率和指定延迟时间的声音,它是一个很好的通用发声程序。
组成乐曲的每个音符的频率值和持续时间是乐曲发声程序所必须的两组数据,知道了音调及频率的关系后,就可以按照乐曲的乐谱将每个音符的频率和持续时间定义成两个数据表,然后编程依次取出表中的频率值和时间值,调用GENSOUND程序发出各种声音,本程序通过调用GENSOUND程序演奏乐曲。
二、总体设计
1.把所有变量写进data中,完成data和stack的定义;
2.利用宏的定义设计功能菜单,在程序中为了能够循环起来,运用比较(cmp)和跳转(jz)使菜单循环起来;
3.写一个在模拟钢琴中,已经有的音乐,我们以粉刷匠这首儿歌为例,把它插在其中实现原有音乐的播放;
4.根据PC机的键盘数字八度音程的钢琴程序,整理,能发出6,7,1,2,3,4,5,6,7,i,十个音调三、实验环境,在其中运用,子程序的调用和宏定义;
5.运用录音的功能把在上一个用键盘实现按键功能的音乐录下来,在写一个播放音乐的子程序,调用录音子程序,实现回放功能;
三、实验环境
1.用editplus去编写汇编语言;
2.用masm去编译,再用link去连接,然后在dos运行exe文件。
四、制作步骤
1.编写步骤,我们采用不同子程序整合为一个总程序的办法逐步实现
2. 运行步骤,按1键演奏乐曲,按2键可以演奏歌曲,在输入音键的同时输出相应音符并在屏幕上显示出来,按3键演奏刚刚在步骤2中用户演奏的乐曲,按0键自行推出程序,。如果输入了没有的选项否则出错信息,并提示再次输入。
五、程序代码
我写的是回放功能:
stack segment para stack 'stack'
DB 640 dup('stack')
stack ends
data segment
mfreq DW 392,330,392,330,392,330,262
DW 294,349,330,262,392
DW 392,330,392,330,392,330,262
DW 294,349,330,294,262
DW 294,294,349,349,330,262,392
DW 294,349,330,262,392
DW 392,330,392,330,392,330,262
DW 294,349,330,294,262
DW -1
mtime DW 100,100,100,100,100,100,100,200
DW 100,100,50,50,200
DW 100,100,100,100,100,100,100,200
DW 100,100,100,100,400
DW 100,100,100,100,200,200,300
DW 100,100,100,100,100,200,200
DW 100,100,50,50,400
KEYNUM DW 0
table dw 988 ; 0,7. ;7的高音
dw 262 ; 1
dw 294 ; 2
dw 330 ; 3
dw 349 ; 4
dw 392 ; 5
dw 440 ; 6
dw 494 ; 7
dw 523 ; 8,i ;1的高音
dw 880 ; 9,6. ;6的高音
message db 'Paly the piano with number key(1-9) ,exit with space bar!',0DH,0ah,'$' IFLR DB 'MUSIC OVER!','$'
IFID DB 0DH,0ah,'$';
fi db 'finish music!','$'
F_Str db 0DH,0ah;
db '***********************************',0DH,0ah
db '1. play example',0DH,0ah ;播放实例音乐
db '2. enter keyborad music',0DH,0ah ;按键播放
db '3. replay music',0DH,0ah ;回放音乐
db '0. Exit',0DH,0ah ;退出
db '***********************************',0DH,0ah
db 'Please choose the number you want :',0DH,0ah ;选择数字
db 0DH,0ah,'$';
db 0DH,0ah,'$';
data ends
code segment
assume cs:code,ss:stack,ds:data
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
; 功能菜单
SHOW MACRO B
LEA DX, B
MOV AH ,9
INT 21H
ENDM