欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-04 17:47:45
...

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

#include<MSP430G2553.h>
//音乐播放
//     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模式
}
//*****************************************************************************************************

相关标签: 单片机 单片机