打印

[MSP430] 蜂鸣器演唱音乐

[复制链接]
499|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mnmjmkml|  楼主 | 2019-2-27 18:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 mnmjmkml 于 2019-2-28 18:58 编辑

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

#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--;
}

相关帖子

沙发
zhangmangui| | 2019-2-27 22:40 | 只看该作者
最好编辑一下    看着比较乱

使用特权

评论回复
板凳
mnmjmkml|  楼主 | 2019-2-28 18:59 | 只看该作者
zhangmangui 发表于 2019-2-27 22:40
最好编辑一下    看着比较乱

已经编辑好了,实在抱歉,发的比较着急。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

41

帖子

0

粉丝