用单片机播放音乐的程序实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档