MSP430學(xué)習(xí)筆記4-兩個(gè)定時(shí)器產(chǎn)生步進(jìn)單頻音
這個(gè)程序是開發(fā)板中用來產(chǎn)生不同頻率聲音的程序,整體程序較為簡單,主要是兩個(gè)定時(shí)器的使用,代碼及我的注釋如下。
/*********************************************************
程序功能:用固定頻率的方波驅(qū)動(dòng)蜂鳴器,共16種音調(diào);在蜂鳴器
發(fā)出不同音調(diào)的同時(shí),LED發(fā)光以二進(jìn)制數(shù)字形式指示
當(dāng)前音調(diào)的編號(hào)(1~16)
----------------------------------------------------------
撥碼開關(guān)設(shè)置:將BUZZER位撥至ON,其余位撥至OFF
測試說明:聆聽蜂鳴器發(fā)聲的音調(diào)變化。同時(shí)led也有對(duì)應(yīng)的指示
**********************************************************/
#include
typedefunsignedcharuchar;
ucharstep=0xff;
/************************主函數(shù)************************/
voidmain(void)
{
uchari;
WDTCTL=WDTPW+WDTHOLD;//關(guān)狗
/*下面六行程序關(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)換
/*------選擇系統(tǒng)主時(shí)鐘為8MHz-------*/
BCSCTL1&=~XT2OFF;//打開XT2高頻晶體振蕩器
do
{
IFG1&=~OFIFG;//清除晶振失敗標(biāo)志
//IFG1是中斷寄存器OFIFG是晶振啟動(dòng)失敗中斷標(biāo)志位
for(i=0xFF;i>0;i--);//等待8MHz晶體起振
}
while((IFG1&OFIFG));//晶振失效標(biāo)志仍然存在?
//上面這一步主要是等待晶振正常工作
BCSCTL2|=SELM_2+SELS;//MCLK和SMCLK選擇高頻晶振
TACCTL0|=CCIE;//使能比較中斷
TACTL|=TASSEL_2+ID_3;//計(jì)數(shù)時(shí)鐘選擇SMLK=8MHz,1/8分頻后為1MHz
TBCCR0=4096*2-1;//周期兩秒
//時(shí)間計(jì)算:32768/8*2+1注意使用的是手表晶振
TBCCTL0|=CCIE;
TBCTL|=TBSSEL_1+ID_3+MC_1;//時(shí)鐘源ACLK/8,upmode
P6DIR|=BIT7;//蜂鳴器對(duì)應(yīng)IO為6.7設(shè)置為輸出
P2DIR=0xff;//指示對(duì)應(yīng)的狀態(tài)
P2OUT=0xff;
_EINT();
LPM1;
}
/*******************************************
函數(shù)名稱:Timer_A
功能:定時(shí)器A的中斷服務(wù)函數(shù),在這里驅(qū)動(dòng)
蜂鳴器發(fā)聲
參數(shù):無
返回值:無
********************************************/
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
{
P6OUT^=BIT7;//ToggleP6.7
}
/*******************************************
函數(shù)名稱:Timer_B
功能:定時(shí)器B的中斷服務(wù)函數(shù),在這里更改
蜂鳴器發(fā)聲頻率
參數(shù):無
返回值:無
********************************************/
#pragmavector=TIMERB0_VECTOR
__interruptvoidTimer_B(void)
{
if(step==0xff)//step的初值就是0xff,
TACTL|=MC_1;//需要將TimerA設(shè)置為增計(jì)數(shù)模式,可以在初始化的時(shí)候設(shè)置,不明白為什么放在這個(gè)地方。
step++;
switch(step)
{
case0:TACCR0=5000;P2OUT=~1;break;//100Hz
//P2OUT使用led顯示對(duì)應(yīng)的數(shù)值,只是為了便于演示,沒實(shí)際意義
case1:TACCR0=2500;P2OUT=~2;break;//200Hz
case2:TACCR0=1250;P2OUT=~3;break;//400Hz
case3:TACCR0=625;P2OUT=~4;break;//800Hz
case4:TACCR0=500;P2OUT=~5;break;//1KHz
case5:TACCR0=250;P2OUT=~6;break;//2KHz
case6:TACCR0=167;P2OUT=~7;break;//3KHz
case7:TACCR0=125;P2OUT=~8;break;//4KHz
case8:TACCR0=100;P2OUT=~9;break;//5KHz
case9:TACCR0=83;P2OUT=~10;break;//6KHz
case10:TACCR0=71;P2OUT=~11;break;//7KHz
case11:TACCR0=63;P2OUT=~12;break;//8KHz
case12:TACCR0=56;P2OUT=~13;break;//9KHz
case 13: TACCR0 = 50;