程序功能:MCU控制蜂鳴器演奏歌曲《祝你平安》
----------------------------------------------
撥碼開關設置:將BUZZER位撥至ON,其余位撥至OFF
測試說明:聆聽蜂鳴器“唱出”的樂曲
既然是演奏樂曲對于一個音符應該包括兩個部分
一是聲調 二是持續時間,在這個程序中聲調是用簡單的
延時-電平翻轉來實現的,改變了延時的時間就改變了
聲調,而時間是通過計數比較來實現的,當計數值相等時
就跳出循環演奏下一個音符。
*********************************************/
#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);
/***************主函數****************/
void main(void)
{
uchar i;
/*下面六行程序關閉所有的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; //關閉電平轉換
WDTCTL = WDTPW + WDTHOLD; //關閉看門狗
/*------選擇系統主時鐘為8MHz-------*/
BCSCTL1 &= ~XT2OFF; // 打開XT2高頻晶體振蕩器
do
{
IFG1 &= ~OFIFG; //清除晶振失敗標志
for (i = 0xFF; i 》 0; i--); // 等待8MHz晶體起振
}
while ((IFG1 & OFIFG)); // 晶振失效標志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //主時鐘和從時鐘都選擇高頻晶振
//設置定時器A每10ms中斷一次
CCTL0 = CCIE;
CCR0 = 10000;//改變這個值就改變了演奏的速度
TACTL |= TASSEL_2 + ID_3;
//設置控制蜂鳴器的IO方向為輸出
Buzzer_DIR |= Buzzer;
//打開全局中斷
_EINT();
//循環演奏歌曲
while(1)
{
Play_Song();
}
}
/*******************************************
函數名稱:TimerA_ISR
功 能:定時器A的中斷服務函數
參 數:無
返回值 :無
********************************************/
#pragma vector = TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
counter++;
}
/*******************************************
函數名稱:Delay_Nms
功 能:延時N個ms的函數 ps:不知道這個地方怎么算出來的是延時毫秒
參 數:n--延時長度
返回值 :無
********************************************/
void Delay_Nms(uchar n)
{
uchar i,j;
for( i = 0;i 《 n; i++ )
{
for( j = 0;j 《 3;j++ )
_NOP();
}
}
/*******************************************
函數名稱:Play_Song
功 能:播放《祝你平安》的樂曲
參 數:無
返回值 :無
********************************************/
void Play_Song(void)
{
uchar Temp1,Temp2;
uchar addr = 0;
counter = 0; //中斷計數器清0
while(1)
{
Temp1 = SONG[addr++];
if ( Temp1 == 0xFF ) //休止符
{
TACTL &=~MC_1; //停止計數
Delay_Nms(100);
}
else if ( Temp1 == 0x00 ) //歌曲結束符
{
return;
}
else
{
Temp2 = SONG[addr++];
TACTL |=MC_1; //開始計數
while(1)
{
Buzzer_Port ^= Buzzer;//電平取反
Delay_Nms(Temp1);//Temp1的值決定了延時的長短,也決定了聲音的頻率
if ( Temp2 == counter )//決定了音調持續的時間,計數時間到時就跳出循環演奏下一個。
{
counter = 0;
break;
}
}
}
}
}
-
mcu
+關注
關注
146文章
17312瀏覽量
352208 -
定時器
+關注
關注
23文章
3255瀏覽量
115169 -
蜂鳴器
+關注
關注
12文章
893瀏覽量
46050
發布評論請先 登錄
相關推薦
評論