单片机音乐代码怎么写

1.单片机音乐代码#include "reg51.h" #define uint unsigned int #define uchar unsigned char uchar * TABLE ; code uint TABLE1 [15]={64260,64400,64524,64580, 64684,64777,64820,64898, 64968,65030,65058,65110, 65157,65178,65217}; code uchar SONG [ ]={ //1. 迟来的爱 }; code uchar SONG1 [ ]={ //2.两只蝴蝶 }; code uchar SONG3 [ ]={ //4.一个师傅三个徒弟 }; uchar hjsz; uchar ljsz; uchar jpm; uchar yfm; uchar t0 =0; uint i=0; sbit Speaker =P1^0; uint k; void Delay1() { for ( k=0;k<20000;k++); } void Lignt( ) { uchar t; for(t=0;t<10;t++) { P2=0xff; Delay1(); P2=0x00; Delay1(); } } void Lignt1( ) { P2=0xaa; Delay1(); P2=0x55; Delay1(); } void Delay(uchar t0)//延时 { while(t0--) //决定节拍 Lignt1(); } void Delay2(uchar w0)//延时 { while(w0--) //决定节拍 Lignt(); } void T0Int() interrupt 1//TIMER0 { TL0 = ljsz; TH0 = hjsz; Speaker=!Speaker; } void ExtInt0() interrupt 0//INT0 { if(t0>10) t0=0; i=0; // 全局变量,指向歌谱的第1个 switch(t0++) { case 0 : TABLE=SONG;break; //选择第1首 case 1 : TABLE=SONG1;break;//选择第2首 case 2 : TABLE=SONG2;break;//选择第3首 case 3 : TABLE=SONG3;break;//选择第4首 case 4 : TABLE=SONG4;break;//选择第5首 case 5 : TABLE=SONG5;break;//选择第6首 case 6 : TABLE=SONG6;break;//选择第7首 case 7 : TABLE=SONG7;break;//选择第8首 case 8 : TABLE=SONG8;break;//选择第9首 case 9 : TABLE=SONG9;break;//选择第10首 } } void songsing()//发音程序 { i=0; while(TABLE[i]) { jpm=TABLE[i]&0x0f; //节拍值 yfm=(TABLE[i]>>0x04)&0x0f;//简谱值 if(yfm) //简谱为1,取计数值 { yfm=yfm-1; hjsz=(uchar)(TABLE1[yfm]>>0x08);//取计数值高字节 TH0 = hjsz; ljsz=(uchar)(TABLE1[yfm]); //取计数值低字节 TL0 = ljsz; TR0 = 1; //启动TIMER0 } else TR0 = 0; //简谱为0,不发音 Delay(jpm); //节拍延时 i++; } } void main(void) { TMOD =0X01;//设TIMER0在MODE1 TCON =0X01;//外部中断INT0,下降沿触发 IE =0x83;//开中断(INT0,TIMER0) IP =0x00;//设置中断优先级 TABLE=SONG0; while(1) { Lignt( ); songsing();//调用发音程序 TR0 = 0;//停止TIMER0 Delay2(1); TABLE=SONG0;// 更改歌曲0 songsing(); } } 。
2.单片机歌曲程序源代码/************************************************************************ [文件名] C51音乐程序(八月桂花) [功能] 通过单片机演奏音乐 /**********************************************************************/#include #include //本例采用89C52,晶振为11.0592MHZ//关于如何编制音乐代码,其实十分简单,各位可以看以下代码.//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;//所以拿出谱子,试探编吧! unsigned char n=0; //n为节拍常数变量 unsigned char code music_tab[] ={0x18, 0x30, 0x1C , 0x10,//格式为: 频率常数,节拍常数,频率常数,节拍常数,0x20, 0x40, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,0x20, 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,0x2B, 0x20, 0x30 , 0x20,0x2B, 0x40, 0x20 , 0x15,0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C , 0x20,0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00 }; void int0() interrupt 1 //采用中断0 控制节拍 { TH0=0xd8; TL0=0xef; n--; } void delay (unsigned char m) //控制频率延时 { unsigned i=3*m; while(--i); } void delayms(unsigned char a) //豪秒延时子程序 { while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!} void main() { unsigned char p,m; //m为频率常数变量 unsigned char i=0; TMOD&=0x0f; TMOD|=0x01; TH0=0xd8;TL0=0xef; IE=0x82; play: while(1) { a: p=music_tab[i]; if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍 else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符 else {m=music_tab[i++], n=music_tab[i++];} //取频率常数 和 节拍常数 TR0=1; //开定时器1 while(n!=0) P3=~P3,delay(m); //等待节拍完成,通过P1口输出音频(可多声道哦!) TR0=0; //关定时器1 } } 你的答案 。