- #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 enabled
- CCR0 = 10000; //10ms
- TACTL = 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--;
- }