MSP430G2553单片机——利用蜂鸣器播放一首歌

发布时间:2022-12-05 23:00

利用MSP430G2553单片机和无源蜂鸣器播放一首歌,下面给出两种方案。
方案一:
播放《两只老虎》

#include
//音乐播放
//     by   wys
void P_Onclick(int n,int j);
//7个基本音的子函数
void jby_1(int s);
void jby_2(int s);
void jby_3(int s);
void jby_4(int s);
void jby_5(int s);
void jby_6(int s);
void jby_7(int s);
void main(void)
{
     WDTCTL = WDTPW + WDTHOLD;
     if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF)
     {
         while(1);
     }
     BCSCTL1=CALBC1_1MHZ;
     
     DCOCTL=CALDCO_1MHZ;   //校准时钟频率1MHZ
     
     //按照《两只老虎》的简谱对7个基本音进行调用
     
     jby_1(400);
     jby_2(400);
     jby_3(400);
     jby_1(400);
     _delay_cycles(3000); //每个完整的拍后接一个延时
     
     jby_1(400);
     jby_2(400);
     jby_3(400);
     jby_1(400);
    _delay_cycles(3000);
    
     jby_3(400);
     jby_4(400);
     jby_5(800);
    _delay_cycles(3000);
    
     jby_3(400);
     jby_4(400);
     jby_5(800);
     _delay_cycles(3000);
     
     jby_5(200);
     jby_6(200);
     jby_5(200);
     jby_4(200);
     jby_3(400);
     jby_1(400);
     _delay_cycles(3000);
     
     jby_5(300);
     jby_6(100);
     jby_5(300);
     jby_4(100);
     jby_3(400);
     jby_1(400);
     _delay_cycles(3000);
     
     jby_2(400);
     jby_5(400);
     jby_1(800);
     _delay_cycles(3000);
     
     jby_2(400);
     jby_5(400);
     jby_1(800);




}

//输入每个音调的频率对应的n和持续时间j

void P_Onclick(int n,int j)
{
    P1DIR |= BIT6;
                        ///延时每个音调的时长
                      for ( ;j>0;j--)                                  
                      {
                        volatile unsigned int i;                
                        P1OUT ^= BIT6;                          
                        i = n;                             
                        do
                        {
                            i--;                                // 自减操作
                            _NOP();                             // 空操作
                        }while (i != 0);                        // 标准的do……while语句,注意别漏掉了括号后面的分号
                      }
}
// do
void jby_1(int s)   
{
    P_Onclick(95,s);
}
//re
void jby_2(int s)  
{
    P_Onclick(85,s);
}

//mi
void jby_3(int s)   
{
    P_Onclick(75,s);
}

//fa
void jby_4(int s)  
{
    P_Onclick(71,s);
}

//sol
void jby_5(int s)   
{
    P_Onclick(63,s);
}

//la
void jby_6(int s)  
{
    P_Onclick(56,s);
}

//si
void jby_7(int s)    
{
    P_Onclick(50,s);
}

方案二:
循环播放7个基本音

///by:wys
#include "MSP430G2553.h"
//------------在main函数前提前声明函数-------------
void TA0_init(int n);                        //定时器A0的初始化函数                      //定时器A1的初始化函数
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;   // 关狗
    BCSCTL1 = CALBC1_1MHZ;              //设置DCO频率为1MHz,将作为MCLK和SMCLK使用
    DCOCTL = CALDCO_1MHZ;
    while(1){
        TA0_init(950);
        __delay_cycles(1000000);
        TA0_init(850);
        __delay_cycles(1000000);
        TA0_init(750);
        __delay_cycles(1000000);
        TA0_init(710);
        __delay_cycles(1000000);
        TA0_init(630);
        __delay_cycles(1000000);
        TA0_init(560);
        __delay_cycles(1000000);
        TA0_init(500);
        __delay_cycles(1000000);
    }
}
//*****************************************************************************************************
void TA0_init(int n)
{
    P1DIR |= BIT2;                                  //设置P1.2为音频输出
    P1SEL |= BIT2;
    TA0CCR0 = n;                            //设置PWM周期
    TA0CCTL1 = OUTMOD_7;                //CCR1工作在resett模式
    TA0CCR1 = n/2;                              //设置PWM占空比512/1024=0.5
    TA0CTL = TASSEL_2 + MC_1;           //Timer_ A的时钟源为SMCLK,工作模式为Up模式
}
//*****************************************************************************************************

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号