利用单片机奏乐是电子爱好者感兴趣的问题之一。本文从单片机的基本发音实验出发,介绍音乐程序设计原理并给出实例。
基本发音试验:声音频谱约在几十到几千赫兹,若能用程序控制单片机某口线的“高”“低”电平,则该口线产生一定频率的矩形波,接上喇叭即发出对应的声音;再用延时程序控制“高”“低”电平持续时间,即可改变输出频率从而改变音调。例如产生200Hz音频,周期为1/200秒即5ms,使P1.4高或低电平持续2.5ms(R3时间常数取2500/20=125即7DH),即可发出200Hz音调。可见单音符由确定频率对应确定的时间常数决定。
音符节拍的控制:用定时器T0控制节拍,送入不同初值产生不同定时。例如每分钟94拍的歌曲,一拍为0.64秒。因T0最大定时仅131ms,无法直接改变初值实现不同节拍,故用T0产生10ms时间基准,再设中断计数器,通过判别计数值来控制节拍长短。例如1/4拍音符定时0.16秒、时间常数为16(10H);3拍音符定时1.92秒、时间常数为192(C0H)。
将每音符的时间常数与节拍常数作为一组,按顺序把整首乐曲所有常数排成一表,由查表程序依次取出、产生音符并控制节奏即可演奏。结束符与休止符可分别用码00H与FFH表示——查表结果为00H则曲终,为FFH则停顿;为产生手弹节奏感,可在两个相同音符间插入一个时间单位、频率略异的音符。
文中给出可在TD-III学习机上演奏“八月桂花遍地开”(C调、94拍/分)的完整汇编程序,含查表演奏循环MUSIC0~MUSIC6、延时DEL与DAT乐曲数据表;并提供另一版“八月桂花香”发声程序。硬件上只需将音箱插头前端接P1.0、地接单片机地即可发声。读者可自行按给定的表把陌生曲子翻译成码表输入机器,程序不变。
