用单片机播放音乐的程序实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用单片机播放音乐的程序实现
殷松瑜 江苏商贸职业学院 226011
音、高音和超高音,四个八度共28个音符。MUSIC_TAB 自定义乐曲数据表,演奏乐曲时根据不同音符的数值,从B_ZQ_TAB 中找到定时时间初始值,送入定时器即可控制发音的音调。例如0xF8和0x89送到定时器,定时器产生中断输出的方波,人们就听到低音DO 的声音。
单片机发出不同频率的方波,人听起来就是不同音调的音乐。把这个音调数据表放在程序中,需要播音的时候,就从表中取出一个数据送到定时器,当定时器溢出中断的时候,再对输出引脚取反,那么,在扬声器中,即可听到下表中频率的声音。
这个表中每三个数字,说明了一个音符,它们分别代表;
第一个数字是音符的数值1234567之一,代表哆来咪发嗦拉西;
第二个数字是0123之一,代表低音、
1/4节拍与节拍码对照
1/8节拍与节拍码对照
3 编码
以李叔同大师的《送别》的前二小节来说明转换的方法。这部分的歌词是:“长亭外,古道边,芳草碧连天”;这部分的乐谱是:| 5 35 1 - | 6 1 5 - |512321|2---|。根据乐谱可以写出《送别》前二小节的数据表。本程序用这个数据表播放《送别》的前四小节。(如图2)
4 51单片机演奏乐曲的程序
SPK BIT P1.7 ;指定扬声器接口ORG 0000H LJMP START ORG 000BH LJMP T0_INT ORG 001BH LJMP T1_INT
;------------------------------------------------------------B_ZQ_TAB: ;定时半周期初始值数据表
DW 63625, 63833, 64019, 64104, 64260, 64400, 64524 ;低音区:1 2 3 4 5 6
7
DW 64580, 64685,64778, 64820, 64898, 64968, 65030 ;中音区:1 2 3 4 5 6 7
DW 65058, 65110, 65157, 65178, 65218, 65252, 65283 ;高音区:1 2 3 4 5 6 7
D W 65297 自定义 分别是音名、拍为单位)
嗦,中音, 4个1/8拍咪,中音, 2个1/8拍嗦,中音, 2个1/8拍哆,高音, 8个1/8拍啦,中音, 4个1/8拍哆,高音, 4个1/8拍 嗦,中音, 8个1/8拍嗦,中音, 4个1/8拍哆,中音, 2个1/8拍来,中音, 2个1/8拍咪,中音, 4个1/8拍来,中音, 2个1/8拍哆,中音, 2个1/8拍来,中音, 16个1/8结束标记
#11H ;T1, T0皆以200ms,为1/8拍
MOV DPTR, #MUSIC_TAB
;-------------------下面是从自定义乐曲数据表中读取三个字节
M_LOOP:CLR A MOVC A, @A+DPTR MOV R2, A INC DPTR CLR A MOVC A, @A+DPTR MOV B, A INC DPTR CLR A MOVC A, @A+DPTR JZ START
;-------------------下面是根据前两个字节,在半周期初值表中找
网络出版时间:2014-01-10 22:38
网络出版地址:/kcms/detail/11.3571.TN.20140110.2238.1074.html
MOV R3, A INC DPTR MOV 44H, DPL MOV 45H, DPH MOV A, #7MUL AB ADD A, R2JZ JI_SHI DEC A ADD A, ACC MOV R2, A MOV DPTR, #B_ZQ_TAB MOVC A, @A+DPTR MOV TH0, A MOV 41H, A MOV A, R2INC A MOVC A,
@A+DPTR MOV TL0, A MOV 40H, A SETB TR0JI_SHI:
MOV 42H, #100MOV 43H, #0MOV A, R3;用第三个字节控制时长CJNE A, 43H, $CLR TR0SETB SPK MOV DPL, 44H MOV DPH, 45H SJMP M_LOOP
;------------------------------------------------------------T0_INT:
MOV TL0, 40H MOV TH0, 41H CPL SPK RETI
;------------------------------------------------------------T1_INT:
MOV TL1, #24 ;(65536-1000) MOD 256
MOV TH1, #252 ;(65536-1000) / 256定时1ms@12MHz
DJNZ 42H, T1_END MOV 42H, #200 ;此数值越大,节奏越慢
INC 43H ;43H 单元每隔200ms,自动加一次一
T1_END:RETI
;============================================================
END 图1
图2