#include "msp430g2553.h"
unsigned char n=0; //n为节拍常数变量
unsigned char 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 delay (unsigned char m)//控制频率延时
{unsigned i=3*m;while(--i);
}
void delaymms(unsigned int a) //毫秒延时子程序
{unsigned int t;while(--a)for(t=0;t<200;t++);
}
void main(void)
{unsigned char p,m;//m为频率常数变量unsigned char i=0;WDTCTL = WDTPW + WDTHOLD;// 停止看门狗P1DIR = 0Xff;P2DIR = 0Xff;CCTL0 |= CCIE;// CCR0 interrupt enabledCCR0 = 10000;//10msTACTL = TASSEL_2 ;// SMCLK, contmode_EINT();while(1){p=music_tab[i];if(p==0x00){i=0;delaymms(1000);continue;;}//如果碰到结束符,延时1秒,回到开始再来一遍else if(p==0xff){i=i+1;delaymms(100);TACTL &=~MC_1;continue;} //若碰到休止符,延时100ms,继续取下一音符else{m=music_tab[i++];n=music_tab[i++];} //取频率常数 和 节拍常数TACTL |= MC_1+TACLR;//开定时器while(n!=0) P1OUT ^= BIT0,delay(m);//等待节拍完成TACTL &=~MC_1;//关定时器}
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{n--;
}
Susan Yang:
谢谢分享! 回头板子找出来试试
gaoyang9992006:
回复 Susan Yang:
这个例子,是我在21论坛看到转来的。刚才测试了一下,难听死了。我觉得是这个程序还有歌曲编码方式的问题。我准备重新做一个。等完成了再来分享。
灰小子:
回复 gaoyang9992006:
网上有一个蜂鸣器音乐代码生成的软件工具,你可以试试。
TI中文支持网



