社区导航

 

搜索
查看: 348|回复: 2

[分享] MSP430G2 LaunchPad,蜂鸣器演奏音乐的方法

[复制链接]

4328

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2020-5-11 21:53 | 显示全部楼层 |阅读模式
本帖最后由 Jacktang 于 2020-5-11 21:56 编辑

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


回复

使用道具 举报

1万

TA的帖子

133

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2020-5-13 07:54 | 显示全部楼层

谢谢楼主分享

玩板看这里:

http://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!


回复

使用道具 举报

2393

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2020-5-13 11:26 | 显示全部楼层

不错的分享啊


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/8 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

词云| Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-7-10 15:25 , Processed in 0.137184 second(s), 23 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表