发声系统程序设计(微机原理实验设计)

上传人:第*** 文档编号:33589734 上传时间:2018-02-16 格式:DOC 页数:10 大小:166KB
返回 下载 相关 举报
发声系统程序设计(微机原理实验设计)_第1页
第1页 / 共10页
发声系统程序设计(微机原理实验设计)_第2页
第2页 / 共10页
发声系统程序设计(微机原理实验设计)_第3页
第3页 / 共10页
发声系统程序设计(微机原理实验设计)_第4页
第4页 / 共10页
发声系统程序设计(微机原理实验设计)_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《发声系统程序设计(微机原理实验设计)》由会员分享,可在线阅读,更多相关《发声系统程序设计(微机原理实验设计)(10页珍藏版)》请在金锄头文库上搜索。

1、一、实验目的 :利用不同的方法设计一个声音发声系统二、实验内容:18253 定时器作为发声源将定时器产生的方波信号同 8255 的端口 B 相与来控制扬声器发声的(如图 1 所示) ,因此当 PB1=1 时,才能控制扬声器的音调。在系统中 8255 的 B 口地址为 61H, 控制扬声器发声原理图指令: IN AL,61HOR AL,3OUT 61H,AL发声子程序如下:BEEP PROC NEAR MOV AL,10110110BOUT 43H,AL MOV AX,533HOUT 42H,AL MOV AL,AHOUT 42H,AL IN AL,PORT_BMOV AH,ALOR AL,03

2、OUT PORT_B,ALSUB CX,CXG7: LOOP G7DEC BLJNZG7MOV AL,AHOUT PORT_B,ALRET BEEP ENDP28255 端口 B(如 PB1 位)作为发声源使 8255 端口 B(或相应的等效电路)最低位 D0=0,关闭定时器声源的输出,OUT2 为常高电位(方式 3 所致) 。又通过使 8255 端口 B(或相应等效电路)的 D1 位置 1 或置0(按指定的频率来编程) ,便能让“与”门输出一周期性变化的方波,使扬声器发声。3利用中断调用实现发声利用计算机内部的计数器和扬声器实现 三、实验内容及程序1扬声器发声通用子程序PUBLIC GENS

3、OUNDCODE SEGMENT PARA CODEASSUME CS:CODEGENSOUND PROC FARPUSH AX ;保存将要用到的寄存器PUSH BXPUSH CX PUSH USH DIMOV AL,0B6H;向 8253-5/8254-2 计数器 2 写控制字OUT 43H,AL;方式 3、双字节写和二进制计数方式写到控制口MOV DX,12H;设置被除数MOV AX,533H*896DIV DI;其商(AX)为预置值OUT 42H,AL;先送 LSBMOV AL,AHOUT 42H,AL;后送 MSBIN AL,61H;读 8255 端口 B(61H)原值MOV AH,A

4、L;保存端口原值OR AL,3 OUT 61H,AL;接通扬声器WAIT1:MOV CX,8FF0H;在 80486/DX2/66 中取DELAY:LOOP DELAY;循环次数为 8FF0HDEC BX;循环持续 BX 次JNZWAIT1MOV AL,AH;写回 61H 口原值,关闭扬声 OUT 61H,ALPOP DI;恢复寄存器POP DX POP CXPOP BX POP AXRET ;子程序结束返回GENSOUND ENDPCODE ENDSEND2演奏乐曲程序2.以乐谱“玛丽有只小羊羔”为例编写演奏程序程序如下:TITLE MUSIC 乐曲“玛丽有只小羊羔 ”;汇编过程: MASM

5、 MUSIC.ASM 连接过程;LINK MUSIC+GENLOUNDEXTRN GENSOUND:FAR;定义外部调用程序STACK SEGMENT PARA STACK STACKDB 64 DUP(STACK)STACK ENDSDATA SEGMENT PARA DATAMUS_FREQ DW 330,294,262,294,3 DUP(330) ;为演奏的乐曲定义一个DW3 DUP(294) ,330,392,392 ;频率表DW330,294,262,294,4 DUP(330)DW294,294,330,294,262,-1MUS_TIME DW6 DUP(25*8) ,50*8

6、;为演奏的乐曲定义一个DW2 DUP(25*8,25*8,50*8) ;节拍时间表DW12 DUP(25*8) ,100*8 DATA ENDS; CODE SEGMENT PARA CODEASSUME CS:CODE,SS :STACKASSUME DS:DATAMUSIC PROC FARPUSH DS SUB AX,AXPUSH AXMOV AX,DATA ;指向数据指针MOV DS,AXLEA SI,MUS_FREQ;将频率表的偏移地址送入 SILEA BP,DS :MUS_TIME;将节拍时间表的偏移地址送入 BPFREQ:MOV DI,SI;取音符频率CMP DI,-1 ;结束?

7、JE END_MUS;是,退出MOV BX,DS :BP ;取音符持续时间 CALLGENSOUND ;调用 GENSOUND 发音子程序ADD SI,2 ;频率表指针增 2ADD BP,2 ;时间表指针增 2JMP FREQ ;继续演奏END_MUS:RET ;返回 DOSMUSIC ENDP;CODE ENDSEND MUSIC3定时报警程序TITLE ALARM定时报警程序利用 INT 1AH 中断实现定时报警,本程序在执行后,若设置成功则首先显示;字符串“Set up all right ”并使扬声器发声,这表明设置成功;1 分钟(为定时时间,;读者也可自己设定)后屏幕显示“!”并发声

