這個(gè)程序是開(kāi)發(fā)板中用來(lái)產(chǎn)生不同頻率聲音的程序,整體程序較為簡(jiǎn)單,主要是兩個(gè)定時(shí)器的使用,代碼及我的注釋如下。
[cpp] view plain copy/*********************************************************
程序功能:用固定頻率的方波驅(qū)動(dòng)蜂鳴器,共16種音調(diào);在蜂鳴器
發(fā)出不同音調(diào)的同時(shí),LED發(fā)光以二進(jìn)制數(shù)字形式指示
當(dāng)前音調(diào)的編號(hào)(1~16)
----------------------------------------------------------
撥碼開(kāi)關(guān)設(shè)置:將BUZZER位撥至ON,其余位撥至OFF
測(cè)試說(shuō)明:聆聽(tīng)蜂鳴器發(fā)聲的音調(diào)變化。同時(shí)led也有對(duì)應(yīng)的指示
**********************************************************/
#include 《msp430.h》
typedef unsigned char uchar;
uchar step = 0xff;
/************************主函數(shù)************************/
void main( void )
{
uchar i;
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; //打開(kāi)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,up mode
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ù):無(wú)
返回值 :無(wú)
********************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P6OUT ^= BIT7; // Toggle P6.7
}
/*******************************************
函數(shù)名稱:Timer_B
功 能:定時(shí)器B的中斷服務(wù)函數(shù),在這里更改
蜂鳴器發(fā)聲頻率
參 數(shù):無(wú)
返回值 :無(wú)
********************************************/
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
if(step == 0xff) //step的初值就是0xff,
TACTL |= MC_1;//需要將TimerA設(shè)置為增計(jì)數(shù)模式,可以在初始化的時(shí)候設(shè)置,不明白為什么放在這個(gè)地方。
step++;
switch(step)
{
case 0: TACCR0 = 5000; P2OUT = ~1; break; // 100Hz
//P2OUT使用led顯示對(duì)應(yīng)的數(shù)值,只是為了便于演示,沒(méi)實(shí)際意義
case 1: TACCR0 = 2500; P2OUT = ~2; break; // 200Hz
case 2: TACCR0 = 1250; P2OUT = ~3; break; // 400Hz
case 3: TACCR0 = 625; P2OUT = ~4; break; // 800Hz
case 4: TACCR0 = 500; P2OUT = ~5; break; // 1KHz
case 5: TACCR0 = 250; P2OUT = ~6; break; // 2KHz
case 6: TACCR0 = 167; P2OUT = ~7; break; // 3KHz
case 7: TACCR0 = 125; P2OUT = ~8; break; // 4KHz
case 8: TACCR0 = 100; P2OUT = ~9; break; // 5KHz
case 9: TACCR0 = 83; P2OUT = ~10; break; // 6KHz
case 10: TACCR0 = 71; P2OUT = ~11; break; // 7KHz
case 11: TACCR0 = 63; P2OUT = ~12; break; // 8KHz
case 12: TACCR0 = 56; P2OUT = ~13; break; // 9KHz
case 13: TACCR0 = 50; P2OUT = ~14; break; // 10KHz
case 14: TACCR0 = 33; P2OUT = ~15; break; // 15KHz
case 15: TACCR0 = 25; P2OUT = ~16; break; // 20KHz
case 16: step = 0xff; // 接著往上加,和清零的效果一樣,循環(huán)播放
}
}
-
定時(shí)器
+關(guān)注
關(guān)注
23文章
3228瀏覽量
114155 -
蜂鳴器
+關(guān)注
關(guān)注
12文章
888瀏覽量
45782
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論