资源描述
武汉理工大学微机原理与接口技术课程设计说明书目录摘要1音乐演奏21 设计任务及要求分析21.1设计任务21.2要求分析22 方案比较与选择32.1方案一32.2方案二32.3方案选择33 系统原理说明34 硬件电路与原理45 软件设计55.1屏幕显示程序设计55.2发声的原理与控制程序75.3音乐编程85.3.1音乐节拍时间95.3.2音乐的音符频率105.4 程序流程图125.5 源程序146调试记录及结果分析20结束语22参考文献23附录24摘要随着科学技术的迅猛发展,计算机在各个领域的应用越来越广泛。计算机已成为人们生活、学习、工作中必备的工具。其中,汇编语言是计算机能够提供给用户使用的最快而有效的语言,也是能够利用计算机所有特性并能直接控制硬件的唯一语言。借助于汇编程序,计算机本身可以自动地把汇编源程序翻译成用机器语言表示的目的程序,从而实现了程序设计工作的部分自动化。音乐演奏实现的一个主要步骤是乐谱编程。通过相应的频率表将乐谱中对应的音符转化为计数器的计数初值,节奏通过延时程序利用硬件实现频率计数和延时时间的控制,利用8253-5定时/计数器芯片和8255A并行I/O接口芯片。使8253的一个通道工作在“方波发生器”模式,实现对频率的计数;利用8255A的PB3端口实现发声时间的计数控制。转化为对喇叭发音时间的控制,从而实现音符和节拍的数字化。知道了音调与频率和时间的关系,就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表;然后编写程序一次取出表中的频率和时间值,调用程序发出各种声音。这个程序最终通过菜单所提示的信息选取音乐。以80X86未处理器为 对象,以8253为计数器的核心,通过宏指令和BOIS系统功能的调用,以及运 用MASM软件在PC机上来进行调试和运行,从而模拟地来实现“音乐演奏”的目的。关键词:乐谱编程 8253定时/计数器 MASM 音乐演奏音乐演奏1 设计任务及要求分析1.1设计任务编写音乐程序,按大写字母“A”,奏一首歌曲;按大写字母“B”;奏另一首歌曲,曲目自选。按Q退出程序。(尽量演奏完整曲目)1.2要求分析在PC机中都带有8253-5定时/计数器,IBM-PC/AT中带有8254定时/计数器,这两种芯片功能十分类似。本文通过对8253-5定时/计数器芯片的操作实现音乐演奏。该声音接口通过汇编语言对8253-5的端口直接进行操作,可以不必要过多的使用BIOS的调用和DOS的调用。计数器芯片有3个通道,各自具有专用功能。通道0时系统的始终节拍计时器,通道1专用于产生动态RAM的定时刷新信号,通道2用来控制计算机的扬声器的声音频率。该音乐演奏主要用到通道2的功能,使通道2工作在“方波发生器”方式,产生相应频率的音调送至喇叭驱动电路,使喇叭发出不同音调的声音。使用8255A的PB1控制通道2的输出对扬声器产生控制的时间。人机交互包括屏幕显示提示语以及人工输入相应参数,主要应用到BIOS的10H号中断调用以及DOS的21H号中断调用。BIOS的10H号中断调用用于显示器驱动,设置显示模式和光标位置;DOS的21H号中断调用用于单字符输入以及多字符输出显示。音乐演奏实现的一个主要步骤是乐谱编程。通过相应的频率表将乐谱中对应的音符转化为计数器的计数初值,节奏通过延时程序转化为对喇叭发音时间的控制,从而实现音符和节拍的数字化。2 方案比较与选择2.1方案一通过编程使用软件来实现计数和喇叭发声的时间设置,控制8255A并行I/O接口驱动喇叭发声。CPU每执行一条指令需要耗费一定的时间,这样可以通过循环的方式设置好循环次数,实现软件计数,然后输出相应的高低电平,驱动喇叭发出对应频率和节拍的声音。2.2方案二利用硬件实现频率计数和延时时间的控制,利用8253-5定时/计数器芯片和8255A并行I/O接口芯片。使8253的一个通道工作在“方波发生器”模式,实现对频率的计数;利用8255A的PB1端口实现发声时间的计数控制。这样可以精确的控制时间,减少CPU的开支。2.3方案选择方案一的优点是可以减少硬件开支,便于调试和问题的查找。缺点是CPU开支太大,利用率不高,而且时间不够精准;方案二的优点是控制精度提高,同时也减少CPU的开支。缺点是硬件开销比较多。本设计实现的功能所需要的硬件电路并不是太复杂,一般的IBM-PC/XT/AT机家族都带有相应的硬件电路。在提高精度与简易程度的比较下,决定采用方案二,这样可以大大提高时间控制精度,同时减少软件程序的复杂度。3 系统原理说明在IBM-PC/XT机中都带有8253-5定时/计数器,本文通过对8253-5定时/计数器芯片的操作实现音乐演奏。该声音接口通过汇编语言对8253-5的端口直接进行操作,可以不必要过多的使用BIOS的调用和DOS的调用。计数器芯片有3个通道,各自具有专用功能。通道0时系统的始终节拍计时器,通道1专用于产生动态RAM的定时刷新信号,通道2用来控制计算机的扬声器的声音频率。该音乐演奏主要用到通道2的功能,使通道2工作在“方波发生器”方式,产生相应频率的音调送至喇叭驱动电路,使喇叭发出不同音调的声音。使用8255A的PB0控制通道2的计数,PB1控制通道2的输出对扬声器产生控制的时间。人机交互包括屏幕显示提示语以及人工输入相应参数,主要应用到BIOS的10H号中断调用以及DOS的21H号中断调用。BIOS的10H号中断调用用于显示器驱动,设置显示模式和光标位置;DOS的21H号中断调用用于单字符输入以及多字符输出显示。音乐演奏实现的一个主要步骤是乐谱编程。通过相应的频率表将乐谱中对应的音符转化为计数器的计数初值,节奏通过延时程序转化为对喇叭发音时间的控制,从而实现音符和节拍的数字化。4 硬件电路与原理IBM-PC/XT内部8253电路图如图4-1所示。图4-1 8253电路连接图8253的通道0用于产生固定频率的时钟节拍,通道1用于产生固定频率的的刷新信号,通道2用于产生频率信号,工作在方式3,计数值为6A4H=1190,方波输出频率为1.19MHZ。此信号频率决定扬声器的音调,通道2的控制字为0B6H。音乐产生主要用到通道2。8253通道2的计数由8255A的PB0控制,当PB0输出为高电平时,使门控GATE2为高电平。此时,8253通道2允许计数,故通道2的输出方波受PB0的控制,从而控制扬声器的音调高低。通道2的输出能否对扬声器产生持续控制还取决于8255A的PB1。当PB1为“0”时,OUT2不能通过“与门”;反之,则可以通过“与门”控制扬声器。所以,扬声器发音时间的长短取决于8255A的PB1信号。另外CPU通过读8255A的C口,得知8253通道2的状态和扬声器驱动器的状态。5 软件设计5.1屏幕显示程序设计程序运行时,屏幕显示第一界如图图5-1运行界面输入错误时,提示信息界面如图图5-2,错误提示界面上述提示信息在数据段定义,类型为字节型。首先调用BIOS中断的10H号功能设置文本模式。程序如下: MOV AH,00H ;BIOS 10子功能 MOV AL,02H ;80*25彩色文本模式 INT 10H ;BIOS 10功能调用然后调用背景清屏子程序使文本屏幕清空,为输入信息作准备,清屏子程序如下:CLR PROC NEAR MOV BH,0 ;第0页 MOV BL,0EH ;字符属性,黑底黄字 MOV DX,0000H ;0行0列 MOV AL, ;输出的字符 MOV CX,80*25 ;循环次数 MOV AH,02H ;BIOS 10H子功能调用,置光标位置 INT 10H MOV AH,09H ;BIOS 10H子功能调用,输出字符 INT 10H RETCLR ENDP最后输出提示语字符。输出提示语字符时,需要多次使用一段相同的输出代码,将该代码定义为宏,可以避免多次重复书写相同的代码。不定义为子程序是为了避免多次调用使执行速度减慢。相应宏定义语句为:SHOW MACRO b LEA DX, b ;将相应字符段的偏移地址装入DX MOV AH, 9 ;DOS 21H号中断9子功能输出多字符 INT 21H ENDM则相应的字符提示信息输出代码为INFO1 DB 0DH,0AH, Music player$ INFO2 DB 0DH,0AH, -$INFO3 DB 0DH,0AH, PLEASE SELECT A MUSIC $ INFO4 DB 0DH,0AH, -$ INFO5 DB 0DH,0AH, ERROR! INPUT A B or Q$ INFO6 DB 0DH,0AH, PLEASE INPUT AGAIN!$ MUSLIST DB 0DH,0AH, A LAN HUA CAO DB 0DH,0AH, B HAPPY BIRTHDAY TO YOU DB 0DH,0AH, Q EXIT DB 0DH,0AH, DB 0DH,0AH, $5.2发声的原理与控制程序一首乐曲由若干音符组成,一个音符对应一个频率。将与一个频率对应的计数器初值写入2号计数器(端口地址为42H),扬声器就发出相应的音调,计数器初值的计算公式:计数器初值=1193182/输出频率其中,1193182Hz转换成十六进制为12348CH,因此在打开扬声器的条件下,执行下列程序段即可发出与输出频率对应的音调。MOV AL,0B6H ;写入方式控制字OUT 43H,AL ;写入控制端口MOV DX,12H MOV AX,348CH DIV 频率值 ;频率转换成计数初值 OUT 42H,AL ;低8位送2号计数器 MOV AL,AH OUT 42H,AL ;高位送2号计数器 接下来设计发声程序,发声系统受8255A芯片(端口地址为60H-63H)的两根输出线PB0和PB1的控制,PB0输出的高电平使2号计数器正常工作,PB1输出高电平打开输出控制门。发声程序代码如下:IN AL,61H ;读取8255A的PB端口原输出值MOV AH,AL ;将原输出值保存于AH中OR AL,3 ;使PB0、PB1、均为1OUT 61H,AL ;打开GATE2门,输出方波到扬声器5.3音乐编程一首歌曲包含节拍和频率,此处定义的音乐地址宏包含两个参数,所以音乐编程需要对音乐的节拍时间以及乐谱(频率)进行编写程序。当选择不同的歌曲时,主程序调用不同的宏,将用户要求的歌曲的频率和节拍导入,实现音乐的演奏。5.3.1音乐节拍时间控制音符的演奏时间,这是设计音乐程序的关键问题。最直观的方法是按照谱为每一个音符规定一个演奏时间。在遇到一首不熟悉歌曲时,初期很难确定每个音符的演唱时间,而调试程序的需大量的时间。为每一个音符规定“单位时间”: 单位时间*N=音符的延长时间其中,N为调试参数,一首歌曲只有一个调试参数。设计程序时可以用EQU伪指令定义调试参数,初值现行估算,调试时在修改它。节拍时间设置好以后,就可以利用延时程序,通过PB1端口控制发声的时间长短。80x86的各种处理器采用6-66MHZ的工作频率,LOOP治理的执行时间在这些处理器上也不同。为了建立一个与处理器无关的时间延迟,IBM采用了一个利用硬件产生时间延迟的方法,即通过监控端口61H的PB4,使PB4每15.08us触发一次,以产生一个固定不变的时间基准,在IBM-PC/XT 中的BIOS中的WAITF子程序,就是一个产生N*15.08us时间延迟的程序,调用WAITF子程序时,CX寄存器必须装入15.08us的倍数N。本程序延时程序参考上面的原理,代码如下:waitf proc near ;延时保护程序 push ax ;保护寄存器waitf1: in al,61h ;读取PB端口地址 and al,10h ;低四位清零 cmp al,ah ;检查是否改变 je waitf1 ;等待改变 mov ah,al ;改变,保护新端口值 loop waitf1 ;继续,直到CX=0 pop ax ;恢复寄存器 ret waitf endp 5.3.2音乐的音符频率程序用MUS_FREG、MUS_TIME分别定义了音乐频率和节拍。使得发声程序可以按照理想的要求发出连续的乐曲。节拍和频率定义原理如下:乐曲是按照一定的高低、长短和强弱关系组成的音调,在每一首乐曲中,每个音符的音高和音长与发声系统中的频率、节拍有关。可参考下表:表5-1 音符频率音名CDEFGABCDEFGABC唱名12345671234567i频率131147165175196220247262294330349392440492523其中,低音阶从低音C(131HZ)到中央C(262HZ),高音阶从中央C(262HZ)到高音C(523HZ)。组成乐曲的音符的频率值和持续时间是乐曲程序发声所必需的两组数据,频率可以查上表,音符的持续时间根据乐曲的速度及每个音符的节拍数来确定。知道了音调及频率、时间的关系后,可以按照乐曲的乐谱将每个音符的频率和持续时间定义为两个数据表,然后编写程序依次取出表中的频率值和时间值。本次设计所选的两首音乐乐谱如图图5-3 兰花草乐谱图5-4生日快乐乐谱根据上述原理对两首音乐进行编程,得到的程序为;* 兰花草MUS_FREG1 DW 220,330,330,330,330,294 DW 262,294,262,247,220 DW 4 dup(440),440,392 DW 330,392,392,349,330 DW 330,440,440,392,330,294 DW 262,294,262,247,220,165 DW 165,262,262,247,220,330 DW 294,262,247,196,220,-1MUS_TIME1 DW 30,30,30,30,60,30 DW 30,15,30,30,120 DW 30,30,30,30,80,30 DW 30,30,30,30,120 DW 30,30,30,30,60,3025DW 30,30,30,30,60,60 DW 30,30,30,30,60,60 DW 30,15,30,30,120MUS_FREG2 DW 196,196,220,196,262,247 DW 196,196,220,196,294,262 DW 196,196,392,330,262,247,220 DW 349,349,330,262,294,262,-1 MUS_TIME2 DW 30,30,60,60,60,120 DW 30,30,60,60,60,120 DW 30,30,60,60,60,60,60 DW 30,30,60,60,60,1205.4 程序流程图主流程图开始键盘输入提示信息输入是“Q”? Y N 输入是“B”?输入是“A”?调用MUSIC Y显示出错信息N调用MUSIC Y退出N图5-5 主程序流程图GENSOUND子程序流程图BX=0?返回MUSIC恢复寄存器调用WAITF设置CX初始值计数初值装入2号计数器求取发声频率设置计数器2工作方式寄存器入栈程序调用开始计数并打开扬声器 Y N图5-6 GENSOUND子程序流程图 MUSIC子程序流程图图5-7 music子程序流程图5.5 源程序DATA SEGMENT INFO1 DB 0DH,0AH, Music player$ INFO2 DB 0DH,0AH, -$INFO3 DB 0DH,0AH, PLEASE SELECT A MUSIC $ INFO4 DB 0DH,0AH, -$ INFO5 DB 0DH,0AH, ERROR! INPUT A B or Q$ INFO6 DB 0DH,0AH, PLEASE INPUT AGAIN!$ MUSLIST DB 0DH,0AH, A LAN HUA CAO DB 0DH,0AH, B HAPPY BIRTHDAY TO YOU DB 0DH,0AH, Q EXIT DB 0DH,0AH, DB 0DH,0AH, $ ;* 兰花草MUS_FREG1 DW 220,330,330,330,330,294 DW 262,294,262,247,220 DW 4 dup(440),440,392 DW 330,392,392,349,330 DW 330,440,440,392,330,294 DW 262,294,262,247,220,165 DW 165,262,262,247,220,330 DW 294,262,247,196,220,-1MUS_TIME1 DW 30,30,30,30,60,30 DW 30,15,30,30,120 DW 30,30,30,30,80,30 DW 30,30,30,30,120 DW 30,30,30,30,60,30 DW 30,30,30,30,60,60 DW 30,30,30,30,60,60 DW 30,15,30,30,120;*happy birthday to youMUS_FREG2 DW 196,196,220,196,262,247 DW 196,196,220,196,294,262 DW 196,196,392,330,262,247,220 DW 349,349,330,262,294,262,-1 MUS_TIME2 DW 30,30,60,60,60,120 DW 30,30,60,60,60,120 DW 30,30,60,60,60,60,60 DW 30,30,60,60,60,120;* DATA ENDS STACK SEGMENT DB 200 DUP (STACK) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX MOV AH,00H ;BIOS 10子功能 MOV AL,02H ;80*25彩色文本模式 INT 10H ;BIOS 10功能调用 CALL CLR ;* 定义宏 SHOW MACRO b LEA DX,b ;将提示语的偏移地址送入DX MOV AH,9 ;调用中断,输出多字符 INT 21H ENDM ;* 音乐地址宏 ADDRESS MACRO A,B LEA SI,A ;将频率表的偏移地址送入SILEA BP,DS:B ;将节拍时间表的偏移地址送入BPENDM ;* show INFO1 show INFO2 show INFO3 show INFO4 show MUSLIST INPUT: MOV AH,01H ;等待输入一个字符 INT 21H CMP AL,Q ;比较字符 JZ retu ;是,返回 CMP AL,A ;与A比较 JNZ B0 ;不等再比较 ADDRESS MUS_FREG1,MUS_TIME1 ;取数据 CALL MUSIC ;调用音乐子程序 JMP EXIT1 B0: CMP AL,B JNZ exit ADDRESS MUS_FREG2,MUS_TIME2 CALL MUSIC EXIT1: JMP INPUT ;继续等待输入EXIT: MOV AH,00H ;BIOS 10子功能 MOV AL,02H ;80*25彩色文本模式 INT 10H ;BIOS 10功能调用 CALL CLR ;背景清屏 show INFO5 ;输入错误,显示提示语 show INFO6 show INFO1 show INFO2 show INFO3 show INFO4 show MUSLIST jmp input RETU: MOV AH,4CH ;返回 INT 21H ;* ;背景清屏CLR PROC NEAR MOV BH,0 ;第0页 MOV BL,0eh ;字符属性 黑底黄字 MOV DX,0000H ;0行0列 MOV AL, ;要输出的字符 MOV CX,80*25 ;循环次数 MOV AH,02H ;置光标位置 INT 10H MOV AH,09H ;BIOS 10子功能调用,输出字符 INT 10H RETCLR 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,348ch DIV DI ;得到发声频率 OUT 42H,AL ;发送低字节 MOV AL,AH OUT 42H,AL ;发送高字节 IN AL,61H ;读取8255A的PB端口原输出值 MOV AH,AL ;将原输出值保存于AH中 OR AL,3 ;使PB1、PB0均为1 OUT 61H,AL ;打开GATE2门,输出方波到扬声器WAIT1: MOV CX,3314 ;延时 call waitf DELAY1: DEC BX ;节拍时间值减1 JNZ WAIT1 MOV AL,AH ;取回AH中的8255A的PB端口原输出值 OUT 61H,AL ;恢复8255A的PB端口 POP DI ;恢复寄存器 POP DX POP CX POP BX POP AX RET GENSOUND ENDP ;* waitf proc near ;延时子程序 push ax ;保护寄存器waitf1: in al,61h ;读取PB端口值 and al,10h ;低4位清零 cmp al,ah ;检查PB3是否改变 je waitf1 ;等待改变 mov ah,al ;改变,保护新端口值 loop waitf1 ;继续,直到CX=0 pop ax ;恢复寄存器 ret waitf endp ;* MUSIC PROC NEAR ;音乐子程序 PUSH DS ;压入数据段 SUB AX,AX ;标志位清零 PUSH AX FREG: MOV DI,SI ;取音符频率,送DI CMP DI,-1 ;结束? JE END_MUS ;是,退出 MOV BX,DS:BP ;取音符持续时间 CALL GENSOUND ;调用GENSOUND发声子程序 ADD SI,2 ;频率表指针增2 ADD BP,2 ;时间表指针增2 JMP FREG ;继续演奏END_MUS: RET ;返回MUSIC ENDP CODE ENDS END START6调试记录及结果分析将源程序编写完成后,在pc机上,使用软件MASM进行调试运行。,刚开始编译时,出现了很多的变量未定义的错误,经过反复检查,将拼写错误的地方一一改正,随后发现在按照提示正确输入时,可以演奏音乐,但是当输入错误的字符时,发现屏幕并不显示错误提示语,经过多次检查和调试,发现是没有清屏程序重新设置文本显示模式,加上该段代码后程序运行正常。调试过程中声音的节拍调试时间比较长,多次取值后得到一个可以识别的演奏声音。解决完程序中的问题后,按提示语输入相应的字符命令,可以播放相应的歌曲或是退出,输入错误时会出现错误提示语句。基本能实现要求的功能。由于设计结果是播放音乐,所以无法从图上看出,调试运行的过程如图所示。图6-1 masm界面图6-2 播放音乐A图6-3 播放音乐B图6-4 按Q退出结束语对于此次的课程设计,我感受颇深。此次课程设计让我了解到编写程序的复杂性,对于理论知识的重要性有了跟深刻的认识,完成设计最重要的因素就是对微机原理知识的掌握,为了完成本次课程设计,查阅了相关书籍,学到了很多课外知识。提高了自己的汇编语言的能力。这次微机原理课程设计为我们提供了与众不同的学习方法和学习机会,让我们从传统的被动授学转变为主动求学,把所学的理论知识真正的运用到实践中学习,增强了领悟、创新和推断的能力。实践操作在此次课程设计中也非常重要,上机实践有助于书本知识的系统化,现实化,更有利于自己的查漏补缺。书本上的知识是死的,能够在现实中运用的知识才是活的。通过这次课程设计,也促进了我们的同学之间互相学习,通过同学之间相互讨论,分组设计,增强了我们的团队合作能力。总之,本次的课程设计过程中收获了很多,通过编写程序,增加了学习的积极性和趣味性。通过课程实践,巩固加深对课堂教学内容的理解,提高学生运用汇编语言进行程序设计和动态调试程序的能力,培养同学克服困难的毅力和精神,提高学生综合解决问题的能力。参考文献1彭虎.周佩玲.微机原理与接口技术.北京:电子工业出版社,20112王爽.汇编语言第2版.北京:清华大学出版社,20083沈美明温冬蝉. IBM-PC汇编语言程序设计.北京:清华大学出版社,20014王成端.李晓波.汇编语言程序设计M .北京:高等教育出版社,2003年8月5杨季文.80X86汇编语言程序设计教程.清华大学出版社,2001年9月附录8253芯片资料 附表1 8253控制字格式 D7 D6 D5 D4 D3 D2 D1 D0SC1SC2RL1RL0M2M1M0BCD附表2 8253端口选择A1A0端口00通道001通道110通道211控制口附表3 8253通道选择SC1SC0对应的通道00通道001通道110通道211不用附表4 8253读/写方式RL1RL0通道读写操作00计数器锁存01只读写低8位字节10只读写高8位字节11读写16位附表5 计数数制选择BCD计数制式选择0二进制计数制1BCD计数制附表6 8253工作方式选择M2M1M0工作方式选择000工作方式0001工作方式110工作方式211工作方式3100工作方式4101工作方式5
展开阅读全文