综合实验报告 714/2007 综合实验报告 00548154侯璐璐 1.摘要: (1)本次实验我实现的是一个电子琴 (2)本设计了四个功能:用户自由弹奏(音长由按键长短控制),软 件自带音乐的播放,辅助的L7-L1亮来显示当前弹奏得音阶 7-1,用户自己的音乐存储盒及播放。但程序写出来后只调好 了前两个功能,最后一个功能是最后考完调试成功的 (3)关键词:自动播放,用户弹奏,音阶判断,延时时间判断 2.目标要求: 本实验实现了基本功能:通过按键播放相应频率的声音,包括高 低中从7到1的音,音长可控,此外,鉴于一般电子琴应有的功能, 添加了音乐播放功能和辅助显示所弹奏音阶的功能,原本设计实现音 乐存储和播放,但没有在检査前调好,报告末尾附的程序是完全调好 的。交互界面以每到一个子程序给出相应的提示字符串实现。 3.和实施方案 (1)设计方案选择与论述 本实验的重点在于按键发出相应频率的声音,故决定用8253作 为分频器,选择通道0在方式3下工作。通过用户按键决定分频器的 分频系数,其中分频系数是分L(低),M(中),H(高)储存在数据段的三个 l/18
综合实验报告 7/4/2007 综合实验报告 00548154 侯璐璐 1. 摘要: (1) 本次实验我实现的是一个电子琴。 (2) 本设计了四个功能:用户自由弹奏(音长由按键长短控制),软 件自带音乐的播放,辅助的 L7-L1 亮来显示当前弹奏得音阶 7-1,用户自己的音乐存储盒及播放。但程序写出来后只调好 了前两个功能,最后一个功能是最后考完调试成功的。 (3)关键词:自动播放,用户弹奏,音阶判断,延时时间判断 2. 目标要求: 本实验实现了基本功能:通过按键播放相应频率的声音,包括高 低中从 7 到 1 的音,音长可控,此外,鉴于一般电子琴应有的功能, 添加了音乐播放功能和辅助显示所弹奏音阶的功能,原本设计实现音 乐存储和播放,但没有在检查前调好,报告末尾附的程序是完全调好 的。交互界面以每到一个子程序给出相应的提示字符串实现。 3. 和实施方案 (1)设计方案选择与论述 本实验的重点在于按键发出相应频率的声音,故决定用 8253 作 为分频器,选择通道 0 在方式 3 下工作。通过用户按键决定分频器的 分频系数,其中分频系数是分 L(低),M(中),H(高)储存在数据段的三个 1/18
综合实验报告 714/2007 长为7的数组中的。另外为了避免21个音阶21按键引起的混乱,决 定只用7个按键,即键盘上的1-7数字键,另加L,MH三个按键进行 低中高音控制,用户可在弹奏时左手控制高低中右手进行1-7的弹奏, 较为清晰方便。除此之外考虑一般电子琴都有音乐播放的功能,故设 计软件自带音乐,用户在主菜单进行选择进入自动播放就可以听音 乐,其播放算法与用户弹奏的基本一致,留待后面介绍。再次,为了 使弹奏更有动感,设计用实验台上的指示灯L1-L7显示当前弹奏或播 放的音阶1-7,这是由8255的C端口来控制的。作为拓展,希望实 现用户自己存储音乐并播放的功能,结果在检查前时间太紧,没有调 试成功,存储阶段出了问题,在7月2号和3号在实验室调试实现。 (2)方案框图 扬声器 LI-L7 C端口 A端口 8253 8255A CPU处理 键盘输入 (3)细致分析 2/18
综合实验报告 7/4/2007 长为 7 的数组中的。另外为了避免 21 个音阶 21 按键引起的混乱,决 定只用 7 个按键,即键盘上的 1-7 数字键,另加 L,M,H 三个按键进行 低中高音控制,用户可在弹奏时左手控制高低中右手进行 1-7 的弹奏, 较为清晰方便。除此之外考虑一般电子琴都有音乐播放的功能,故设 计软件自带音乐,用户在主菜单进行选择进入自动播放就可以听音 乐,其播放算法与用户弹奏的基本一致,留待后面介绍。再次,为了 使弹奏更有动感,设计用实验台上的指示灯 L1-L7 显示当前弹奏或播 放的音阶 1-7,这是由 8255 的 C 端口来控制的。作为拓展,希望实 现用户自己存储音乐并播放的功能,结果在检查前时间太紧,没有调 试成功,存储阶段出了问题,在 7 月 2 号和 3 号在实验室调试实现。 (2)方案框图 CPU 处理 L1-L7 8253 扬声器 键盘输入 A 端口 8255A C 端口 (3)细致分析 2/18
综合实验报告 714/2007 件 用了TPC-H微机接口实验箱上的8255A,8253,CPU,指示灯 L7-L1 方法和算 洇 本实验的核心部分是发出见长可控的一定频率的声音,由于本实 验将21个音阶分成了高低中,用户可以先输入表示低中高的字母 LMH再按键1-7弹奏,程序在处理用户输入时也分两步两种情形处 理,首先,要正确地取出分频系数。对用户输入的字符进行判断,若 是LMH之一则事先将相应的七个分频系数的数据段变量初始地址 放入固定寄存器(如BX)供之后取分频系数之用,然后用户应该输入 1-7音阶,结合之前的初始地址寄存器即可取出相应的分频系数。然 后的重点就在于控制发音的长短。这部分开始并不会,请教同学后知 道可以通过查询微机内部的60H端口来判断是否一直有键按下从而 实现按键控制音长,若键一直按下则调用延时程序块,否则停止发音。 再者,通过实验箱8255A的A端口的PA0和PA1分别控制实验箱8253 的通道0的 GATE和OUT0,其中PA0直接与 GAtE相连,PA1与 OUT0相与后输出到扬声器,于是通过控制8255A的A端口的值 控制是否对扬声器输岀相应频率的方波发生,至此,核心模块的算法 介绍完毕。它是实现弹奏和自动播放的基础。 它又可以分成几个小的模块,发声子模块,延时子模块,页面信 息子模块,判断子模块,发声前的初始化子模块等,可以将整体划分 为相对独立但又彼此逻辑相关的部分,较为清晰的展现整个流程。 3/18
综合实验报告 7/4/2007 部件 用了 TPC-H 微机接口实验箱上的 8255A,8253,CPU,指示灯 L7-L1 方法和算法 本实验的核心部分是发出见长可控的一定频率的声音,由于本实 验将 延时子模块,页面信 息子 21 个音阶分成了高低中,用户可以先输入表示低中高的字母 L,M,H,再按键 1-7 弹奏,程序在处理用户输入时也分两步两种情形处 理,首先,要正确地取出分频系数。对用户输入的字符进行判断,若 是 L,M,H 之一则事先将相应的七个分频系数的数据段变量初始地址 放入固定寄存器(如 BX),供之后取分频系数之用,然后用户应该输入 1-7 音阶,结合之前的初始地址寄存器即可取出相应的分频系数。然 后的重点就在于控制发音的长短。这部分开始并不会,请教同学后知 道可以通过查询微机内部的 60H 端口来判断是否一直有键按下从而 实现按键控制音长,若键一直按下则调用延时程序块,否则停止发音。 再者,通过实验箱8255A的A端口的PA0和PA1分别控制实验箱8253 的通道 0 的 GATE0 和 OUT0,其中 PA0 直接与 GATE0 相连,PA1 与 OUT0 相与后输出到扬声器,于是通过控制 8255A 的 A 端口的值 控制是否对扬声器输出相应频率的方波发生,至此,核心模块的算法 介绍完毕。它是实现弹奏和自动播放的基础。 它又可以分成几个小的模块,发声子模块, 模块,判断子模块,发声前的初始化子模块等,可以将整体划分 为相对独立但又彼此逻辑相关的部分,较为清晰的展现整个流程。 3/18
综合实验报告 714/2007 而在弹奏和播放音乐基于功能的差别算法也加了不同的东西,例 如弹奏时为了将用户所弹奏音乐进行存储,需要两个寄存器SⅠ和DI 分别用于记录所弹奏有效音符和对应得延时,并依次存入相应的缓冲 BUF和TIME1,供之后的用户选择是否存入音乐盒2 弹奏相应音符前的显示灯辅助显示作为一项与弹奏算法相对独 立的功能,又独立模块 DISPLAY实现,只要在每次发音前调用即可。 另外还有一些辅助的模块,如各模块间的衔接,弹奏相应音阶前 的辅助显示指示灯,或是判断转移的中转站(因为程序太长),判断转 移一次跳不过去,这会增加程序的不清晰度,但通过去意义直观的名 字可以尽量解决。 (4)电路框图和软件流程图以及主要软件模块说明 电路框图如下 280H-283H 288H—28BH PAO GATO 8253 CLOCKO IMHZ 扬声器 由于整个软件流程图太长,将针对每个重要子模块给出它们的分
综合实验报告 7/4/2007 而在弹奏和播放音乐基于功能的差别算法也加了不同的东西,例 如弹 奏算法相对独 立的 的辅 程图以及主要软件模块说明 奏时为了将用户所弹奏音乐进行存储,需要两个寄存器 SI 和 DI 分别用于记录所弹奏有效音符和对应得延时,并依次存入相应的缓冲 BUF 和 TIME1,供之后的用户选择是否存入音乐盒 2 弹奏相应音符前的显示灯辅助显示作为一项与弹 功能,又独立模块 DISPLAY 实现,只要在每次发音前调用即可。 另外还有一些辅助的模块,如各模块间的衔接,弹奏相应音阶前 助显示指示灯,或是判断转移的中转站(因为程序太长),判断转 移一次跳不过去,这会增加程序的不清晰度,但通过去意义直观的名 字可以尽量解决。 (4)电路框图和软件流 电路框图如下: 由于整个软件流程图太长,将针对每个重要子模块给出它们的分 PA0 CS PC0 8255A PA1 PC7 L0 L7 CS GATE0 8253 CLOCK0 OUT0 1MHZ 扬声器 280H—283H 288H—28BH 4/18
综合实验报告 714/2007 析说明和流程图,再以它们为单位画出整个过程的简化流程图。 由于自动播放与用户弹奏的发声算法基本相似,将以用户弹奏为 例给出流程图 发声子模块BEEP程序代码如下: BEEP PROC NEAR PUSH DI PUSHAX;保护 MOV ALO0110110B 8253控制字,计数器0,先读写;低字节,再 ;读写高字节,方式3,二进制计数 MOV DX. 283H OUT DXAL POP AX AND ALOFH DEC AL ADD ALAL MOV.OOH MOV DLAX MOVAX, BX+DI 取出分频系数(字变量) MOV DX. 280H OUT DX.AL MOV ALAH OUT DXAL MOV DX. 288H IN AL DX MOVAHAL 暂存8255A端口的值 OR AL. 03H ,允许计数器计数并输出分频后方 ;波 OUT DXAL 5/18
综合实验报告 7/4/2007 析说 为 例给 BEEP 程序代码如下: BE 保护 10B ;8253 控制字,计数器 0,先读写;低字节,再 AL +DI] ;取出分频系数(字变量) H L ;暂存 8255A 端口的值 分频后方 OUT DX,AL 明和流程图,再以它们为单位画出整个过程的简化流程图。 由于自动播放与用户弹奏的发声算法基本相似,将以用户弹奏 出流程图 发声子模块 EP PROC NEAR PUSH DI PUSH AX; MOV AL,001101 ;读写高字节,方式 3,二进制计数 MOV DX,283H OUT DX,AL POP AX AND AL,0FH DEC AL ADD AL, MOV AH,00H MOV DI,AX MOV AX,[BX MOV DX,280H OUT DX,AL MOV AL,AH OUT DX,AL MOV DX,288 IN AL,DX MOV AH,A OR AL,03H ;允许计数器计数并输出 ;波 5/18
综合实验报告 714/2007 POP DI KEY IN AL. 6OH TEST AL. 80H JNZ NEXT 判断是否一直有按键,若停止按键则停止发音 CALL DELAY ;否则延时 PUSH SI SHL SIOIH MOV BPOFFSET TIMEI ADD WORD PTR DS: BP+SI, 20H POP SI 次延时时间加20H JMP KEY NEXT MOVALAH MOV DX288H OUT DX.AL 恢复8255A的A端口值 INC SI RE BEEP ENDP 流程图如下: 6/18
综合实验报告 7/4/2007 POP DI KEY AL,60H H ;判断是否一直有按键,若停止按键则停止发音 T TIME1 ,20H 间加 20H AL,AH ;恢复 8255A 的 A 端口值 P 流程 : IN TEST AL,80 JNZ NEXT CALL DELAY ;否则延时 PUSH SI SHL SI,01H MOV BP,OFFSE ADD WORD PTR DS:[BP+SI] POP SI ;一次延时时 JMP KEY、 NEXT: MOV MOV DX,288H OUT DX,AL INC SI RET BEEP END 图如下: 6/18
综合实验报告 714/2007 开始 8253初始化 取AL中音符字符 取相应分频系数 设置8253计数器 设8255A的A端口 延时变量值加20H 允许输出波形 计数器SI加一 调用延时程序 直按键? N 恢复A端口 禁止8253输出 结束 7/18
综合实验报告 7/4/2007 开始 8253 初始化 取 AL 中音符字符 取相应分频系数 设置 8253 计数器 设8255A的A端口 允许输出波形 一直按键? 调用延时程序 延时变量值加 20H 计数器 SI 加一 Y N 恢复 A 端口 禁止 8253 输出 结束 7/18
综合实验报告 714/2007 延时子模块 DELAY程序代码如下: DELAY PROC NEAR PUSH CX PUSH BX 保护现场 MOV CX.O MOV BL 20H ;控制延时时间 LULU LOOP LULU DEC BL JN IZ LULU 判读是否延时结束 POP BX POP CX RET DELAY ENDP 鉴于此模块流程极简单,就没必要给岀流程图,此模块的关键 在于用双重循环执行指令控制延时时间,其中内层循环用CⅩ控制, 外层用BL控制。 弹奏控制子模块链程序代码如下: PLAY MOV DLO MOV SLO 初始化用作计数的寄存器 REMOVE MOV CX.100 MOV WORD PTR TIMEIISIL,OOH INC SI INC SI LOOP YY MOV SLO MOV DXOFFSET MES3 MOV AH.09H INT2IH 输出提示信息 MOV.O7H INT21H BH3 CMP AL IBH 按ESC键退出 8/18
综合实验报告 7/4/2007 延时子模块 DELAY 程序代码如下: DELAY PROC NEAR PUSH CX PUSH BX ;保护现场 MOV CX,0 MOV BL,20H ;控制延时时间 LULU: LOOP LULU DEC BL JNZ LULU ;判读是否延时结束 POP BX POP CX RET DELAY ENDP 鉴于此模块流程极简单,就没必要给出流程图,此模块的关键 在于用双重循环执行指令控制延时时间,其中内层循环用 CX 控制, 外层用 BL 控制。 弹奏控制子模块链程序代码如下: PLAY: MOV DI,0 MOV SI,0 ;初始化用作计数的寄存器 REMOVE: MOV CX,100 YY: MOV WORD PTR TIME1[SI],00H INC SI INC SI LOOP YY MOV SI,0 MOV DX,OFFSET MES3 MOV AH,09H INT 21H ;输出提示信息 JUDGE: MOV AH,07H INT 21H BH3: CMP AL,1BH ;按 ESC 键退出 8/18
综合实验报告 714/2007 JZ CHANGE CMP AL. 52H JZ BEGIN JM ;按R返回主菜单 CMP AL- 53F 按S则一曲弹奏完毕 JZ STORE 进入判断存储子程序 CMP AL. 4CH 否则弹奏,若按键L则进 JZ LOW JM 低音弹奏初始化子程序 CMP AL 4DH 否则弹奏,若按键M则进 JZ MID JM 中音弹奏初始化子程序 CMP AL 48H JZ HIGN JM 否则弹奏,若按键M则进入 高音弹奏初始化子程序 MOV DX OFFSET WRONG 否则提示输入错误,要求重 新输入 MOV AH. 09H INT 2IH JMP JUDGE 此小段为进入弹奏阶段后1的键入判断,即是否退出,返回主 菜单,或是结束一曲,若是弹奏则先选择高低中然后进入相应的音阶 初始化及记录相应高(H)中(M)低(L)的子模块,以低音处理的子模块 入下所示 LOW PITCH MOV BYTE PTR BUFIDIL, 4CH L存入BUF中 INC D MOV BXOFFSET LOWD 将存储低音分频系数的数组 首地址存入BX JMP PITCH ;进入发音子模块 做好发声前初始化处理后,即进入发声子模块 PITCH,对用 户输入的1-7判断发声,若输入非1-7,则返回弹奏控制子模块标号 BH3( QIONG为中转站)判断。PTCH代码如下所示: PITCH MOVAHOTH INT 2IH CMP AL. 37H JG QIONG 9/18
综合实验报告 7/4/2007 JZ CHANGE CMP AL,52H JZ BEGIN_JM ;按 R 返回主菜单 CMP AL,53H ;按 S 则一曲弹奏完毕 JZ STORE ;进入判断存储子程序 CMP AL,4CH ;否则弹奏,若按键 L 则进 JZ LOW_JM ; 低音弹奏初始化子程序 CMP AL,4DH ;否则弹奏,若按键 M 则进 JZ MID_JM ;中音弹奏初始化子程序 CMP AL,48H JZ HIGN_JM ;否则弹奏,若按键 M 则进入 ;高音弹奏初始化子程序 MOV DX,OFFSET WRONG ;否则提示输入错误,要求重 ;新输入 MOV AH,09H INT 21H JMP JUDGE 此小段为进入弹奏阶段后 1 的键入判断,即是否退出,返回主 菜单,或是结束一曲,若是弹奏则先选择高低中然后进入相应的音阶 初始化及记录相应高(H),中(M),低(L)的子模块,以低音处理的子模块 入下所示: LOW_PITCH: MOV BYTE PTR BUF[DI],4CH ;L 存入 BUF 中 INC DI MOV BX,OFFSET LOWD ;将存储低音分频系数的数组 ;首地址存入 BX JMP PITCH ;进入发音子模块 做好发声前初始化处理后,即进入发声子模块 PITCH,对用 户输入的 1-7 判断发声,若输入非 1-7,则返回弹奏控制子模块标号 BH3(QIONG 为中转站)判断。PITCH 代码如下所示: PITCH: MOV AH,07H INT 21H CMP AL,37H JG QIONG 9/18
综合实验报告 714/2007 CMP AL31H JL QIONG ;若键入字符不在1-7则重新弹奏 MOV BUFIAL 否则将字符存入缓冲 INC D 计数器加 CALL DISPLAY 调用辅助显示子模块 CALL BEEP 调用发音子模块 JMP PITCH 整个弹奏判断逻辑模块如上介绍,但一曲奏毕,用户可以选择存 储或是不存储然后继续进行弹奏。这一段的处理子模块代码如下所 STORE MOV BYTE PTR BUFIDI, 30H 缓冲区存音阶的字符串末尾加0 INC DI MOvDⅹ, OFFSET MES6 MOVAH09H INT2IH 显示提示信息 MOV AH.OTH INT2IH CMP AL. 59H JZ MOVE 按Y则进行存储 CMP AL. 43H JZ GO ON ;按C则不存储 MOV DX OFFSET WRONG ;若输入错误则提示用户重新选择 MOVAH09H INT2IH JMP STORE 以上这一段用于处理用户按键S表示一曲奏毕后提示用户是否存 储音乐,下面介绍若用户选择进行存储则进行处理的MOⅤE模块。 MOVE. PUSH SI PUSH D POPCⅩ MOVAXDATA MOV ES.AX MOV SLOFFSET BUF MOV DLOFFSET MUSICO 将缓冲中的音阶字符串倒入 MUSIC0 REP MOVSB POP CX
综合实验报告 7/4/2007 CMP AL,31H JL QIONG ;若键入字符不在 1-7 则重新弹奏 MOV BUF[DI],AL ;否则将字符存入缓冲 INC DI ;计数器加一 CALL DISPLAY ;调用辅助显示子模块 CALL BEEP ;调用发音子模块 JMP PITCH 整个弹奏判断逻辑模块如上介绍,但一曲奏毕,用户可以选择存 储或是不存储然后继续进行弹奏。这一段的处理子模块代码如下所 示: STORE: MOV BYTE PTR BUF[DI],30H ;缓冲区存音阶的字符串末尾加 0 INC DI MOV DX,OFFSET MES6 MOV AH,09H INT 21H ;显示提示信息 MOV AH,07H INT 21H CMP AL,59H JZ MOVE ;按 Y 则进行存储 CMP AL,43H JZ GO_ON ;按 C 则不存储 MOV DX,OFFSET WRONG ;若输入错误则提示用户重新选择 MOV AH,09H INT 21H JMP STORE 以上这一段用于处理用户按键 S 表示一曲奏毕后提示用户是否存 储音乐,下面介绍若用户选择进行存储则进行处理的 MOVE 模块。 MOVE: CLD PUSH SI PUSH DI POP CX MOV AX,DATA MOV ES,AX MOV SI,OFFSET BUF MOV DI,OFFSET MUSIC0 ;将缓冲中的音阶字符串倒入 MUSIC0 REP MOVSB POP CX 10/18