第十節 蜂鳴器
蜂鳴器是一種常用的報警設備,常用的蜂鳴器有無源和有源兩種類型,無源蜂鳴器需要用一定頻率的方波驅動,從而發出不同頻率的聲音。而有源蜂鳴器只需要通電就會發出固定頻率的聲音,MT254xboard開發板上的蜂鳴器用的是無源蜂鳴器,因此我們需要用一定頻率的方波來驅動。
硬件驅動方面,我們這里使用了PNP三極管來驅動蜂鳴器,BUZZ引腳為芯片的P2.0。對照IO復用表可知,此IO可以作為定時器4的匹配通道1輸出。所以我們需要把定時器配置為PWM匹配輸出模式:
PERCFG |= (0x01《《4); // 選擇定時器4匹配功能中的第2種IO口
P2DIR |= 0x01; // p2.0 輸出
P2SEL |= 0x01; // p2.0 復用功能
T4CTL &= ~0x10; // Stop timer 3 (if it was running)
T4CTL |= 0x04; // Clear timer 3
T4CTL &= ~0x08; // Disable Timer 3 overflow interrupts
T4CTL |= 0x03; // Timer 3 mode = 3 - Up/Down
T4CCTL0 &= ~0x40; // Disable channel 0 interrupts
T4CCTL0 |= 0x04; // Ch0 mode = compare
T4CCTL0 |= 0x10; // Ch0 output compare mode = toggle on compare
這里僅僅是配置為匹配輸出,具體輸出什么樣的波形還需要我們再通過計算得出。
void Buzzer_Start(uint16 frequency)
{
P2SEL |= 0x01; // p2.0 復用功能
uint8 prescaler = 0;
// Get current Timer tick divisor setting
uint8 tickSpdDiv = (CLKCONSTA & 0x38)》》3;
// Check if frequency too low
if (frequency 《 (244 》》 tickSpdDiv)){ // 244 Hz = 32MHz / 256 (8bit counter) / 4 (up/down counter and toggle on compare) / 128 (max timer prescaler)
Buzzer_Stop(); // A lower tick speed will lower this number accordingly.
}
// Calculate nr of ticks required to achieve target frequency
uint32 ticks = (8000000/frequency) 》》 tickSpdDiv; // 8000000 = 32M / 4;
// Fit this into an 8bit counter using the timer prescaler
while ((ticks & 0xFFFFFF00) != 0)
{
ticks 》》= 1;
prescaler += 32;
}
// Update registers
T4CTL &= ~0xE0;
T4CTL |= prescaler;
T4CC0 = (uint8)ticks;
// Start timer
T4CTL |= 0x10;
}
這個函數是通過傳入參數的形式,使P2.0口發出指定頻率的方波。
void Buzzer_Stop(void)
{
T4CTL &= ~0x10; // Stop timer 3
P2SEL &= ~0x01;
P2_0 = 1;
}
這個函數是使蜂鳴器停止,主要有三個動作,停止定時器,將P2.0配置為IO功能并且輸出高電平,因為我們使用的是PNP三極管。
我們在按鍵的程序上加上蜂鳴器的控制,當按下按鍵時,蜂鳴器響。松開后停止響。
int main(void)
{
char LCDBuf[21]={0}; // 顯存
int KeyCnt = 0;
SysStartXOSC();
LCD12864_Init();
LCD12864_DisStr(1, “ Buzzer Test”);
Buzzer_Init();
P0SEL &= ~0X01; // 設置為IO功能
P0DIR &= ~0X01; // 設置為輸入功能
P0IEN |= 0X01; // P0.0 設置為中斷方式
PICTL |= 0X01; // 下降沿觸發
IEN1 |= 0X20; // 允許P0口中斷
P0IFG = 0x00; // 清除中斷標志位
EA = 1; // 開總中斷
sprintf(LCDBuf, “ Key Count : %d”, KeyCnt++); // 按鍵計數
LCD12864_DisStr(3, LCDBuf);
while(1)
{
if(KEY_DOWN == NewKeyValue) // 按鍵按下
{
SoftWaitUs(25000); // 延時防抖
if((P0&0X01) == 0X00) // 再次確認按鍵是否按下
{
sprintf(LCDBuf, “ Key Count : %d”, KeyCnt++); // 按鍵計數
LCD12864_DisStr(3, “ Buzzer Start”);
Buzzer_Start(2000);
}
else
{
NewKeyValue = KEY_UP; // 按鍵松開
Buzzer_Stop();
LCD12864_DisStr(3, “ Buzzer Stop”);
}
}
}
return 0;
}
按下按鍵后可以看到LCD顯示Buzzer Start,聽到蜂鳴器響,如果你有示波器,還能測到P2.0口有一個2KHz的方波。
評論
查看更多