武汉理工大学《微机原理与接口技术》课程设计说明书
参考文献
[1] 彭虎,周佩玲.微机原理与接口技术(第二版).电子工业出版社,2010 [2] 陈慧杰. 计算机扬声器发声的控制. 内蒙古民族大学出版社,2001
[3] Peter Abel著,沈美明等译. IBM PC汇编语言设计程序. 人民邮电出版社,2002
[4] 冯继超.微机原理实验指导书.武汉理工大学出版社,2010
13
武汉理工大学《微机原理与接口技术》课程设计说明书
附录 程序清单
data segment
mesg db 'press q to quit,press d or z or h to chose yin diao',0ah,0dh,'$' mesg1 db 'press q to return,press 1 or 2 to chose music',0ah,0dh,'$' mesg2 db 'press q to return,press c to continue',0ah,0dh,'$'
mesg3 db 'press q to return,press p to play music,press 1~8 to hand play',0ah,0dh,'$' num1 dw 34dch num2 dw 12h
tab dw 262,294,330,347,392,440,494,524 song1 dw 262,294,330,262,262,294,330,262 dw 330,347,392,330,347,392,392,440 dw 392,347,330,262,392,440,392,347
dw 330,262,392,262,392,392,262,392 ;两只老虎 song2 dw 330,330,347,392,392,347,330,294 dw 262,262,294,330,330,294,294,330 dw 330,347,392,392,347,330,294,262
dw 262,294,330,294,262,262 ;欢乐颂 data ends
code segment
assume cs:code,ds:data start:mov ax,data mov ds,ax
loop0:mov dx,offset mesg ;显示输入提示信息 mov ah,09h int 21
loop1:mov ah,07h ;读入字符 int 21h
cmp al,'q' ;为q则退出 je done
cmp al,'d' ;为d,选择低音 jne j1
mov num2,50 jmp choice
j1:cmp al,'z' ;为z选择中音 jne j2
14
武汉理工大学《微机原理与接口技术》课程设计说明书
mov num2,12h jmp choice
j2:cmp al,'g' ;为g选择高音 jne loop0
mov num2,06h
choice:mov dx,offset mesg3 mov ah,09h int 21h
put1:mov ah,07h int 21h
cmp al,'q' ;为q则返回 je loop0
cmp al,'p' ;为p选择演奏 jne next call play jmp put1
next: cmp al,'1' ;为1-8,选择弹奏 jl loop1 cmp al,'8' jg put1 call hand jmp put1
hand proc near ;弹奏子程序 sub al,31h shl al,1 mov bl,al mov bh,0 mov ax,num1 mov dx,num2
div word ptr[tab+bx] mov bx,ax
call speaker ret hand endp
15
武汉理工大学《微机原理与接口技术》课程设计说明书
play proc near ;演奏子程序 loop2: mov dx,offset mesg1 mov ah,09h int 21h
mov ah,07h ;读入字符 int 21h
cmp al,'q' ;为q则返回 je choice
cmp al,'1' ;为1,播放歌曲1 jne next1 call music1 jmp loop3
next1:cmp al,'2' ;为2,播放歌曲2 jne loop2 call music2
loop3:mov dx,offset mesg2 mov ah,09h int 21h
mov ah,7 ;读入字符 int 21h
cmp al,'q' ;为q则退出 je choice
cmp al,'c' ;为c则继续 je loop2 jmp loop3 ret play endp
music1 proc near ;音乐1播放子程序 mov cl,0 ad:inc cl
cmp cl,33 je return mov al,cl
sub al,1 ;取偏移量 shl al,1
mov bl,al ;保存偏移量 mov bh,0
mov ax,num1 ;计算计数初值 mov dx,num2
div word ptr[song1+bx] mov bx,ax
16
武汉理工大学《微机原理与接口技术》课程设计说明书
call speaker jmp ad return:ret music1 endp
music2 proc near ;音乐2播放子程序 mov cl,0 ad:inc cl
cmp cl,31 je return mov al,cl sub al,1 shl al,1 mov bl,al mov bh,0 mov ax,num1 mov dx,num2
div word ptr[song2+bx] mov bx,ax call speaker jmp ad return:ret music2 endp
speaker proc near ;发音子程序 mov al,10110110b out 43h,al mov ax,bx out 42h,al mov al,ah
out 42h,al ;8253初始化
in al,61h ;开扬声器 or al,03h out 61h,al call delay
in al,61h ;关扬声器 and al,0fch out 61h,al ret speaker endp
delay proc near ;延时子程序 push ax push cx
17