msp430单片机,连接一个无源蜂鸣器,播放蜂鸣器音乐,天空之城。
适用于所有msp430单片机。
无源蜂鸣器,接单片机P1.5,使用vcc3.3v供电。
//第一步
//首先修改music0 的变量,
//低音下面加点
//中音不加点
//高音上面加点
//根据简朴的符号写出对应C调音
//第二步 修改music0_JP数组 这个数组和上一个数组对应 就是每一个音 响多长时间
//普通无点是延时 7 即是800ms
//如果音 下有一条下划线,延时 4
//如果音 下有两条下划线,延时2
//如果音 后加一个点 延时12
//如果音后加一条线 延时16
//如果音后加2条线 延时20
//当然 觉得不好听 可以适当修改延时的值
/* ****************************************** */
// ******** 音乐0 天空之城
/* ****************************************** */
//以下是《天空之城》简谱 //每行对应一小节音符
unsigned int music0[]=
{ Z6,Z7,/**/H1,Z7,H1,H3,/**/Z7,Z3,Z3, /**/Z6,Z5,Z6,H1,/**/Z5,Z3,Z3, /**/Z4,Z3,Z4,H1,
Z3,H1,H1,H1,/**/Z7,Z4,Z4,Z7,/**/Z7,Z6,Z7, /**/H1,Z7,H1,H3,/**/Z7,Z3,Z3, /**/Z6,Z5,Z6,H1,
Z5, Z3,/**/Z4,H1,Z7,H1,/**/H2,H2,H2,H1,/**/H1,Z6,Z7,Z5,/**/Z6,H1,H2, /**/H3,H2,H3,H5,
H2,Z5,Z5, /**/H1,Z7,H1,H3,/**/H3, /**/Z6,H1,Z7,H2,/**/H1,Z5,Z5, /**/H4,H3,H2,H1,
H3, /**/Z3,H3, /**/H6,H5,H5, /**/H3,H2,H1,H1,/**/H2,H1,H2,H5,/**/H3,H3,
H6,H5, /**/H3,H2,H1,H1,/**/H2,H1,H2,Z7,/**/Z6,Z6,Z7, /**/Z6,0xff}; //以0xff作为音符的结束标志
//以下是简谱中每个音符的节拍
//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位
unsigned char music0_JP[ ]=
{ 4,4, /**/12,4,8,8, /**/20,4,4, /**/12,4,8,8, /**/20,4,4, /**/12,4,4,12,
20,4,4,4, /**/12,4,8,8, /**/20,4,4, /**/12,4,8,8, /**/20,4,4, /**/12,4,8,8,
32, 4, /**/8,4,6,8, /**/4,4,4,16, /**/8,4,6,8, /**/24,4,4, /**/12,4,8,8,
24,4,4, /**/4,4,8,8, /**/32, /**/4,8,8,6, /**/12,4,16, /**/8,8,8,8,
30, /**/20,8, /**/16,8,8, /**/4,4,16,8, /**/8,4,4,8, /**/20,8,
16,16, /**/4,20,8, /**/8,4,4,8, /**/20,4,4, /**/32};
/* ****************************************** */
/* ******** 延时100ms 控制音乐节拍 */
/* ****************************************** */
void delay1()
{
delay_ms( 100 );
}
int main( void )
{
unsigned char u = 0, t = 0;
WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */
P1DIR |= BIT5; /* P1.0 output */
_EINT();
while ( 1 )
{
u = 0, t = 0;
while ( music0[u] != 0xff ) /* 只要没有读到结束标志就继续播放 */
{
CCR0 = SYSCLK / music0[u] / 2; /*选一个频率 */
for ( t = 0; t < music0_JP[u]; t++ ) /* 控制节拍数 */
delay1(); /* 延时1个节拍单位 */
TACTL = TASSEL_2 + MC_0; /* 关闭 */
u++; /* 播放下一个音符 */
}
}
}
/* Timer A0 interrupt service routine */
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A( void )
{
P1OUT ^= BIT5;
}
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2