字号:大 中 小 c 语言经典教程:发声技术 问题: 乐谱的 1、2、3、4、5、6、7,加上高低音可以谱出动听的曲子,请编写程 序,使计算机能够播放歌曲。 [分析] 播放歌曲意味着让计算机发声,声音从 PC 机内的扬声器发出,所以这个问题将与 硬件扬声器电路有关。 [解答] 解决这一编程问题,让我们首先简单了解一下计算机发声的原理。在 PC 机的系统板上装有定时与计数器 8253 芯片,还有 8255 可编程并行接口芯片,由它们组成的硬件电路 可用来产生 PC 机内扬声器的声音,对于 286、386、486、586 等 PC 微机,由于采用了超大 规模集成电路,因而看不到这些芯片,它们均集成在外围电路芯片上了。 当我们操作计算机时,常常听到的发声,就是由软件控制这些电路而产生的。声音的 长短和音调的高低,均可由程序进行控制。在扬声器电路中,定时器的频率决定了扬声器发 音的频率,所以可通过设定定时器电路的频率来使扬声器发出不同的声音。对定时器电路进 行频率设定时,首先对其命令寄存器(口地址为 0x43)写命令字,如写入 0xb6,这可用 outporb(0x43,0xb6);来实现,则表示选择该定时器的第二个通道,计数频率先送低 8 位(二 进制),后送高 8 位。接着用口地址 0x42 送频率计数值,先送低 8 位,后送高 8 位,即用 outportb(0x42,低 8 位频率计数值)和 outportb(0x42,高 8 位频率计数值)来实现。通过这两 步使定时器电路产生一系列方波信号,此信号是否能推动扬声器发音,还要看由 8255 产生 的门控信号和送数信号是否为 1,而它们也可编程,口地址为 0x61。为了不影响 8255 口地 址 61H 中的其他高位,应先输入口地址 6lH 的现有值 bits,即用 bits= inportb(0x61)来实现, 然后就可用 outportb(0x61,bits|3)来允许发声,而用 outportb(0x61,bits&0xfc)来禁止发声, 且不改变 8255 其它位原来的值,关于这方面的详细内容可以参阅 IBM PC/XT 接口技术方面 书籍有关内容。 5.1 声音函数 编写音乐程序播放歌曲,最简单的方法是可以直接使用 TURBO C 在 dos.h 中提供的有 关发声的函数 sound()和 nosound()。sound()函数用于产生声音,其原型如下: void sound(unsigned frequency); 该函数的入口参数为扬声器要产生声音的频率。 与 sound()函数相反,nosound ()函数用于关闭扬声器,其原型为: void nosound(void); 该函数没有入口和出口参数...