📄 beep.c
字号:
#include "2410addr.h"
#include "2410lib.h"
#include "def.h"
/****************************************************************************
【功能说明】蜂鸣器PWM测试
****************************************************************************/
uint32 freq_ct, freq_ct2,freq;
uchar fre;
void Buzzer_Freq_Set( U32 freq )
{
rGPBCON = rGPBCON |~(3<<0)|(1<<1); //set GPB0 as tout0, pwm output
rTCFG0 = rTCFG0 & ~0xff|15; //prescaler = 15
rTCFG1 = rTCFG1 & ~0xf|2; //timer0,divider = 1/8
rTCNTB0 = (PCLK>>7)/freq;//rTCNTB0=PCLK/{(prescaler+1) * divider *freq}=PCLK/128*freq
rTCMPB0 = rTCNTB0>>1; //占空比50% rTCMPB0=PCLK/256*freq
//disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON = rTCON & ~0x1f|(0<<4)|(1<<3)|(0<<2)|(1<<1)|(1);
rTCON &= ~(1<<1); //clear manual update bit
}
void Buzzer_Stop( void )
{
rGPBCON &= ~12; //set GPB1 as output
rGPBCON |= 4;
rGPBDAT &= ~1;
}
void Buzzer_PWM_Run( void )
{
freq = 2000 ; // rTCNTB0=195
Buzzer_Freq_Set( freq ) ; //real beep freq=97Hz
}
void __irq pwm0_int(void)
{
ClearPending(BIT_TIMER0);
/* fre=!fre;
if(fre)
{ rTCMPB0 = rTCNTB0>>1;}
else
{ rTCMPB0 = rTCNTB0>>2;}*/
freq_ct++;
if(freq_ct>30)
{
freq_ct=0;
freq_ct2++;
if(freq_ct2>10)
{
freq_ct2=0;
if(rGPFDAT==(rGPFDAT&0x0F)|0x00)
{ rGPFDAT=(rGPFDAT&0x0F)|0xf0; } //LED1-4 on
else
{rGPFDAT=(rGPFDAT&0x0F)|0x00; } //LED1-4 off
freq+=100;
Buzzer_Freq_Set(freq ) ;
if( freq>2000)
{
freq=10;
}
}
}
}
void timer0_set()
{
EnableIrq(BIT_TIMER0);
pISR_TIMER0 =(unsigned) pwm0_int;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -