这个程序在我的机器没有声音,为什么?

[复制链接]
查看11 | 回复6 | 2021-1-27 06:46:22 | 显示全部楼层 |阅读模式
;++++++++++++++++++++++++++++++++++++++++++++++++
;+时代变了,CPU变快了,把wait的时间延长些
;下面的delay值,适合我的P42.6G的CPU,可以听到声音
;至于delaycpu你可以调一调下面的di值
;如国想精确些,可以用时钟中断1Ch来精准延迟
;++++++++++++++++++++++++++++++++++++++++++++++++
DATASEGMENT
MUS_FREDW220,262,330,330,330,294,330,330,330,294,330,294,262,262,100,330,294
DW330,294,262,294,262,247,262,247,220,220,100,220,262
DW330,330,330,294,330,330,330,294,330,294,262,262,100,330,294
DW330,294,262,294,330,220,220,100,-1
MUS_TIMDW12DUP(25),50,4DUP(25)
DW25,50,25,25,50,25,25,25,25,50,25,25,25,25
DW12DUP(25),50,4DUP(25)
DW25,50,25,25,50,50,100,25,25
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:
MAINPROC
MOVAX,DATA
MOVDS,AX
CALLMUSIC
MOVAH,4CH
INT21H
MAINENDP
MUSICPROC
LEASI,MUS_FRE
LEABP,MUS_TIM
FRE:MOVDi,[SI];di里为音调频率
CMPDi,-1
JEEND_MUS
MOVBX,DS:[BP];bx里为延迟时间,为10ms的倍数
CALLGETSOUND
ADDSI,2
ADDBP,2
JMPFRE
END_MUS:RET
MUSICENDP
GETSOUNDPROC
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVAL,0B6H
OUT43H,AL
MOVDX,12H
MOVAX,3280h
DIVDi
OUT42H,AL
INAL,61H
MOVAH,AL
ORAL,3
OUT61H,AL
calldelay
MOVAL,AH
OUT61H,AL
POPDI
POPDX
POPCX
POPBX
POPAX
RET
GETSOUNDENDP

delayprocnear
pushsi
pushdi
movdi,400h;要想发声,把此值设置好;设置声音的频率
movsi,0
s1:
subsi,1
sbbdi,0
cmpsi,0
jnes1
cmpdi,0
jnes1
popdi
popsi
ret
delayendp

CODEENDS
ENDSTART
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:46:22 | 显示全部楼层
这类程序要在真正的DOS系统环境下运行,不能在Windows的命令提示窗口运行。
软延时方法在20年前就该淘汰了,改用定时器。
另外确定你的电脑蜂鸣器是否正常。
回复

使用道具 举报

千问 | 2021-1-27 06:46:22 | 显示全部楼层
引用1楼cnzdgs的回复:这类程序要在真正的DOS系统环境下运行,不能在Windows的命令提示窗口运行。
软延时方法在20年前就该淘汰了,改用定时器。
另外确定你的电脑蜂鸣器是否正常。

什么是蜂鸣器?
回复

使用道具 举报

千问 | 2021-1-27 06:46:22 | 显示全部楼层
不懂什么是蜂鸣器?就是安装在计算机箱内发出声音的speaker或蜂鸣器,另外你程序在我计算机上运行有发出短暂声音。
回复

使用道具 举报

千问 | 2021-1-27 06:46:22 | 显示全部楼层
试试这个发音吗
DATASEGMENT
FREQDW262,294,330,262,262,294,330,262
DW330,349,392,330,349,392,392,440
DW392,349,330,262,392,440,392,349
DW330,262,294,196,262,294,196,262,-1
TIMEDW25,25,25,25,25,25,25,25,25,25
DW50,25,25,50,12,12,12,12,25,25
DW12,12,12,12,25,25,25,25,50,25,25,50
SNAMEDB'TWOTIGER.$'
DATAENDS
STACKSEGMENTSTACK'STACK'
DB100DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:CODE,SS:STACK,DS:DATA
PLAYPROCFAR
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETSNAME
MOVAH,9
INT21H
MOVAL,0B6H;写入定时器控制字
OUT43H,AL
MOVBP,OFFSETTIME;节拍
MOVSI,OFFSETFREQ;声调
SONG:
MOVDI,[SI];发声频率存于DI中
CMPDI,-1;高频
JZEXIT
MOVBX,DS:[BP]
CALLCSOUND
INCSI
INCSI
INCBP
INCBP
JMPSONG
EXIT:RET
CSOUNDPROCNEAR;通用发声程序
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
MOVDX,12H;DX,AX=12348CH对应1.1931MHZ
MOVAX,34DCH;1193100HZ/Freq(存于DI)得到定时器2的计数值
DIVDI
OUT42H,AL;写入定时器时间常数低字节
MOVAL,AH
OUT42H,AL;写入定时器时间常数高字节
INAL,61H;得到端口8288PB口的当前值
MOVAH,AL;保存
ORAL,03H;打开扬声器
OUT61H,AL
;MOVBX,5fffh;3FFFH;双重延时程序,等待指定时长;修改这里的值(适当增减),以达到可听的音频
movbx,6ffh;
DLY0:MOVCX,32717
DLY1:LOOPDLY1;loop占指令17个时钟周期
DECBX
JNZDLY0
MOVAL,AH;恢复端口即关断扬声器
OUT61H,AL
POPSI
POPDX
POPCX
POPBX
POPAX
RET
CSOUNDENDP
PLAYENDP
CODEENDS
ENDPLAY

回复

使用道具 举报

千问 | 2021-1-27 06:46:22 | 显示全部楼层



请问
这里的定时器起了什么作用。。。是怎么起的作用?
回复

使用道具 举报

千问 | 2021-1-27 06:46:22 | 显示全部楼层
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行