看起来数组应该是音乐数据,其中包括四种数据,就是休止符(每个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函数的具体定义才行。
我这里就有一个捕获的程序,你看看。如果你的设置没问题的话就应该是没有进行初始化。
#include<msp430x14xh>
#define BHSEL P2SEL //定义捕获端口
#define BH_IO BIT2
void InitSys()
{
unsigned int iq0;
//使用XT2振荡器
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG;// 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--);// 延时,等待XT2起振
}while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振
BCSCTL2 =SELM_2+SELS;//选择MCLK、SMCLK为XT2
_EINT();//打开全局中断控制,若不需要打开,可以屏蔽本句
}
void InitBhTimerA() //初始化
{
TACTL = TASSEL_2+ID_3+TACLR;//定时器A,时钟源:ACLK,连续计数模式
CCTL0 = CCIS_1+CM_2+CAP;//选择上降沿捕获,CCIB(P22)为信号源,
BHSEL |= BH_IO; //选择P22使用第二功能
TACTL |= MC_2+TACLR;//打开计数器
CCTL0 |= CCIE; //捕获中断允许
InitSys();
}
void main(void)
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
InitBhTimerA();
while(1)
{
}
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0()
{
_EINT();
}
以上就是关于msp430g2553单片机控制蜂鸣器发出音乐的程序全部的内容,包括:msp430g2553单片机控制蜂鸣器发出音乐的程序、msp430G2553的定时器捕获中断进不去,求高手指点,、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)