预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

单片机音乐的编程我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的高电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。例如,要产生200HZ的音频信号,200HZ音频的变化周期为1/200秒,即5ms。这样,当P2.5的高电平或低电平的持续时间为2.5ms时就能发出200HZ的音调。乐曲中,每一音符对应着确定的频率,我们将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就可以实现演奏效果。此外,结束符和体止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz,相当于1/4音程,很容易听出来,对低音部分影响不大。一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表1中所给的定时初值就是考虑中断响应后的定时常数。另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示音符频率(HZ)简谱码音符频率(HZ)简谱码(T值)低1DO26263628#4FA#74064860#1DO#27763731中5SO78464898低2RE29463835#5SO#83164934#2RE#31163928中6LA88064968低3M33064021#693264994低4FA34964103中7SI98865030#4FA#37064185高1DO104665058低5SO39264260#1DO#110965085#5SO#41564331高2RE117565110低6LA44064400#2RE#124565134#646664463高3M131865157低7SI49464524高4FA139765178中1DO52364580#4FA#148065198#1DO#55464633高5SO156865217中2RE58764684#5SO#166165235#2RE#62264732高6LA176065252中3M65964777#6186565268中4FA69864820高7SI196765283DW64260,64400,64524,64580DW64684,64777,64820,648982、音乐的音拍,一个节拍为单位(C调)拍数为1/8拍(0.10s)~8拍(6.40s)编写乐曲程序可以分四个步骤:第一步,为演奏的乐曲定义一个频率表和一个节拍时间表。频率表中的数据可以从表中查到,节拍时间表的数据是延迟时间的倍数;第二步,分别将两个表中的偏移地址送入两个指针寄存器;第三步,分别从两个表中取出频率值和音符的持续时间值,送入相应的寄存器中,供调用通用发声程序使用;第四步,调用通用发声程序发出音调。ORG0000HAJMPMAINORG000BHJMPTIM0ORG0030HMAIN:;主程序MOVTMOD,#01H;设定时方式MOVIE,#82H;开中断START0:MOV30H,#00H;NEXT:MOVA,30HMOVDPTR,#TABLE;节拍表格,MOVCA,@A+DPTR;查表取音调和节拍MOVR2,A;JZEND0;为零,不进行处理.ANLA,#0FH;分离高低位MOVR5,A;将节拍存入R5MOVA,R2;分离高低位SWAPA;分离高低位ANLA,#0FH;分离高低位JNZSING;根据音调决定是否演奏.CLRTR0JMPD1SING:DECA;a中放的是音阶位置.MOV22H,A;将音调存入22H.RLA;乘2操作指向高字节MOVDPTR,#TABLE1MOVCA,@A+DPTR;根据音调决定定时器初值.MOVTH0,A;放入TH0MOV21H,AMOVA,22HRLAINCA;乘2后加一操作指向低字节MOVCA,@A+DPTRMOVTL0,A;放入TL0MOV20H,ASETBTR0;启动定时D1:CALLDELAYINC30HJMPNEXTEND0:CLRTR0JMPSTART0TIM0:PUSHACC;定时器中断服务程序PUSHPSWMOVTL0,20H;重赋初值.MOVTH0,21HCPLP1.4POPPSWPOPACCRETIDEL