2蜂鳴器(BEEP)
void Buzzer_Freq_Set( U32 freq )
{
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 2;
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8
rTCNTB0 = (PCLK>>7)/freq;
rTCMPB0 = rTCNTB0>>1; // 50%
rTCON &= ~0x1f;
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2; //clear manual update bit
}
void Buzzer_Stop( void )
{
rGPBCON &= ~3; //set GPB0 as output
rGPBCON |= 1;
rGPBDAT &= ~1;
}
//***************************[ BOARD BEEP ]*******************************
void Beep(U32 freq, U32 ms)
{
Buzzer_Freq_Set( freq ) ;
Delay( ms ) ;
Buzzer_Stop() ;
}
/****************************************************************************
【功能說明】蜂鳴器PWM測試
****************************************************************************/
void BUZZER_PWM_Test( void )
{
U16 freq = 1000 ;
Uart_Printf( "/nBUZZER TEST ( PWM Control )/n" );
Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !/n" ) ;
Uart_Printf( "Press 'ESC' key to Exit this program !/n/n" );
Buzzer_Freq_Set( freq ) ;
while( 1 )
{
U8 key = Uart_Getch();
if( key == '+' )
{
if( freq < 20000 )
freq += 10 ;
Buzzer_Freq_Set( freq ) ;
}
if( key == '-' )
{
if( freq > 11 )
freq -= 10 ;
Buzzer_Freq_Set( freq ) ;
}
Uart_Printf( "/tFreq = %d/n", freq ) ;
if( key == ESC_KEY )
{
Buzzer_Stop() ;
return ;
}
}
}
有四個函數
蜂鳴器頻率的設定:void Buzzer_Freq_Set( U32 freq )
蜂鳴器停止:void Buzzer_Stop( void )
板上蜂鳴器測試:void Beep(U32 freq, U32 ms)
蜂鳴器PWM測試:void BUZZER_PWM_Test( void )
1) 蜂鳴器頻率的設定:
void Buzzer_Freq_Set( U32 freq )
{
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 2;
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8
rTCNTB0 = (PCLK>>7)/freq;
rTCMPB0 = rTCNTB0>>1; // 50%
rTCON &= ~0x1f;
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2; //clear manual update bit
}
首先設置端口GPB0爲TOUT0功能
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 2;
然後設置預分頻和分割值,計數器的輸入時鐘(CCLK)頻率:PCLK/(預分頻+1)/分割值 。預分頻值和分割值分別由TCFG0,TCFG1來確定。
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8
接着設定初始值TCMPB3和TCNTB3
rTCNTB0 = (PCLK>>7)/freq;
rTCMPB0 = rTCNTB0>>1; // 50%
由於計數器的輸入時鐘爲PCLK/16/8;而rTCNTB0 = (PCLK>>7)/freq;並且計數計到最大值的一半時發生翻轉。因爲計數的基值是 由rTCMPB0 = rTCNTB0>>1; // 50%
設定爲最大計數值的50%。
最後是定時控制器的設定 rTCON
rTCON &= ~0x1f;
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2; //clear manual update bit
這樣TOUT0就產生了頻率是rTCNTB0 ,佔空比是50%的方波。
2)蜂鳴器停止:void Buzzer_Stop( void )
void Buzzer_Stop( void )
{
rGPBCON &= ~3; //set GPB0 as output
rGPBCON |= 1;
rGPBDAT &= ~1;
}
通過設定GPB0爲輸出功能,並輸出低電平,使蜂鳴器停止。
2) 板上蜂鳴器測試:void Beep(U32 freq, U32 ms)
void Beep(U32 freq, U32 ms)
{
Buzzer_Freq_Set( freq ) ;
Delay( ms ) ;
Buzzer_Stop() ;
}
輸入的是蜂鳴器的頻率和蜂鳴器響的時間,通過
Buzzer_Freq_Set( freq ) ;
Delay( ms ) ;
來實現蜂鳴器按照feq的頻率響ms的時間。(ms=1,時間爲0.32ms)
3) 蜂鳴器PWM測試:void BUZZER_PWM_Test( void )
void BUZZER_PWM_Test( void )
{
U16 freq = 1000 ;
Uart_Printf( "/nBUZZER TEST ( PWM Control )/n" );
Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !/n" ) ;
Uart_Printf( "Press 'ESC' key to Exit this program !/n/n" );
Buzzer_Freq_Set( freq ) ;
while( 1 )
{
U8 key = Uart_Getch();
if( key == '+' )
{
if( freq < 20000 )
freq += 10 ;
Buzzer_Freq_Set( freq ) ;
}
if( key == '-' )
{
if( freq > 11 )
freq -= 10 ;
Buzzer_Freq_Set( freq ) ;
}
Uart_Printf( "/tFreq = %d/n", freq ) ;
if( key == ESC_KEY )
{
Buzzer_Stop() ;
return ;
}
}
}
首先接收按鍵的值U8 key = Uart_Getch();
如果是‘+’,並小於頻率的上限,則增加頻率10,如果是‘-’,並且大於頻率的下限,則減少頻率10。如果按下‘esc’則蜂鳴器停止,程序返回。
void Buzzer_Freq_Set( U32 freq )
{
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 2;
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8
rTCNTB0 = (PCLK>>7)/freq;
rTCMPB0 = rTCNTB0>>1; // 50%
rTCON &= ~0x1f;
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2; //clear manual update bit
}
void Buzzer_Stop( void )
{
rGPBCON &= ~3; //set GPB0 as output
rGPBCON |= 1;
rGPBDAT &= ~1;
}
//***************************[ BOARD BEEP ]*******************************
void Beep(U32 freq, U32 ms)
{
Buzzer_Freq_Set( freq ) ;
Delay( ms ) ;
Buzzer_Stop() ;
}
/****************************************************************************
【功能說明】蜂鳴器PWM測試
****************************************************************************/
void BUZZER_PWM_Test( void )
{
U16 freq = 1000 ;
Uart_Printf( "/nBUZZER TEST ( PWM Control )/n" );
Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !/n" ) ;
Uart_Printf( "Press 'ESC' key to Exit this program !/n/n" );
Buzzer_Freq_Set( freq ) ;
while( 1 )
{
U8 key = Uart_Getch();
if( key == '+' )
{
if( freq < 20000 )
freq += 10 ;
Buzzer_Freq_Set( freq ) ;
}
if( key == '-' )
{
if( freq > 11 )
freq -= 10 ;
Buzzer_Freq_Set( freq ) ;
}
Uart_Printf( "/tFreq = %d/n", freq ) ;
if( key == ESC_KEY )
{
Buzzer_Stop() ;
return ;
}
}
}
有四個函數
蜂鳴器頻率的設定:void Buzzer_Freq_Set( U32 freq )
蜂鳴器停止:void Buzzer_Stop( void )
板上蜂鳴器測試:void Beep(U32 freq, U32 ms)
蜂鳴器PWM測試:void BUZZER_PWM_Test( void )
1) 蜂鳴器頻率的設定:
void Buzzer_Freq_Set( U32 freq )
{
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 2;
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8
rTCNTB0 = (PCLK>>7)/freq;
rTCMPB0 = rTCNTB0>>1; // 50%
rTCON &= ~0x1f;
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2; //clear manual update bit
}
首先設置端口GPB0爲TOUT0功能
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 2;
然後設置預分頻和分割值,計數器的輸入時鐘(CCLK)頻率:PCLK/(預分頻+1)/分割值 。預分頻值和分割值分別由TCFG0,TCFG1來確定。
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8
接着設定初始值TCMPB3和TCNTB3
rTCNTB0 = (PCLK>>7)/freq;
rTCMPB0 = rTCNTB0>>1; // 50%
由於計數器的輸入時鐘爲PCLK/16/8;而rTCNTB0 = (PCLK>>7)/freq;並且計數計到最大值的一半時發生翻轉。因爲計數的基值是 由rTCMPB0 = rTCNTB0>>1; // 50%
設定爲最大計數值的50%。
最後是定時控制器的設定 rTCON
rTCON &= ~0x1f;
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2; //clear manual update bit
這樣TOUT0就產生了頻率是rTCNTB0 ,佔空比是50%的方波。
2)蜂鳴器停止:void Buzzer_Stop( void )
void Buzzer_Stop( void )
{
rGPBCON &= ~3; //set GPB0 as output
rGPBCON |= 1;
rGPBDAT &= ~1;
}
通過設定GPB0爲輸出功能,並輸出低電平,使蜂鳴器停止。
2) 板上蜂鳴器測試:void Beep(U32 freq, U32 ms)
void Beep(U32 freq, U32 ms)
{
Buzzer_Freq_Set( freq ) ;
Delay( ms ) ;
Buzzer_Stop() ;
}
輸入的是蜂鳴器的頻率和蜂鳴器響的時間,通過
Buzzer_Freq_Set( freq ) ;
Delay( ms ) ;
來實現蜂鳴器按照feq的頻率響ms的時間。(ms=1,時間爲0.32ms)
3) 蜂鳴器PWM測試:void BUZZER_PWM_Test( void )
void BUZZER_PWM_Test( void )
{
U16 freq = 1000 ;
Uart_Printf( "/nBUZZER TEST ( PWM Control )/n" );
Uart_Printf( "Press +/- to increase/reduce the frequency of BUZZER !/n" ) ;
Uart_Printf( "Press 'ESC' key to Exit this program !/n/n" );
Buzzer_Freq_Set( freq ) ;
while( 1 )
{
U8 key = Uart_Getch();
if( key == '+' )
{
if( freq < 20000 )
freq += 10 ;
Buzzer_Freq_Set( freq ) ;
}
if( key == '-' )
{
if( freq > 11 )
freq -= 10 ;
Buzzer_Freq_Set( freq ) ;
}
Uart_Printf( "/tFreq = %d/n", freq ) ;
if( key == ESC_KEY )
{
Buzzer_Stop() ;
return ;
}
}
}
首先接收按鍵的值U8 key = Uart_Getch();
如果是‘+’,並小於頻率的上限,則增加頻率10,如果是‘-’,並且大於頻率的下限,則減少頻率10。如果按下‘esc’則蜂鳴器停止,程序返回。