单片机播放音乐.doc_第1页
单片机播放音乐.doc_第2页
单片机播放音乐.doc_第3页
单片机播放音乐.doc_第4页
单片机播放音乐.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机播放音乐以8051单片机为例,任选两个定时器/计数器T0,T1中的一个,设为定时方式1。利用定时器产生各音符对应频率的方波,有P1.0口驱动喇叭发音。D200为200ms延时程序,以每拍800ms为例,一拍需循环调用D200延时子程序四次。同理,半拍,3/4拍,1/4拍都可用同样的方法实现。1,2,3,4,5,6,7各音符的频率依次为524,588,660,698,784,880,988(HZ),因此可算出各音符对定时器的初始值。结果依次为FE25H,FE57H,FE84H,FE98H,FEC0H,FEE3H,FF01H。在电脑上用Proteus软件仿真非常方便。以“飘雪”这首歌为例,汇编语言程序如下: ORG 0000H LJMP START ORG 001BH MOV TH1,R1 MOV TL1,R0 CPL P1.0 RETI ORG 0100HSTART:MOV TMOD,#10HMOV IE,#88H MOV DPTR,#TABLOOP: CLR A MOVC A,A+DPTR MOV R1,A INC DPTR CLR A MOVC A,A+DPTR MOV R0,A ORL A,R1 JZ NEXT0 MOV A,R0 ANL A,R1 CJNE A,#0FFH,NEXT SJMP STARTNEXT: MOV TH1,R1 MOV TL1,R0 SETB TR1 SJMP NEXT1NEXT0: CLR TR1NEXT1: CLR A INC DPTR MOVC A,A+DPTR MOV R2,ALOOP1: LCALL D200 DJNZ R2,LOOP1 INC DPTR AJMP LOOPD200: MOV R4,#81HD200B: MOV A,#0FFHD200A: DEC A JNZ D200A DEC R4 CJNE R4,#00H,D200B RETTAB: DB 0FDH,08H,02H,0FDH,80H,02H,0FDH,0C6H,02H,0FEH,25H,02H,0FEH,84H,02H,0FEH,0C0H,02H,0FEH,0E3H,02H,0FFH,10H,02H DB 0FFH,42H,02H,0FEH,0E3H,04H,0FDH,80H,02H,0FDH,0C6H,04H,0FFH,42H,02H,0FDH,80H,02H DB 0FDH,0C6H,02H,0FDH,80H,02H,0FDH,0C6H,02H,0FEH,25H,02H,0FEH,98H,02H,0FEH,84H,02H,0FEH,0E3H,02H,0FEH,0C0H,02H DB 0FFH,42H,02H,0FEH,98H,04H,0FFH,60H,02H,0FFH,42H,04H,0FFH,10H,02H,0FEH,98H,02H DB 0FEH,0E3H,02H,0FFH,01H,02H,0FEH,0C0H,02H,0FEH,0E3H,02H,0FEH,98H,02H,0FEH,0C0H,02H,0FEH,84H,04H DB 0FEH,84H,04H,0FEH,57H,02H,0FEH,84H,02H,0FEH,25H,04H,00H,00H,04H DB 0FEH,57H,04H,0FEH,0C0H,02H,0FEH,57H,02H,0FEH,84H,04H,0FEH,57H,04H DB 0FEH,25H,04H,00H,00H,04H,0FEH,57H,04H,0FDH,0C6H,04H DB 0FEH,07H,04H,00H,00H,04H,0FEH,25H,04H,0FEH,57H,04H DB 0FEH,84H,02H,0FEH,0C0H,02H,0FEH,0E3H,01H,0FFH,10H,03H,0FEH,0C0H,04H,0FEH,57H,02H,0FEH,84H,02H DB 0FEH,57H,02H,0FEH,57H,02H,0FEH,25H,02H,0FEH,57H,02H,0FEH,84H,04H,00H,00H,04H DB 0FEH,84H,02H,0FEH,0C0H,02H,0FEH,0E3H,01H,0FFH,10H,03H,0FEH,0C0H,04H,0FEH,57H,02H,0FEH,84H,02H DB 0FEH,57H,02H,0FEH,84H,02H,0FEH,25H,02H,0FEH,57H,01H,0FEH,25H,01H,0FEH,25H,04H,00H,00H,04H DB 0FEH,57H,02H,0FEH,84H,02H,0FEH,57H,02H,0FEH,25H,02H,0FEH,57H,04H,0FEH,25H,02H,0FEH,57H,02H DB 0FEH,84H,01H,0FEH,0C0H,03H,0FEH,84H,02H,0FEH,57H,02H,0FEH,84H,04,0FEH,84H,02H,0FEH,0C0H,02H DB 0FEH,0E3H,04H,0FEH,0E3H,02H,0FEH,0C0H,02H,0FEH,84H,04,0FEH,84H,02H,0FEH,0C0H,02H DB 0FEH,57H,01H,0FEH,84H,03H,0FEH,57H,01H,0FEH,25H,01H,0FEH,25H,02H,0FEH,57H,04H,00H,00H,04H DB 0FEH,84H,02H,0FEH,0C0H,02H,0FEH,0E3H,01H,0FFH,10H,03H,0FEH,0C0H,04H,0FEH,57H,02H,0FEH,84H,02H DB 0FEH,57H,02H,0FEH,84H,01H,0FEH,57H,01H,0FEH,25H,02H,0FEH,57H,02H,0FEH,84H,04H,00H,00H,04H DB 0FEH,84H,02H,0FEH,0C0H,02H,0FEH,0E3H,01H,0FFH,10H,03H,0FEH,0C0H,04H,0FEH,57H,02H,0FEH,84H,02H DB 0FEH,57H,02H,0FEH,84H,02H,0FEH,25H,02H,0FEH,57H,01H,0FEH,25H,01H,0FEH,25H,04H,00H,00H,04H DB 0FEH,57H,01H,0FEH,84H,03H,0FEH,57H,02H,0FEH,25H,02H,0FEH,57H,04H,0FEH,25H,02H,0FEH,57H,02H DB 0FEH,84H,01H,0FEH,0C0H,03H,0FEH,84H,02H,0FEH,57H,02H,0FEH,84H,04,0FEH,84H,02H,0FEH,0C0H,02H DB 0FEH,0E3H,04H,0FEH,0E3H,02H,0FEH,0C0H,02H,0FEH,84H,01,0FEH,84H,03,0FEH,84H,02H,0FEH,0C0H,02H DB 0FEH,57H,01H,0FEH,84H,03H,0FEH,57H,02H,0FEH,25H,02H,0FEH,57H,04H,00H,00H,04H DB 0FEH,84H,02H,0FEH,0C0H,02H,0FEH,0E3H,02H,0FFH,10H,02H,0FFH,29H,04H,0FFH,42H,04H DB 0FFH,29H,02H,0FFH,10H,01H,0FFH,10H,01H,0FFH,10H,04H,00H,00H,04H,0FFH,29H,02H,0FFH,10H,02H DB 0FEH,84H,04H,0FEH,84H,02H,0FEH,0C0H,02H,0FEH,57H,02H,0FEH,84H,02H,0FEH,84H,02H,0FEH,57H,01H,0FEH,25H,01H DB 0FEH,25H,02H,0FEH,25H,02H,0FEH,25H,04H,00H,00H,04H DB 0FFH,0FFH51单片机播放音乐以下为51单片机播放音乐简谱的函数库:/* SOUND PLAY FOR 51MCU COPYRIGHT (c) 2005 BY JJJ. - ALL RIGHTS RESERVED - File Name: SoundPlay.h Author: Jiang Jian Jun Created: 2005/5/16 Modified:NO Revision: 1.0 */*说明*曲谱存贮格式 unsigned char code MusicName音高,音长,音高,音长., 0,0;末尾:0,0 表示结束(Important)音高由三位数字组成:个位是表示 17 这七个音符 十位是表示音符所在的音区:1-低音,2-中音,3-高音;百位表示这个音符是否要升半音: 0-不升,1-升半音。音长最多由三位数字组成: 个位表示音符的时值,其对应关系是: |数值(n): |0 |1 |2 |3 | 4 | 5 | 6 |几分音符: |1 |2 |4 |8 |16 |32 |64 音符=2n十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音百位是符点位: 0-无符点,1-有符点调用演奏子程序的格式Play(乐曲名,调号,升降八度,演奏速度);|乐曲名 : 要播放的乐曲指针,结尾以(0,0)结束;|调号(0-11) :是指乐曲升多少个半音演奏;|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;|演奏速度(1-12000):值越大速度越快;*/#ifndef _SOUNDPLAY_H_REVISION_FIRST_#define _SOUNDPLAY_H_REVISION_FIRST_#include /*#define SYSTEM_OSC 11059200/12000000/定义晶振频率12000000HZ#define SOUND_SPACE 4/5 /定义普通音符演奏的长度分率,/每4分音符间隔sbit BeepIO = P26;/定义输出管脚unsigned int code FreTab12 = 262,277,294,311,330,349,369,392,415,440,466,494 ; /原始频率表unsigned char code SignTab7 = 0,2,4,5,7,9,11 ; /17在频率表中的位置unsigned char code LengthTab7= 1,2,4,8,16,32,64 ;unsigned char Sound_Temp_TH0,Sound_Temp_TL0;/音符定时器初值暂存 unsigned char Sound_Temp_TH1,Sound_Temp_TL1;/音长定时器初值暂存/*void InitialSound(void)BeepIO = 1;Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;/ 计算TL1应装入的初值 (10ms的初装值)Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;/ 计算TH1应装入的初值 TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TMOD |= 0x11;ET0 = 1;ET1 = 0;TR0 = 0;TR1 = 0;EA = 1;void BeepTimer0(void) interrupt 1/音符发生中断BeepIO = !BeepIO;TH0 = Sound_Temp_TH0;TL0 = Sound_Temp_TL0;/*void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)unsigned int NewFreTab12;/新的频率表unsigned char i,j;unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;for(i=0;i 11)j = j-12;NewFreTabi = FreTabj*2;elseNewFreTabi = FreTabj;if(Octachord = 1)NewFreTabi=2;else if(Octachord = 3)NewFreTabi=2;SoundLength = 0;while(SoundSoundLength != 0x00)/计算歌曲长度SoundLength+=2;Point = 0;Tone = SoundPoint;Length = SoundPoint+1; / 读出第一个音符和时时值LDiv0 = 12000/Speed;/ 算出1分音符的长度(几个10ms) LDiv4 = LDiv0/4; / 算出4分音符的长度 LDiv4 = LDiv4-LDiv4*SOUND_SPACE; / 普通音最长间隔标准 TR0 = 0;TR1 = 1;while(Point = 2; /低音 if (SM=3) CurrentFre = 2; /高音Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);/计算计数器初值Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%256; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0 + 12; /加12是对中断延时的补偿 SLen=LengthTabLength%10; /算出是几分音符XG=Length/10%10; /算出音符类型(0普通1连音2顿音) FD=Length/100;LDiv=LDiv0/SLen; /算出连音音符演奏的长度(多少个10ms)if (FD=1) LDiv=LDiv+LDiv/2;if(XG!=1)if(XG=0) /算出普通音符的演奏长度 if (SLen0;i-) /发规定长度的音 while(TF1=0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;if(LDiv2!=0)TR0=0; BeepIO=1;for(i=LDiv2;i0;i-) /音符间的间隔while(TF1=0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;Point+=2; Tone=SoundPoint;Length=SoundPoint+1;BeepIO = 1;/*#endif附录:/挥着翅膀的女孩unsigned char code Music_Girl= 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03, 0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03, 0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,&nbs; 0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03, 0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E, 0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02, 0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02, 0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00;/同一首歌unsigned char code Music_Same= 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03, 0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02, 0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66, 0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00, 0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03, 0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03, 0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03, 0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C, 0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03, 0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02,&nbp; 0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03, 0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70, 0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66, 0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02, 0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C, 0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66, 0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00, 0x00,0x00 ;/两只蝴蝶 unsigned char code Music_Two = 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01, 0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,&nsp; 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x16, 0x1A,0x03, 0x1A,0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论