蜂鸣器演唱音乐
来源:互联网 发布时间:2018-08-02 分享至微信


修改自51单片机,launchpad的P10连接蜂鸣器,蜂鸣器演奏《八月桂花》



1 #include "msp430g2553.h"


2


3 unsigned char n=0; //n为节拍常数变量


4 unsigned char music_tab[] ={


5 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,


6 0x20, 0x40, 0x1C , 0x10,


7 0x18, 0x10, 0x20 , 0x10,


8 0x1C, 0x10, 0x18 , 0x40,


9 0x1C, 0x20, 0x20 , 0x20,


10 0x1C, 0x20, 0x18 , 0x20,


11 0x20, 0x80, 0xFF , 0x20,


12 0x30, 0x1C, 0x10 , 0x18,


13 0x20, 0x15, 0x20 , 0x1C,


14 0x20, 0x20, 0x20 , 0x26,


15 0x40, 0x20, 0x20 , 0x2B,


16 0x20, 0x26, 0x20 , 0x20,


17 0x20, 0x30, 0x80 , 0xFF,


18 0x20, 0x20, 0x1C , 0x10,


19 0x18, 0x10, 0x20 , 0x20,


20 0x26, 0x20, 0x2B , 0x20,


21 0x30, 0x20, 0x2B , 0x40,


22 0x20, 0x20, 0x1C , 0x10,


23 0x18, 0x10, 0x20 , 0x20,


24 0x26, 0x20, 0x2B , 0x20,


25 0x30, 0x20, 0x2B , 0x40,


26 0x20, 0x30, 0x1C , 0x10,


27 0x18, 0x20, 0x15 , 0x20,


28 0x1C, 0x20, 0x20 , 0x20,


29 0x26, 0x40, 0x20 , 0x20,


30 0x2B, 0x20, 0x26 , 0x20,


31 0x20, 0x20, 0x30 , 0x80,


32 0x20, 0x30, 0x1C , 0x10,


33 0x20, 0x10, 0x1C , 0x10,


34 0x20, 0x20, 0x26 , 0x20,


35 0x2B, 0x20, 0x30 , 0x20,


36 0x2B, 0x40, 0x20 , 0x15,


37 0x1F, 0x05, 0x20 , 0x10,


38 0x1C, 0x10, 0x20 , 0x20,


39 0x26, 0x20, 0x2B , 0x20,


40 0x30, 0x20, 0x2B , 0x40,


41 0x20, 0x30, 0x1C , 0x10,


42 0x18, 0x20, 0x15 , 0x20,


43 0x1C, 0x20, 0x20 , 0x20,


44 0x26, 0x40, 0x20 , 0x20,


45 0x2B, 0x20, 0x26 , 0x20,


46 0x20, 0x20, 0x30 , 0x30,


47 0x20, 0x30, 0x1C , 0x10,


48 0x18, 0x40, 0x1C , 0x20,


49 0x20, 0x20, 0x26 , 0x40,


50 0x13, 0x60, 0x18 , 0x20,


51 0x15, 0x40, 0x13 , 0x40,


52 0x18, 0x80, 0x00


53 };


54


55


56 void delay (unsigned char m) //控制频率延时


57 {


58 unsigned i=3*m;


59 while(--i);


60 }


61


62 void delaymms(unsigned int a) //毫秒延时子程序


63 {


64 unsigned int t;


65 while(--a)


66 for(t=0;t<200;t++);


67 }


68


69 void main(void)


70 {


71 unsigned char p,m; //m为频率常数变量


72 unsigned char i=0;


73


74 WDTCTL = WDTPW + WDTHOLD; // 停止看门狗


75


76 P1DIR = 0Xff;


77 P2DIR = 0Xff;


78


79 CCTL0 |= CCIE; // CCR0 interrupt enabled


80 CCR0 = 10000; //10ms


81 TACTL = TASSEL_2 ; // SMCLK, contmode


82 _EINT();


83


84


85 while(1)


86 {


87 p=music_tab[i];


88 if(p==0x00)


89 {


90 i=0;


91 delaymms(1000);


92 continue;;


93 } //如果碰到结束符,延时1秒,回到开始再来一遍


94 else if(p==0xff)


95 {


96 i=i+1;


97 delaymms(100);


98 TACTL &=~MC_1;


99 continue;


100 } //若碰到休止符,延时100ms,继续取下一音符


101 else


102 {


103 m=music_tab[i++];


104 n=music_tab[i++];


105 } //取频率常数 和 节拍常数


106


107 TACTL |= MC_1+TACLR; //开定时器


108 while(n!=0) P1OUT ^= BIT0,delay(m); //等待节拍完成


109 TACTL &=~MC_1; //关定时器


110 }


111


112 }


113


114


115 // Timer A0 interrupt service routine


116 #pragma vector=TIMER0_A0_VECTOR


117 __interrupt void Timer_A (void)


118 {


119 n--;


120 }





[ 新闻来源:互联网,更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj]
存入云盘 收藏
举报
全部评论

暂无评论哦,快来评论一下吧!