厂家提供的PIC16F18446核心板范例中有一个检测敲门实例,是通过压电陶瓷片获得敲门信息然后驱动蜂鸣器发声,相应的照片如下:
为了方便进行测试,我也参照该实例制作了一块实验模块,不同的是我将压电陶瓷片和无源蜂鸣器放在一起了:
下图是整个实验装置:
通过分析范例的代码获知它的发声原理是将无源蜂鸣器接在两个引脚中,发声时先将其中一个引脚翻转,然后按设定的频率同时对两个引脚执行翻转操作,类似形成推拉作用驱动无源蜂鸣器发声。我尝试着将其移植到PIC18F47Q10核心板,代码如下:
#include "snd.h"
#include "mcc_generated_files/mcc.h"
#define DELAY_AFTER_SND (200)
#define SND_DING_HALF_PER (645) //(645)
#define SND_DONG_HALF_PER (806) //(806)
#define SND_LEN_SHORT (1800) //(300)
#define SND_LEN_LONG (1000)
#define SND_ALARM_LEN1 (380) //(38)
#define SND_ALARM_LEN2 (580) //(58)
#define SND_ALARM_LEN3 (920) //(92)
#define SND_ALARM_CNT (10)
#define SND_ALARM_HALF_PER1 (400) //(219)
#define SND_ALARM_HALF_PER2 (200) //(146)
#define SND_ALARM_HALF_PER3 (90)
#define SND_ALARM_DELAY (400) //(200)
#define SND_BEEP_LEN (10000) //(250)
#define SND_BEEP_HALF_PER (100)
#define SND_BEEP_DELAY (100)
static void SND_alarm(void);
//static void SND_alarm1(void);
void SND_dingDong(uint8_t knocks)
{
SNDP_PIN_Toggle();
while(knocks>1)
{
for(uint16_t i=0; i<SND_LEN_SHORT; i++)
{
SNDP_PIN_Toggle();
SNDN_PIN_Toggle();
__delay_us(SND_DING_HALF_PER);
}
for(uint16_t i=0; i<SND_LEN_SHORT; i++)
{
SNDP_PIN_Toggle();
SNDN_PIN_Toggle();
__delay_us(SND_DONG_HALF_PER);
}
knocks--;
}
for(uint16_t i=0; i<SND_LEN_SHORT; i++)
{
SNDP_PIN_Toggle();
SNDN_PIN_Toggle();
__delay_us(SND_DING_HALF_PER);
}
for(uint16_t i=0; i<SND_LEN_LONG; i++)
{
SNDP_PIN_Toggle();
SNDN_PIN_Toggle();
__delay_us(SND_DONG_HALF_PER);
}
SNDP_PIN_SetLow();
SNDN_PIN_SetLow();
__delay_ms(DELAY_AFTER_SND);
}
static void SND_alarm(void)
{
SNDP_PIN_Toggle();
for(uint8_t j=0; j<SND_ALARM_CNT; j++)
{
for(uint16_t i=0; i<SND_ALARM_LEN1; i++)
{
SNDP_PIN_Toggle();
SNDN_PIN_Toggle();
__delay_us(SND_ALARM_HALF_PER1);
}
for(uint16_t i=0; i<SND_ALARM_LEN2; i++)
{
SNDP_PIN_Toggle();
SNDN_PIN_Toggle();
__delay_us(SND_ALARM_HALF_PER2);
}
for(uint16_t i=0; i<SND_ALARM_LEN3; i++)
{
SNDP_PIN_Toggle();
SNDN_PIN_Toggle();
__delay_us(SND_ALARM_HALF_PER3);
}
}
SNDP_PIN_SetLow();
SNDN_PIN_SetLow();
}
/*
static void SND_alarm1(void)
{
uint16_t bt;
bt = 90;
SNDP_PIN_Toggle();
while(bt<1000)
{
for(uint8_t i=0; i<10; i++)
{
SNDP_PIN_Toggle();
SNDN_PIN_Toggle();
__delay_us(bt);
}
bt++;
}
while(bt>0){
for(uint8_t i=0; i<10; i++)
{
SNDP_PIN_Toggle();
SNDN_PIN_Toggle();
__delay_us(bt);
bt--;
}
}
SNDP_PIN_SetLow();
SNDN_PIN_SetLow();
}
*/
void SND_alarmX4(void)
{
for(uint8_t i=0; i<4; i++)
{
SND_alarm();
__delay_ms(SND_ALARM_DELAY);
}
__delay_ms(DELAY_AFTER_SND);
}
void SND_beep(void)
{
SNDP_PIN_Toggle();
for(uint16_t i=0; i<SND_BEEP_LEN; i++)
{
SNDP_PIN_Toggle();
SNDN_PIN_Toggle();
__delay_us(SND_BEEP_HALF_PER);
}
SNDP_PIN_SetLow();
SNDN_PIN_SetLow();
}
void SND_init(void)
{
SND_beep();
__delay_ms(SND_BEEP_DELAY);
SND_beep();
}
经测试,虽然能够发出声音,但太单调了,实用价值不高,无法满足多数人的感受。原本准备作音乐门铃的声源,看来得舍弃这个方案,换用音乐芯片来作声源,音质要提高许多。
|