微机原理——简易电子琴
- 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
Start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
begin:
show F_Str ;显示功能菜单
NEXT: mov ah,1
int 21h
cmp al,'1'
jz m1
cmp al,'2'
jz m2
cmp al,'3'
jz m3
cmp al,'0'
jz m4
jmp begin
m1: call music
jmp begin
m2: call aj
jmp begin
m3: call REPLAY
jmp begin
m4: mov ah,4ch ;结束程序
int 21h
;第1
music proc near
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
lea si,mfreq
lea bp,ds:mtime
freq: mov di,[si]
cmp di,-1
je endmusic
mov bx,[bp]
call gensound
add si,2
add bp,1
jmp freq
endmusic: SHOW IFID
SHOW IFLR
SHOW IFID
ret
music endp
gensound proc near
push ax
push bx
push cx
push dx
push di
mov al,0b6h
out 43h,al
mov dx,12h
mov ax,533h*896
div di
out 42h,al
mov al,ah
out 42h,al
in al,61h
mov ah,al
or al,3
out 61h,al
wait1: mov cx,4801 ;延时长度delay: loop delay
dec bx
jnz wait1
mov al,ah
out 61h,al
pop di
pop dx
pop cx
pop bx
pop ax
ret
gensound endp
;第2
aj proc near
push ds
sub ax,ax
push ax
MOV AX,DA TA
MOV DS,AX
mov ah,9
mov dx,offset message ;BX指向message首单元int 21h
new_note:
mov ah,1
int 21h
cmp al,20h ;空格键退出
JE EXIT
mov bx, offset table ;BX指向表格首单元
cmp al,'0'
jb new_note
cmp al,'9'
ja new_note
and ax,000fh ;逻辑与运算
shl ax,1 ;逻辑左移指令
sub ax,2
mov si,ax
mov di,[bx][si+2] ;表格中具体位置的内容
call soundf ;用call调用soundf
jmp new_note
EXIT:
ret
aj endp
soundf proc near ;用伪指令定义一个子程序push ax
push bx
push cx
push dx
push di
mov al,0b6h
out 43h,al
mov dx,12h
mov ax,533h*896
div di
out 42h,al
mov al,ah
out 42h,al
in al,61h
mov ah,al
or al,3
out 61h,al
mov bx,100
wait2:
mov cx,633
call waitf
dec bx ;bx减1
jnz wait2 ;不为0
mov al,ah
out 61h,al
pop di
pop dx
pop cx
pop bx
pop ax
ret ;返回,相当于return soundf endp
waitf proc near
push ax
waitf1:
in al,61h
and al,10h
cmp al,ah
je waitf1
mov ah,al
loop waitf1
pop ax
ret
waitf endp
;第3
;录音
MEMROY1 PROC FAR
PUSH BX
MOV BX,KEYNUM
MOV [bx][si+2],AX
INC BX
INC BX
MOV KEYNUM,BX
POP BX
RET
MEMROY1 ENDP
;放音
REPLAY PROC NEAR
PUSH AX
PUSH SI
PUSH DI
TEST1: MOV SI,OFFSET TABLE
PIAY: MOV AX,[SI]
CMP AX,0 ;[SI],0
JZ TEST1
MOV AL,36H
MOV DX,[SI]
OUT DX,AL
MOV AX,[SI]
MOV DX,[SI+1]
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DL,10
CALL soundf
INC SI
INC SI
MOV AX,4C00H
INT 21H
PLAY2: CALL soundf
POP DI
POP SI
POP AX
Show fi
RET
REPLAY ENDP
Code ENDS
END Start ;编译到此结束
运行结果为:
※检测问题:之前由于整合有误,导致我们的结果出现了2种情况,第1种是当我们选择菜单中的1时结果正常,菜单循环,选择2时字体隐藏,但功能不变,选择3时没有反应;第2种情况是菜单出现了,跳过1直接选2时一切正常,选3时出错。
经过老师的帮助,知道了我们出错的原因是把主程序和子程序混乱搭配,重新整理了之后,对于结构和结果都比较完善,但由于我们的回放子程序没有写对,所以只能回放1个音符,但能力有限,时间也不够,所以就只能这样了,但整体还是算完成了任务的。
六、方案比较
与一些制作较为精良的电子琴相比,我们的还有很多可以更改的地方,比如可可以调节声音的大小,设计更为美观的图形用户界面,关于乐曲节奏的部分也有待改进。
但我们的组员在这几天里也确实花了不少精力在此次课程设计,我们还会不断完善程序的各项功能。
七、参考文献
1.微型计算机原理与接口技术(第三版)
2. /view/c302c37931b765ce05081416.html
3. /view/6b74ba0d6c85ec3a87c2c540.html
4. /xj/2008/wjyl/zwy/05/01webcourse/UNIT51/JXLR
5.HTM。