程序功能:MCU控制蜂鳴器演奏歌曲《祝你平安》
----------------------------------------------
撥碼開(kāi)關(guān)設(shè)置:將BUZZER位撥至ON,其余位撥至OFF
測(cè)試說(shuō)明:聆聽(tīng)蜂鳴器“唱出”的樂(lè)曲
既然是演奏樂(lè)曲對(duì)于一個(gè)音符應(yīng)該包括兩個(gè)部分
一是聲調(diào) 二是持續(xù)時(shí)間,在這個(gè)程序中聲調(diào)是用簡(jiǎn)單的
延時(shí)-電平翻轉(zhuǎn)來(lái)實(shí)現(xiàn)的,改變了延時(shí)的時(shí)間就改變了
聲調(diào),而時(shí)間是通過(guò)計(jì)數(shù)比較來(lái)實(shí)現(xiàn)的,當(dāng)計(jì)數(shù)值相等時(shí)
就跳出循環(huán)演奏下一個(gè)音符。
*********************************************/
#include 《msp430x14x.h》
typedef unsigned char uchar;
#include “music.h”
#define Buzzer BIT7
#define Buzzer_Port P6OUT
#define Buzzer_DIR P6DIR
uchar counter;
void Play_Song(void);
/***************主函數(shù)****************/
void main(void)
{
uchar i;
/*下面六行程序關(guān)閉所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
P6DIR |= BIT2;P6OUT |= BIT2; //關(guān)閉電平轉(zhuǎn)換
WDTCTL = WDTPW + WDTHOLD; //關(guān)閉看門(mén)狗
/*------選擇系統(tǒng)主時(shí)鐘為8MHz-------*/
BCSCTL1 &= ~XT2OFF; // 打開(kāi)XT2高頻晶體振蕩器
do
{
IFG1 &= ~OFIFG; //清除晶振失敗標(biāo)志
for (i = 0xFF; i 》 0; i--); // 等待8MHz晶體起振
}
while ((IFG1 & OFIFG)); // 晶振失效標(biāo)志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //主時(shí)鐘和從時(shí)鐘都選擇高頻晶振
//設(shè)置定時(shí)器A每10ms中斷一次
CCTL0 = CCIE;
CCR0 = 10000;//改變這個(gè)值就改變了演奏的速度
TACTL |= TASSEL_2 + ID_3;
//設(shè)置控制蜂鳴器的IO方向?yàn)檩敵?/p>
Buzzer_DIR |= Buzzer;
//打開(kāi)全局中斷
_EINT();
//循環(huán)演奏歌曲
while(1)
{
Play_Song();
}
}
/*******************************************
函數(shù)名稱(chēng):TimerA_ISR
功 能:定時(shí)器A的中斷服務(wù)函數(shù)
參 數(shù):無(wú)
返回值 :無(wú)
********************************************/
#pragma vector = TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
counter++;
}
/*******************************************
函數(shù)名稱(chēng):Delay_Nms
功 能:延時(shí)N個(gè)ms的函數(shù) ps:不知道這個(gè)地方怎么算出來(lái)的是延時(shí)毫秒
參 數(shù):n--延時(shí)長(zhǎng)度
返回值 :無(wú)
********************************************/
void Delay_Nms(uchar n)
{
uchar i,j;
for( i = 0;i 《 n; i++ )
{
for( j = 0;j 《 3;j++ )
_NOP();
}
}
/*******************************************
函數(shù)名稱(chēng):Play_Song
功 能:播放《祝你平安》的樂(lè)曲
參 數(shù):無(wú)
返回值 :無(wú)
********************************************/
void Play_Song(void)
{
uchar Temp1,Temp2;
uchar addr = 0;
counter = 0; //中斷計(jì)數(shù)器清0
while(1)
{
Temp1 = SONG[addr++];
if ( Temp1 == 0xFF ) //休止符
{
TACTL &=~MC_1; //停止計(jì)數(shù)
Delay_Nms(100);
}
else if ( Temp1 == 0x00 ) //歌曲結(jié)束符
{
return;
}
else
{
Temp2 = SONG[addr++];
TACTL |=MC_1; //開(kāi)始計(jì)數(shù)
while(1)
{
Buzzer_Port ^= Buzzer;//電平取反
Delay_Nms(Temp1);//Temp1的值決定了延時(shí)的長(zhǎng)短,也決定了聲音的頻率
if ( Temp2 == counter )//決定了音調(diào)持續(xù)的時(shí)間,計(jì)數(shù)時(shí)間到時(shí)就跳出循環(huán)演奏下一個(gè)。
{
counter = 0;
break;
}
}
}
}
}
-
mcu
+關(guān)注
關(guān)注
147文章
18924瀏覽量
398010 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3368瀏覽量
123587 -
蜂鳴器
+關(guān)注
關(guān)注
12文章
899瀏覽量
47760
發(fā)布評(píng)論請(qǐng)先 登錄
利用蜂鳴器和單片機(jī)演奏簡(jiǎn)單的音樂(lè)電路設(shè)計(jì)
各位,問(wèn)一個(gè)問(wèn)題,用蜂鳴器演奏流行音樂(lè)曲子,做成產(chǎn)品賣(mài)的話(huà),算侵權(quán)嗎?
簡(jiǎn)易電子琴演奏音樂(lè)
按鍵控制無(wú)源蜂鳴器發(fā)出不同聲音來(lái)演奏音樂(lè)
通過(guò)單片機(jī)演奏音樂(lè)
如何利用Arduino與蜂鳴器實(shí)現(xiàn)音樂(lè)的演奏呢
單片機(jī)音樂(lè)程序教程
音樂(lè)演奏器設(shè)計(jì)
使用C51單片機(jī)進(jìn)行演奏生日快樂(lè)音樂(lè)程序的詳細(xì)資料免費(fèi)下載
如何使用單片機(jī)進(jìn)行蜂鳴器演奏音樂(lè)的程序資料免費(fèi)下載
單片機(jī)中級(jí)項(xiàng)目12丨蜂鳴器音樂(lè)之八月桂花
MCU控制蜂鳴器演奏音樂(lè)小程序
評(píng)論