8、,以示报警。;汇编过程:MASM:ALARM.ASM;连接过程:LINK :ALARM+GENSOUNDEXTRN GENSOUND:FAR;定义外部调用程序STACK SEGMENT PARA STACK STACKDB 64 DUP(STACKSTACK ENDS;DATA SEGMENT PARA PUBLIC DATABJ DB Set up all right .DB 13,10, $DATA ENDS; CODE SEGMENT PARA PUBLIC CODEASSUME CS:CODE,SS :STACK ,DS:DATAENTRY PROC FARPUSH DS;保存旧的数据

9、段SUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV AL,4AH;读取 INT 4AH 中断向量MOV AH,35H INT 21HPUSH ES;入栈保护 PUSH BXSTEP1:MOV AH,7;清除实时钟报警INT1AHJC STEP1 ;进位位为 1 则转移(成功则转移);MOV AL,4AH;设置新的 INT 4AH 中断向量MOV DX,SEG ALARMMOV DS,DX LEA DX,ALARM MOV AH,25HINT21H CLI;关中断STEP2:MOV AH,2 ;利用 INT 1AH 读当前实时钟时间INT1AH ;时、分、秒分别置入

10、 CH、CL、DHJC STEP2;不成功再读MOV AL,CLADD AL,1 ;增 1 分钟DAA ;调整为 BCD 码格式CMP AL,60H ;是 60 分吗(BCD 数)?JL STEP3 ;不是,则转移MOV AL,00H;是,改为 0 分STEP3:MOV CL,AL;得到报警时刻的分值MOV AH,6 ;CH、DH 仍为原值INT1AH ;设置报警时刻JC STEP2 ;不成功重做STI ;开中断MOV CX,12SETUP:MOV AH,2;设置成功发出“嘟嘟”声MOV DL,07H;07H 是振铃控制码INT21H;用 INT 21H 的 2 号功能实现LOOP SETUP

11、;循环发声MOV AX,DATAMOV DS,AXMOV DX,OFFSET BJ;显示“Set up all right .”字符串MOV AH,9INT21HMOV DX,32000MAINP1:MOV CX,25500;延时程序段,等待报警MAINP2:LOOP MAINP2DEC DXJNEMAINP1RES:POP DX;恢复 INT 4AH 原中断向量POP DSMOV AL,4AHMOV AH,35H INT 21H RET ENTRY ENDP;ALARM PROC ;报警中断服务程序 PUSH AX PUAH BXPUSH DI STIMOV AH,2 ;显示字符!MOV D

12、L, !INT21HMOV DI,300 ;发音频率MOV BX,1400 ;发音延迟时间CALL GENSOUND ;调用通用发声子程序POP DI POP BXPOP AX IRETALARM ENDPCODE ENDSEND ENTRY ;程序结束4.用软中断 INT 60H、发声中断服务程序 INT 61H 以及软中断 INT 62H、 INT 63H ,实现字符串“intel 80486 DX2/66 CPU”显示、扬声器发声和变色三角形的显示功能,定时器 ICH 中断作为计数器使用。DATA SEGMENT PARA DATA ;数据段D1 DB 0DH, intel 80486

13、DX2/66 CPU $D3 DW 0D20DB ? DATA ENDS;STAC SEGMENT PARA STACK STAC;堆栈段STA1 DW 100 DUP(?)STAC ENDS;CODE SEGMENT PARA CODE ;代码段ASSUME CS:CODE,DS:DATAASSUME SS:STAC ,ES:DATASTAR PROC FAR ;主程序开始PUSH DS XOR AX,AXPUSH AX MOV AX,DATAMOV DS,AX MOV ES,AXCLI;关中断MOV AL,1CH;保存定时器时钟中断向量MOV AH,35HINT21HPUSH ESPUSH

14、 BX PUSH DSMOV DX,OFFSET RING;设置定时器时钟中断向量MOV AX,SEG RINGMOV DS,AXMOV AL,1CH MOV AH,25HINT21HPOP DS IN AL,21H ;读 IMR 中的屏蔽码AND AL,1111110B;开放中断 0 并保留中断屏蔽设置OUT 21H,AL;将新屏蔽码写入 IMR 中PUSH DS;入栈保护 DS 寄存器MOV DX,OFFSET I60;取 I60 的偏移地址MOV AX,SEG I60 ;取 I60 的段基地址MOV DS,AXMOV AH,25HMOV AL,60HINT21HLEA DX,I61 ;设置 61H 软中断向量MOV AX,SEG I61MOV DS,AXMOV AH, 25HMOV AL,61HINT21HLEA DX,I62 ;设置 62H 软中断向量MOV AX,SEG I62MOV DS,AXMOV AH,25H MOV AL,62HINT21HLEA DX,I63;设置 63H 软中断向量MOV AX,SEG I63 MOV DS,AXMOV AH,25H

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号