通用发生扬声器模块,一个汇编子程序,谁给讲讲?

来源:百度知道 编辑:UC知道 时间:2024/06/21 08:30:45
SOUNDF 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
MOV AH,AL
OR AL,3
OUT 61H,AL
WAIT1: MOV CX,4000
CALL WAITF
DEC BX
JNZ WAIT1
MOV AL,AH
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
R

现在我们用的主板,都带有一个Intel8254兼容的可编程定时器/计数器。它提供了三个独立的16位计数通道。
0040H R/W 计数器0,系统时间计数器,产生18.2Hz的时钟频率(中断8)
0041H R/W 计数器1,RAM刷新计数器
0042H R/W 计数器2,主板扬声器的频率发生器
0043H R/W 模式设置端口

SOUNDF PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL,0B6H
计数器选择:计数器2;数据读/写格式:16 位计数先读写高字节,后读写低字节;工作方式:工作方式3;数制选择:二进制
OUT 43H,AL 写入方式控制字
MOV DX,12H
MOV AX,348CH 输出频率1193100Hz(DX:AX)
DIV DI 控制实际输出频率=1193100Hz/DI
OUT 42H,AL 先写入低 8位
MOV AL,AH
OUT 42H,AL 后写入高 8位(参数据读/写格式及计数器选择)

0061H R/W bit0: 计数器2的GATE引脚
bit1: 扬声器的控制开关
IN AL,61H 取得设备控制寄存器开关量
MOV AH,AL 暂存以下次恢复
OR AL,3 bit0~1=11接通扬声器
OUT 61H,AL 设置设备控制寄存器开关量
WAIT1: MOV CX,4000
CALL WAITF
DEC BX
JNZ WAIT1
控制脉冲门开关时间,这个时间值根据PC机的主频是可以改变的,主频越快的的机器,这个时间值就应该越大。因为程序里用一个固定的值4000h控制输出脉冲1和0的变化,因此扬声器接通和关闭的时间间隔总是相同的,结果发出的声音是一个没有变化的纯音。
MOV AL,AH
OUT 61H,AL 恢复原状
POP DI
POP DX