程序功能:MCU控制蜂鳴器演奏歌曲《祝你平安》
----------------------------------------------
撥碼開關(guān)設(shè)置:將BUZZER位撥至ON,其余位撥至OFF
測試說明:聆聽蜂鳴器“唱出”的樂曲
既然是演奏樂曲對于一個(gè)音符應(yīng)該包括兩個(gè)部分
一是聲調(diào) 二是持續(xù)時(shí)間,在這個(gè)程序中聲調(diào)是用簡單的
延時(shí)-電平翻轉(zhuǎn)來實(shí)現(xiàn)的,改變了延時(shí)的時(shí)間就改變了
聲調(diào),而時(shí)間是通過計(jì)數(shù)比較來實(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)閉看門狗
/*------選擇系統(tǒng)主時(shí)鐘為8MHz-------*/
BCSCTL1 &= ~XT2OFF; // 打開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;
//打開全局中斷
_EINT();
//循環(huán)演奏歌曲
while(1)
{
Play_Song();
}
}
/*******************************************
函數(shù)名稱:TimerA_ISR
功 能:定時(shí)器A的中斷服務(wù)函數(shù)
參 數(shù):無
返回值 :無
********************************************/
#pragma vector = TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
counter++;
}
/*******************************************
函數(shù)名稱:Delay_Nms
功 能:延時(shí)N個(gè)ms的函數(shù) ps:不知道這個(gè)地方怎么算出來的是延時(shí)毫秒
參 數(shù):n--延時(shí)長度
返回值 :無
********************************************/
void Delay_Nms(uchar n)
{
uchar i,j;
for( i = 0;i 《 n; i++ )
{
for( j = 0;j 《 3;j++ )
_NOP();
}
}
/*******************************************
函數(shù)名稱:Play_Song
功 能:播放《祝你平安》的樂曲
參 數(shù):無
返回值 :無
********************************************/
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; //開始計(jì)數(shù)
while(1)
{
Buzzer_Port ^= Buzzer;//電平取反
Delay_Nms(Temp1);//Temp1的值決定了延時(shí)的長短,也決定了聲音的頻率
if ( Temp2 == counter )//決定了音調(diào)持續(xù)的時(shí)間,計(jì)數(shù)時(shí)間到時(shí)就跳出循環(huán)演奏下一個(gè)。
{
counter = 0;
break;
}
}
}
}
}
-
mcu
+關(guān)注
關(guān)注
146文章
17985瀏覽量
367291 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3300瀏覽量
119026 -
蜂鳴器
+關(guān)注
關(guān)注
12文章
895瀏覽量
46971
發(fā)布評論請先 登錄
各位,問一個(gè)問題,用蜂鳴器演奏流行音樂曲子,做成產(chǎn)品賣的話,算侵權(quán)嗎?
通過單片機(jī)演奏音樂
如何利用單片機(jī)實(shí)現(xiàn)蜂鳴器音樂之八月桂花
如何利用Arduino與蜂鳴器實(shí)現(xiàn)音樂的演奏呢
音樂演奏器設(shè)計(jì)

使用C51單片機(jī)進(jìn)行演奏生日快樂音樂程序的詳細(xì)資料免費(fèi)下載

如何使用單片機(jī)進(jìn)行蜂鳴器演奏音樂的程序資料免費(fèi)下載

單片機(jī)中級項(xiàng)目12丨蜂鳴器音樂之八月桂花

評論