发布时间: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模式
}
//*****************************************************************************************************