msp430g2553单片机控制蜂鸣器发出音乐的程序

msp430g2553单片机控制蜂鸣器发出音乐的程序,第1张

看起来数组应该是音乐数据,其中包括四种数据,就是休止符(每个100毫秒)、歌曲结束符、音阶(给出的迹枣胡是蜂鸣器的震荡周期)、一个音阶持续的时间长度。如果你的晶振是12MHz,按照定时器中断给Count加一来看,音阶持续的时间应该是以10毫秒为单位。 Play_Song函数要求给岩激出参数i我的看法是这个i是指要播放第几段乐曲,i*217表示每段乐曲都是217个字节。本例中95数组只给出217个字节,所以只有一段乐曲,播放时需要给出参数i=0. if ( Temp1 == 0xFF ) //休止符 { TR0 = 0; Delay_xMs(100); } 所以休止符每个固定是100毫秒。 如果读到第一个不是休止符或者结束符的字节那就是音阶,而下一个字节就是这个音阶的长度或者说节拍 while(1) { FMQ = ~FMQ; Delay_xMs(Temp1); if ( Temp2 == Count ) { Count = 0; break; } } 这一段是说,如果当前音阶的时间(Temp2次定时器中断,由Count计时)还没完,就每隔Temp1毫秒震动一次蜂鸣器,就形成一个震动频率,这段时间就发出一定音调的乐音不过我也有疑惑,震荡周期如果以毫秒为单位恐怕只能发出次声波,所以以上对有关Delay_xMs函数时间的估算都可能有问题907还得看姿拦Delay_xMs函数的具体定义才行。

你的要求说的不是太清,没有说明当哪个IO口输入低时驱动蜂鸣器,也没有说明是高还是低电平驱动蜂鸣器。我这个程序的作用是p30输入低时野配,p67输出高,否则p67输出低,不合适的话,你只需稍微改陪拍下,即可满足你的要求

#include <msp430x14x.h>//声明库

void main(void) //主函数

{

WDTCTL=WDTPW+WDTHOLD//关掉看门狗

P6DIR |=0x80 //设定P67为颂乱指输出

P3DIR &=0xfe //设定P30为输输入

while(1) {

if(P3IN&0X01==0)

P6OUT|=0x80

else

P6OUT&=0x7f

}

}

和定时器A一样用:)

给端程序段祥仿先看看:

/握纤*********************************************************

程序功能:用固定频率的方波驱动蜂鸣器,共16种音调;在蜂鸣器

发出不同音调的同时,LED发光以二进制数字形式指示

当前音调的编号(1~16)

----------------------------------------------------------

测试说明:聆听蜂鸣器发声的音调变化。

**********************************************************/

#include

"MSP430x14x.h"

#include

"CLK.h"

#include

"LCD1602.h"

unsigned

char

step

=

0xff

void

main()

{

//

Stop

watchdog

timer

to

prevent

time

out

reset

WDTCTL

=

WDTPW

+

WDTHOLD

Init_CLK()//8Mhz起震

BCSCTL2

|=SELM_2+SELS//MCLK和SMCLK选择高频晶振

Init_LCD()

LCD_set_position(0x00)

LCD_prints("BUZZER

PLAYER:")

LCD_set_position(0x40)

LCD_prints("Current:")

TACCTL0

|=CCIE//使能比较中断

TACTL=TASSEL_2+ID_3//TimerA选择SMCLK,8分频后为1MHz

TBCCTL0

|=CCIE

TBCTL=TASSEL_1+ID_3+MC_1//时钟源ACLK/8,up

mode

TBCCR0=4096-1//(32768/8),周期为宴圆1秒

P3DIR

|=BIT7

P3OUT

|=BIT7

_EINT()

LPM1

}

#pragma

vector=TIMERA0_VECTOR

__interrupt

void

Timer_A

(void)//蜂鸣器发声

{

P3OUT

^=BIT7

}

#pragma

vector=TIMERB0_VECTOR

__interrupt

void

Timer_B(void)//改变频率

{

if(step==0xff)

TACTL

|=MC_1

step++

LCD_set_position(0x48)LCD_printc(step+48)

switch(step)

{

case

0:

TACCR0

=

5000break

//

100Hz

case

1:

TACCR0

=

2500

break

//

200Hz

case

2:

TACCR0

=

1250

break

//

400Hz

case

3:

TACCR0

=

625

break

//

800Hz

case

4:

TACCR0

=

500

break

//

1KHz

case

5:

TACCR0

=

250

break

//

2KHz

case

6:

TACCR0

=

167

break

//

3KHz

case

7:

TACCR0

=

125

break

//

4KHz

case

8:

TACCR0

=

100

break

//

5KHz

case

9:

TACCR0

=

83

break

//

6KHz

case

10:

TACCR0

=

71

break

//

7KHz

case

11:

TACCR0

=

63

break

//

8KHz

case

12:

TACCR0

=

56

break

//

9KHz

case

13:

TACCR0

=

50

break

//

10KHz

case

14:

TACCR0

=

33

break

//

15KHz

case

15:

TACCR0

=

25

break

//

20KHz

case

16:

step

=

0xff

//

循环播放

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12384470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存