字号:大 中 小 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)来实现, 然后就可用