课程设计任务书
学生姓名: 宋晓阳 专业班级: 电气0805班 指导教师: 刘永红 工作单位: 自动化学院 题 目: 键盘电子乐器 初始条件:
掌握汇编语言程序设计方法,所设计的程序运行后可通过键盘控制,满足系统功能,并实现该系统设计方案。在DOS,windows,汇编软件环境下运行。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具
体要求)
1.设计一个用键盘演奏音乐的程序,计时器系统设计编程定时输出――电子音调,用pc机内部8253time~使扬声器发声。用汇编语言对8253进行编程,使其OUT0上输出一定的频率,将其一定频率输出到喇叭上,演奏出不同的音节。pc机的数字键(1-7)作为电子音调的音调选择
2. 课程设计说明书应包括:
a)设计任务及要求 b)方案比较及认证
c)程序设计基本思想,程序流程图,部分源程序及注解 d)调试记录及结果分析 e)参考资料
f)附录:全部源程序清单 g)总结
时间安排:
2011年元月07日--元月09日 选题、查阅资料和方案设计 2011年元月10日--元月14日 编程
2011年元月15日--元月16日 调试程序,改进与提高 2011年元月17日 撰写课程设计报告(有调试过程及结果的截屏) 2011年元月18日 答辩和交课程设计报告
指导教师签名: 2011 年 元 月 6 日 系主任(或责任教师)签名: 年 月 日
1
武汉理工大学《微机原理》课程设计说明书
摘要
利用PC上的定时/计数芯片8253A控制PC扬声器发声。编写内核模块,直接操作扬声器相关端口,或字符设备驱动,供应用程序调用,用键盘使其发出不同的声音。
关键字:8253
定时器
2
中断武汉理工大学《微机原理》课程设计说明书
目录
1. 方案比较 ............................................. 4 2.芯片介绍 .............................................. 4 2.1 8255芯片简述 ..................................... 4 2.1.1 8255三种方式下工作 .......................... 4 2.2 8253芯片简述 ..................................... 5 2.2.1 8253六种工作方式 ............................ 6 3.通用发声程序 .......................................... 7 4.音调与频率和时间的关系 ................................ 11 附录 ................................................... 13 附录一: ............................................ 13 附录二: ............................................ 14 附录三: ............................................ 26 附录四: ............................................ 27 附录五: ............................................ 32 参考文献 ............................................... 33
3
武汉理工大学《微机原理》课程设计说明书
键盘电子乐器
1.方案比较
1.1 发声程序循环
优点:简单,易于思维 缺点:程序过于长,比较繁琐 1.2 调用宏,进行发声
优点:程序短 缺点:不易想到
2.芯片介绍
2.1 8255芯片简述
8255可编程外围接口芯片是Intel公司生产的通用并行I/O接口芯片,它具
有A、B、C三个并行接口,+5V单电源供电。
2.1.1 8255三种方式下工作
方式0—基本输入/输出方式 方式1—选通输入/输出方式 方式2—双向选通输入/输出方式
2.1.2 8255
引脚图
如右图所示,各引脚功能如:
D7~D0——与CPU侧连接的八条双向数据线; WR(低电平有效)— 写输入信号; RD(低电平有效)— 读输入信号; CS(低电平有效)— 片选输入信号;
4
图1-1 8255引脚图 武汉理工大学《微机原理》课程设计说明书
A0、A1 — 片内寄存器选择输入信号; PA7~PA0 — A口外设双向数据线; PB7~PB0 — B口外设双向数据线;
PC7~PC0 — C口外设双向数据线; RESET — 复位输入信号
2.1.3 8255端口地址
寄存器 端口地址 A口 60H B口 61H C口 62H 控制寄存器 63H
2.2 8253芯片简述
8253可编程定时/计数器是Intel公司生产的通用外围芯片之一,有3个独
立的十六位计数器,技术频率范围为0~2MHz,它所有的技术方式和操作方式都通过编程控制。
图1-2 8253引脚图
5
武汉理工大学《微机原理》课程设计说明书
2.2.1 8253六种工作方式
方式0:计数结束中断 方式1:可编程频率发生器 方式2:频率发生器 方式3:方波频率发生器 方式4:软件触发的选通信号 方式5:硬件触发的选通信号
2.2.2 8253引脚图
如上图所示,各引脚功能如下: D7~D0 — 八条双向数据线; WR(低电平有效)— 写输入信号; RD(低电平有效)— 读输入信号; CS(低电平有效)— 片选输入信号; A0、A1 — 片内寄存器地址输入信号;
CLK — 计数输入,用于输入定时基准脉冲或计数脉冲;
OUT — 输出信号,以相应的电平指示计数的完成,或输出脉冲波形;
GATE — 选通输入,用于启动或禁止计数器的操作,以使计数器和计测对象同步。
2.2.3 8253端口地址
寄存器 端口地址 0#计数器 40H 1#计数器 41H 2#计数器 42H 控制寄存器 43H 本次课设要求用8253做。计算机中可以利用8253/54定时器来驱动扬声器。连接到扬声器上的是定时器2,GATE2与端口61H的PB0相连,当PB0=1时,GATE2获得高电平,使定时器2可以在模式3下工作。定时器2的OUT2与端口61H的PB1通过一个与门与扬声器的驱动电路相连。当PB1=1时,允许OUT2的输出信号到达扬声器电路。下面是控制扬声器的代码: IN MOV
AL,61H AH,AL
;get the current setting of port B ;save it
6
武汉理工大学《微机原理》课程设计说明书
OR AL,00000011B
;make PB0=1 and PB1=1 ;turn the speaker on
;how long the beep sound goes here ;get the original setting of port B ;turn off the speaker
OUT 61H,AL ......
MOV AL,AH OUT 61H,AL
对于IBM PC兼容机来说,无论是8086,80486还是Pentium,驱动扬声器的过程是相同的。至于音调发出的时间量(音长),则取决于它的延迟的时间,这个延迟时间可以在PC机的80x86主处理器的帮助下实现。
3.通用发声程序
BIOS中的BEEP子程序能根据BX中给出的计数值控制8253/54定时器,产生频率为896Hz的声音。实际上BEEP是一个很好的通用发声程序。首先,BEEP程序只能产生896Hz的声音,通用发声程序应能产生任一频率的声音。其次BEEP产生声音的持续时间(音长)只能是0.5s的倍数,我们希望声音的持续时间更易于调整,例如是10ms的倍数。
给计数器2装入计数值533H就能产生896Hz的声音
(1.1931MHz/896Hz=1331=533H),同样,产生其他频率声音的计数值也可以用下式计算出来:
1193100给定频率12348CH给定频率
假设发声频率存放在DI寄存器中,下面的指令使AX中得到送往定时器2的计数值:
MOV DX,12H MOV AX,348CH DIV DI
利用CPU来产生延迟时间是最常用的一种方法,但对
8088/86,80286,386,486以及Pentium来说,它们产生的延迟时间都是不一样的。对基于8088/86的PC/XT,PS/2等PC机,可用下面的程序来产生时间延迟:
MOV CX,N
7
武汉理工大学《微机原理》课程设计说明书
DELAY: LOOP DELAY
在8088/86CPU中,执行一条LOOP指令需要17个时钟周期,因此,执行上面的指令大约需要N*17*T时钟周期。
在BIOS中,利用上述方法来产生250ms延迟时间的程序如下:
SUB CX,CX
G7:
LOOP
G7
;65536212ns17236ms
如果要产生与10ms成倍数的延迟时间,可在BX寄存器中放入倍数。例如,要产生1s的持续时间,则在BX中放入100,以控制LOOP指令执行1002800次, 也就是10ms的100倍。指令如下:
MOV
WAIT: DELAY:
MOV
BX,100 CX,2800
LOOP DELAY
DEC JNZ
BX WAIT 开始上述流程图为:
BX-1BX=0NCX-1NY CX=0结束
图2-1程序流程图
8
武汉理工大学《微机原理》课程设计说明书
下面在修改后的BEEP程序的基础上,为8088/86编写一个任一频率(由DI指定)和任一持续时间(由CX和BX指定)的通用发声程序。此程序包括三个步骤: (1)在8253/54中的43端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使定时器2准备接收计数初值。
(2)在在8253/54中的42端口(Timer2)装入一个16位的计数值(533H*896/频率),以建立将要产生的声音频率。
(3)把输出端口61H的0/1两位置1,发出声音。
GENSOUND PROC NEAR
;********************************** PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI
;********************************** MOV AL,0B6H
;写8253的控制字 选中8253通道1
读写
16位 工作方式3 二进制计数方式
OUT 43H,AL MOV DX,12H
;向8253中写入上述功能的控制字
;假定发生频率存放在DI寄存器中,下面的三行
指令使AX中得到送往定时器2的计数值
MOV AX,348ch DIV DI
;1193100HZ/freq
;value of freq
OUT 42H,AL MOV AL,AH OUT 42H,AL IN AL,61H MOV AH,AL OR AL,3 OUT 61H,AL
;将AL中数放到8253计数器中
;将AL中数放到8253计数器中 ;从61h号端口读取PB口现在的状态 ;将PB口的状态放进AH
;将AL低两位置1
;向61h号端口写入一个字节,打开扬声器
9
武汉理工大学《微机原理》课程设计说明书
WAIT1:
MOV CX,2000 call waitf
;3314
DELAY1:
DEC BX JNZ WAIT1 MOV AL,AH OUT 61H,AL
;recover value of port ;从61h号端口读入一个字节
;*********************************** POP DI POP DX POP CX POP BX POP AX
;*********************************** RET
GENSOUND ENDP WAITF PROC NEAR
PUSH AX
WAITF1:
IN AL,61H AND AL,10H CMP AL,AH JE WAITF1 MOV AH,AL
;check pb4
;did it change ;wait for change
;save the new pb4 status
LOOP WAITF1 ;continue until cx becomes 0 POP AX RET
10
武汉理工大学《微机原理》课程设计说明书
WAITF ENDP
GENSOUND程序能产生19~65536Hz的声音,这个频率的下限19Hz是使除法不产生溢出的最小的DI值((DX)=12H=18d<19)。其上限65536Hz是多余的,因为人们最高能听到的音频约为20000HZ。
4.音调与频率和时间的关系
利用计算机控制发声的原理,可以编写演奏乐曲的程序。在一首乐曲中,每个音符的音高和音长与频率和节拍有关。
图3-1音频频率对照表
组成乐曲的每个音符的频率值和持续时间是乐曲程序发生所需要的两个数据。音符的频率可以从图3-1中查表得到,但实际上送入计数器2的是输入频率1.1932MHz与音符频率相除的值,通用发声程序SOUNDF的前半部分就是完成这个计算,并将计数值送入计数器2的功能。 ;
MOV AL,0B6H
;写8253的控制字 选中8253通道1
读写
16位 工作方式3 二进制计数方式
OUT 43H,AL MOV DX,12H
;向8253中写入上述功能的控制字
;假定发生频率存放在DI寄存器中,下面的三行
指令使AX中得到送往定时器2的计数值
MOV AX,348ch DIV DI
;1193100HZ/freq
;value of freq
OUT 42H,AL MOV AL,AH
;将AL中数放到8253计数器中
11
武汉理工大学《微机原理》课程设计说明书
OUT 42H,AL ;将AL中数放到8253计数器中
;.................................
12
武汉理工大学《微机原理》课程设计说明书
附录
附录一:
程序一流程图
初始化键盘输入是结束符?YNBX=频率表首址N相应音频按键YDI=频率值BX=持续时间结束调用声音程序
13
武汉理工大学《微机原理》课程设计说明书
附录二:
程序一
DATA SEGMENT PARA 'DATA'
INFO1 DB 0DH,0AH,'WELCOME YOU TO COME HERE!$' INFO2 DB 0DH,0AH,'this is a Piano program!$' INFO3 DB 0DH,0AH,'please press!$' INFO4 DB 0DH,0AH,'INPUT ERROR!$' INFO5 DB 0DH,0AH,'PLEASE INPUT AGAIN!$' MUSLIST DB 0DH,0AH,'1
262'
DB 0DH,0AH,'2 294' DB 0DH,0AH,'3 330' DB 0DH,0AH,'4 347' DB 0DH,0AH,'5 392' DB 0DH,0AH,'6 440' DB 0DH,0AH,'7 494' DB 0DH,0AH,'8 524' DB 0dh,0ah,'$' MUS_FREG1 DW 262,-1 MUS_TIME1 DW 50,25
MUS_FREG2 DW 294,-1 MUS_TIME2 DW 50,25
MUS_FREG3 DW 330,-1 MUS_TIME3 DW 50,25
MUS_FREG4 DW 347,-1 MUS_TIME4 DW 50,25
14
武汉理工大学《微机原理》课程设计说明书
MUS_FREG5 DW 392,-1 MUS_TIME5 DW 50,25
MUS_FREG6 DW 440,-1 MUS_TIME6 DW 50,25
MUS_FREG7 DW 494,-1 MUS_TIME7 DW 50,25
MUS_FREG8 DW 524,-1 MUS_TIME8 DW 50,25 DATA ENDS
STACK SEGMENT PARA STACK 'STACK' DB 200 DUP ('STACK') STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE MAIN PROC FAR MOV AX,DATA MOV DS,AX MOV AH,0 MOV AL,4 INT 10H
;设置显示方式 ;设置显示方式 ;调用显示器中断
;设置背景颜色或彩色组
MOV AH,0BH MOV BH,0 MOV BL,2
;设置背景颜色 ;蓝色
15
武汉理工大学《微机原理》课程设计说明书
INT 10H ;调用显示器中断
;设置背景颜色或彩色组 ;设置字体颜色
MOV AH,0BH MOV BH,01H MOV BL,1 INT 10H
;黑色
;调用显示器中断
;*****定义一个宏*****
;功能09H功能描述:输出一个字符串到标准输出设备上。
;如果输出操作被重定向,那么,将无法判断磁盘已满入口参数:AH=09HDS:DX=待输出字符的地址
;说明:待显示的字符串以’$’作为其结束标志 SHOW MACRO b LEA DX,b MOV AH,9 INT 21H ENDM ;********************** show INFO1 show INFO2 show INFO3
;显示字符串 ;显示字符串 ;显示字符串
show MUSLIST ;显示字符串 INPUT: MOV AH,01H INT 21H
;设置光标类型
;调用中断,返回dos ;是否按下Q
;是则跳转,不是继续向下运行 ;是否按下1
;不是1跳转,是继续向下运行
CMP AL,'Q' JZ retu
CMP AL,'1' JNZ B0
CALL MUSIC1 ;跳转到MUSIC1程序 JMP EXIT1
16
;跳转EXIT1
武汉理工大学《微机原理》课程设计说明书
B0: CMP AL,'2' JNZ C0
;是否按下2
;不是2则跳转,是继续运行
CALL MUSIC2 ;调用 MUSIC2程序 JMP EXIT1
C0: CMP AL,'3' JNZ D0
;是否按下3 ;跳转到EXIT1
;不是3跳转,是继续运行
CALL MUSIC3 ;跳转到MUSIC3程序 JMP EXIT1
D0: CMP AL,'4' JNZ E0
;是否按下4
;不是4跳转,是继续运行
CALL MUSIC4 ;跳转到MUSIC4程序 JMP EXIT1
E0: CMP AL,'5' JNZ F0
;是否按下5
;不是5跳转,是继续运行
CALL MUSIC5 ;跳转到MUSIC5程序 JMP EXIT1
F0: CMP AL,'6' JNZ G0
;是否按下6
;不是6跳转,是继续运行
CALL MUSIC6 ;跳转到MUSIC6程序 JMP EXIT1
G0: CMP AL,'7' JNZ H0
;是否按下7
;不是7跳转,是继续运行
CALL MUSIC7 ;跳转到MUSIC7程序 JMP EXIT1
17
武汉理工大学《微机原理》课程设计说明书
H0: CMP AL,'8' JNZ exit
;是否按下8
;不是8跳转,是继续运行
CALL MUSIC8 ;跳转到MUSIC8程序
EXIT1: show INFO5 JMP INPUT EXIT: call clear
;跳转到clear
;显示字符 ;显示字符 ;显示字符 ;显示字符 ;显示字符 ;显示字符 ;跳转到INPUT
show INFO4 show INFO5 show INFO1 show INFO2 show INFO3
show MUSLIST ;显示字符 jmp input
;跳转到INPUT
;带返回码返回
RETU: MOV AH,4CH INT 21H MAIN ENDP
MUSIC1 PROC NEAR PUSH DS SUB AX,AX PUSH AX
;调用dos中断
LEA SI,MUS_FREG1 ;puts the freg table offset in SI ;puts the time table offset in BP ;read next frequency ;end of tone ;if yes,exit
18
LEA BP,DS:MUS_TIME1 FREG1: MOV DI,[SI] CMP DI,-1
JE END_MUS1
武汉理工大学《微机原理》课程设计说明书
MOV DX,DS:[BP] MOV BX,5400
;else,fetch the duration
CALL GENSOUND ADD SI,2 ADD BP,2 JMP FREG1 END_MUS1: RET MUSIC1 ENDP
GENSOUND PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI
;play the note
;update the table pointer
;go process next note
MOV AL,0B6H ;写8253的控制字 选中8253通道1 读写16位 工作方式3
二进制计数方式
;向8253中写入上述功能的控制字
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
;将AL中数放到8253计数器中
;将AL中数放到8253计数器中
;从61h号端口读入一个字节
;向61h号端口写入一个字节
19
武汉理工大学《微机原理》课程设计说明书
WAIT1: MOV CX,8FF0H
;向CX中写入数
DELAY1: LOOP DELAY1 ;延时 DEC BX
;BX-1
;运算结果不为0,则ZF=0,则转移
;从61h号端口读入一个字节
JNZ WAIT1 MOV AL,AH OUT 61H,AL POP DI POP DX POP CX POP BX POP AX RET GENSOUND ENDP
MUSIC2 PROC NEAR PUSH DS SUB AX,AX PUSH AX
LEA SI,MUS_FREG2 LEA BP,DS:MUS_TIME2 FREG2: MOV DI,[SI] CMP DI,-1 JE END_MUS2 MOV DX,DS:[BP] MOV BX,1400 CALL GENSOUND ADD SI,2 ADD BP,2
20
武汉理工大学《微机原理》课程设计说明书
JMP FREG1 END_MUS2: RET MUSIC2 ENDP MUSIC3 PROC NEAR PUSH DS SUB AX,AX PUSH AX
LEA SI,MUS_FREG3 LEA BP,DS:MUS_TIME3 FREG3: MOV DI,[SI] CMP DI,-1 JE END_MUS3 MOV DX,DS:[BP] MOV BX,1400 CALL GENSOUND ADD SI,2 ADD BP,2 JMP FREG1 END_MUS3: RET MUSIC3 ENDP
MUSIC4 PROC NEAR PUSH DS SUB AX,AX PUSH AX
LEA SI,MUS_FREG4
LEA BP,DS:MUS_TIME4
;puts the freg table offset in SI
;puts the time table offset in BP
21
武汉理工大学《微机原理》课程设计说明书
FREG4: MOV DI,[SI] CMP DI,-1
JE END_MUS4 MOV DX,DS:[BP]
MOV BX,5400
CALL GENSOUND ADD SI,2
ADD BP,2 JMP FREG4
END_MUS4: RET MUSIC4 ENDP
MUSIC5 PROC NEAR PUSH DS SUB AX,AX PUSH AX
LEA SI,MUS_FREG5
LEA BP,DS:MUS_TIME5 FREG5: MOV DI,[SI] CMP DI,-1
JE END_MUS5 MOV DX,DS:[BP]
MOV BX,5400
CALL GENSOUND ADD SI,2 ADD BP,2 JMP FREG5 END_MUS5:
;read next frequency ;end of tone ;if yes,exit
;else,fetch the duration
;play the note
;update the table pointer
;go process next note
;puts the freg table offset in SI
;puts the time table offset in BP ;read next frequency ;end of tone ;if yes,exit
;else,fetch the duration
;play the note
;update the table pointer
;go process next note
22
武汉理工大学《微机原理》课程设计说明书
RET MUSIC5 ENDP
MUSIC6 PROC NEAR PUSH DS SUB AX,AX PUSH AX
LEA SI,MUS_FREG6
LEA BP,DS:MUS_TIME6 FREG6: MOV DI,[SI] CMP DI,-1
JE END_MUS6 MOV DX,DS:[BP] MOV BX,5400
CALL GENSOUND ADD SI,2
ADD BP,2 JMP FREG6
END_MUS6: RET MUSIC6 ENDP
MUSIC7 PROC NEAR PUSH DS SUB AX,AX PUSH AX
LEA SI,MUS_FREG7
LEA BP,DS:MUS_TIME7 FREG7: MOV DI,[SI]
;puts the freg table offset in SI
;puts the time table offset in BP ;read next frequency ;end of tone ;if yes,exit
;else,fetch the duration
;play the note
;update the table pointer
;go process next note
;puts the freg table offset in SI
;puts the time table offset in BP ;read next frequency
23
武汉理工大学《微机原理》课程设计说明书
CMP DI,-1 JE END_MUS7 MOV DX,DS:[BP]
MOV BX,5400
CALL GENSOUND ADD SI,2
ADD BP,2 JMP FREG7
END_MUS7: RET MUSIC7 ENDP
MUSIC8 PROC NEAR PUSH DS SUB AX,AX PUSH AX
LEA SI,MUS_FREG8
LEA BP,DS:MUS_TIME8 FREG8: MOV DI,[SI] CMP DI,-1
JE END_MUS8 MOV DX,DS:[BP]
MOV BX,5400
CALL GENSOUND ADD SI,2 ADD BP,2 JMP FREG8 END_MUS8: RET
;end of tone ;if yes,exit
;else,fetch the duration
;play the note
;update the table pointer
;go process next note
;puts the freg table offset in SI
;puts the time table offset in BP ;read next frequency ;end of tone ;if yes,exit
;else,fetch the duration
;play the note
;update the table pointer
;go process next note
24
武汉理工大学《微机原理》课程设计说明书
MUSIC8 ENDP clear proc near push ax push bx push cx push dx mov ah,6 mov al,0 mov ch,0 mov cl,0 mov dh,24 mov dl,79 mov bh,7 int 10h pop dx pop cx pop bx pop ax ret clear endp
CODE ENDS END MAIN
;读当前光标位置设置 ;上滚行数
;上滚窗口左上角的行、列号 ;上滚窗口左上角的行、列号 ;上滚窗口右下角的行号 ;上滚窗口右下角的列号 ;空白行的属性 ;调用显示器中断
25
武汉理工大学《微机原理》课程设计说明书
附录三:
程序二流程图
初始化键盘输入是结束符?YNBX=频率表首址N相应音频按键YDI=频率值BX=持续时间结束调用声音程序(宏)
26
武汉理工大学《微机原理》课程设计说明书
附录四:
程序二
DATA SEGMENT
msg DB 0DH,0AH,'[ 1 2 3 4 5 6 7 ]' DB 0DH,0AH,'[ q w e r t y u ]' DB 0DH,0AH,'[ a s d f g h j ]'
DB 0DH,0AH,'_________________' DB 0DH,0AH,'9: EXIT'
DB 0DH,0AH,'_________________','$'
;********音调******后面用到-1判断音乐播是否放完 sound_0 DW -1 ;sound_0 DW -1
sound_11 DW 131,-1 ;sound_11 DW 441,-1 sound_12 DW 147,-1 ;sound_12 DW 495,-1 sound_13 DW 165,-1 ;sound_13 DW 556,-1 sound_14 DW 175,-1 ;sound_14 DW 589,-1 sound_15 DW 196,-1 ;sound_15 DW 661,-1 sound_16 DW 220,-1 ;sound_16 DW 742,-1 sound_17 DW 247,-1 ;sound_17 DW 833,-1
sound_21 DW 524,-1 sound_22 DW 588,-1 sound_23 DW 660,-1 sound_24 DW 698,-1 sound_25 DW 784,-1 sound_26 DW 880,-1 sound_27 DW 988,-1
sound_1 DW 262,-1 ;sound_1 DW 882,-1 sound_2 DW 294,-1 ;sound_2 DW 990,-1 sound_3 DW 330,-1 ;sound_3 DW 1112,-1 sound_4 DW 349,-1 ;sound_4 DW 1178,-1 sound_5 DW 392,-1 ;sound_5 DW 1322,-1 sound_6 DW 440,-1 ;sound_6 DW 1484,-1 sound_7 DW 492,-1 ;sound_7 DW 1655,-1 time DW 10;time DW 50 DATA ENDS
;************************ STACK SEGMENT
Db 200 DUP ('STACK') STACK ENDS
;************************ CODE SEGMENT
27
武汉理工大学《微机原理》课程设计说明书
ASSUME DS:DATA,SS:STACK,CS:CODE START:
MOV AX,DATA MOV DS,AX MOV AH,00H ;设置显示方式 MOV AL,12H ;设置显示方式 INT 10H ;调用显示器中断8
;*****定义一个宏*****
;功能09H功能描述:输出一个字符串到标准输出设备上。 ;如果输出操作被重定向,那么,将无法判断磁盘已满入口参数:AH=09HDS:DX=待输出字符的地址
;说明:待显示的字符串以’$’作为其结束标志 SHOW MACRO b LEA DX,b MOV AH,9 INT 21H ENDM
;********一个声音宏********
onesound macro soundis,jumpis,letteris CMP AL,letteris JNZ jumpis LEA SI,soundis LEA BP,DS:time CALL MUSIC JMP input ENDM
show msg
INPUT: MOV AH,01H ;设置光标类型 INT 21H ;调用中断,返回dos CMP AL,'9' ;是否按下9 jnz go ;按下9则转移
mov ah,4ch ;带返回码结束 int 21h ;调用DOS中断
go: onesound sound_11,a0,'a';'q' 调用宏 a0: onesound sound_12,b0,'s';'w' 调用宏 b0: onesound sound_13,c0,'d';'e' 调用宏 c0: onesound sound_14,d0,'f';'r' 调用宏 d0: onesound sound_15,e0,'g';'t' 调用宏
28
武汉理工大学《微机原理》课程设计说明书
e0: onesound sound_16,f0,'h';'y' 调用宏 f0: onesound sound_17,g0,'j';'u' 调用宏 g0: onesound sound_1,h0,'q';'1' 调用宏 h0: onesound sound_2,i0,'w';'2' 调用宏 i0: onesound sound_3,j0,'e';'3' 调用宏 j0: onesound sound_4,k0,'r';'4' 调用宏 k0: onesound sound_5,l0,'t';'5' 调用宏 l0: onesound sound_6,m0,'y';'6' 调用宏 m0: onesound sound_7,n0,'u';'7' 调用宏 n0: onesound sound_21,o0,'1';'a' 调用宏 o0: onesound sound_22,p0,'2';'s' 调用宏 p0: onesound sound_23,q0,'3';'d' 调用宏 q0: onesound sound_24,r0,'4';'f' 调用宏 r0: onesound sound_25,s0,'5';'g' 调用宏 s0: onesound sound_26,t0,'6';'h' 调用宏 t0: onesound sound_27,u0,'7';'j' 调用宏 u0: onesound sound_0,z0,al z0: jmp input
;********************发声**********************
GENSOUND PROC NEAR ;********************************** PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI ;********************************** MOV AL,0B6H ;写8253的控制字 选中8253通道1 读写16位 工作方式3 二进制计数方式 OUT 43H,AL ;向8253中写入上述功能的控制字 MOV DX,12H ;假定发生频率存放在DI寄存器中,下面的三行指令使AX中得到送往定时器2的计数值 MOV AX,348ch ;1193100HZ/freq DIV DI ;value of freq OUT 42H,AL ;将AL中数放到8253计数器中 MOV AL,AH OUT 42H,AL ;将AL中数放到8253计数器中 IN AL,61H ;从61h号端口读取PB口现在的状态 MOV AH,AL ;将PB口的状态放进AH OR AL,3 ;将AL低两位置1 OUT 61H,AL ;向61h号端口写入一个字节,打开扬声器
WAIT1:
29
武汉理工大学《微机原理》课程设计说明书
MOV CX,2000 ;3314 call waitf DELAY1: DEC BX JNZ WAIT1 MOV AL,AH ;recover value of port OUT 61H,AL ;从61h号端口读入一个字节 ;*********************************** POP DI POP DX POP CX POP BX POP AX ;*********************************** RET
GENSOUND ENDP
;************************** WAITF PROC NEAR PUSH AX WAITF1: IN AL,61H AND AL,10H ;CHECK PB4 CMP AL,AH ;DID IT CHANGE JE WAITF1 ;WAIT FOR CHANGE MOV AH,AL ;SAVE THE NEW PB4 STATUS LOOP WAITF1 ;CONTINUE UNTIL CX BECOMES 0 POP AX RET WAITF ENDP
;************************ MUSIC PROC NEAR PUSH DS SUB AX,AX PUSH AX
FREG: MOV DI,[SI] CMP DI,-1 ;音乐是否放完? JE END_MUS MOV BX,DS:[BP] CALL GENSOUND ADD SI,2 ADD BP,2 JMP FREG
30
武汉理工大学《微机原理》课程设计说明书
END_MUS: RET MUSIC ENDP CODE ENDS
;********************** END START
31
武汉理工大学《微机原理》课程设计说明书
附录五
32
武汉理工大学《微机原理》课程设计说明书
参考文献
[1] 沈美明.IBM-PC汇编语言程序设计(第二版).北京:清华大学出版社 [2] 彭虎.微机原理与接口技术.电子工业出版社
[3] 王爽.汇编语言.北京:清华大学出版社 [4] 刘叔军.汇编语言应用与实例.北京:机械工业出版社
33
因篇幅问题不能全部显示,请点此查看更多更全内容