当前位置:文档之家› 和弦音蜂鸣器

和弦音蜂鸣器

前言:现在一些带按键显示控制面板的家电(比较常见的是柜式空调)在按键操作的时候会有悦耳的和弦 音发出,特别是开关机或操作上下键时会有不同变调的和弦音,相比普通的嘀嘀声给人更愉悦的操作体验。


1.控制方式说明
此处以型号为 SH2225T2PA 的蜂鸣器(谐振频率 2.6KHz)为例。

蜂鸣器模块有两个驱动引脚与 MCU 相连,一个是振荡信号输入引脚,由 MCU 提供相应频率的方波信号驱动蜂鸣器发声,一个是供电控制端, 供电切断后蜂鸣器靠电解电容放电维持其发声,会有音量渐渐变小的效果。


原理图如下所示, MC9 为供电控制端,MC8 为振荡信号输入端。

MC9 为高电平时,三极管 Q4 导通, 然后 Q2 导通,蜂鸣器开始供电,同时电容 CD2 充电。

若 MC8 有一定频率的方波信号发出,则蜂鸣器可 发出鸣叫。

若此时先关掉供电,即 MC9 置低电平,MC8 依然发出方波信号,则蜂鸣器可依靠 CD2 放电 发出声音,但随着电容电量减少,音量会逐渐减小,形成蜂鸣声渐隐的和弦音效果。

要实现变调的效果, 则可通过短时间内切换发出几种不同频率的蜂鸣声来实现。




以下是 3 种比较典型的和弦音的实现细节:(符号说明:Tf:频率给定持续时间(ms) Tv:电压给定持 续时间(ms) F:输出频率(KHz))
单声和弦音:短暂鸣响后音量渐隐

F=2.6,Tv=200,Tf=1000
开机和弦音:三升调,按音调分 3 个阶段
1. F=2.3,Tv=200,Tf=200 2. F=2.6,Tv=200,Tf=200 3. F=2.9,Tv=100,Tf=2100
关机和弦音:三降调,按音调分 3 个阶段
1. F=2.9,Tv=200,Tf=200 2. F=2.6,Tv=200,Tf=200 3. F=2.3,Tv=100,Tf=2100
2.编程实例
MCU:STM8S903K3 开发环境:STVD 4.1.6+Cosmic 4.2.8
/* buzzer.h 文件 */
?
[Copy to clipboard]View Code C
1 2 3 4 5 6 7 8 9
#ifndef __BUZZER_H #define __BUZZER_H #include "common.h" #include "beep.h" typedef enum { MONO = 0, //单音


10 11 12 13 14 15 16 17 18 19 20 21 22 23
POLY_ON = 1, POLY_OFF = 2 }Tone_Type;
//开机和弦 //关机和弦
//蜂鸣器声音类型
typedef struct { FREQ_Type Freq; //频率
u8 OSCTime; //振荡持续时间,最小单位为 10ms u8 PWRTime; //供电持续时间,最小单位为 10ms } TONE_Def; //音调结构体
void BuzzerStart(Tone_Type ToneType); void BuzzerCtrl(void); #endif /* __BUZZER_H */
/* buzzer.c 文件 */
?
[Copy to clipboard]View Code C
1 2 3 4 5 6 7 8 9 10
#include "buzzer.h" const TONE_Def Tone1[] = {{FREQ_2K6, 100, 20},{FREQ_NO, 0, 0}};//单音 const TONE_Def Tone2[] = {{FREQ_2K3, 20, 20},{FREQ_2K6, 20, 20},{FREQ_2K9, 210, 10},{FREQ_NO, 0, 0}};//开机和弦

const TONE_Def Tone3[] = {{FREQ_2K9, 20, 20},{FREQ_2K6, 20, 20},{FREQ_2K3, 210, 10},{FREQ_NO, 0, 0}};//关机和弦


11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

TONE_Def * pTone; static u8 BuzzerStatus = 0;
//蜂鸣器启动,需要发声时调用 void BuzzerStart(Tone_Type ToneType) { switch (ToneType) { case MONO: pTone = Tone1; break; case POLY_ON: pTone = Tone2; break; case POLY_OFF: pTone = Tone3; break; default: pTone = Tone1; break; } BuzzerStatus = 0; }
//蜂鸣器控制,每 10ms 执行一次 void BuzzerCtrl(void) { static TONE_Def Tone; switch (BuzzerStatus) { case 0:


46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
Tone = *pTone; if (Tone.Freq != FREQ_NO) //非结束符 { //先判断供电持续时间 if (Tone.PWRTime != 0) { Tone.PWRTime --; BeepPwrOn(); } else { BuzzerStatus = 2; break; } //再判断振荡持续时间 if (Tone.OSCTime != 0) { Tone.OSCTime --; BEEP_SetFreq(Tone.Freq); BEEP_On(); } else { BeepPwrOff(); BuzzerStatus = 2; break; } //判断完成,开始递减计时 BuzzerStatus = 1; } else /* Tone.Freq == FREQ_NO */ //是结束符


81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
{ BuzzerStatus = 2; } break; case 1: if (Tone.PWRTime != 0) { Tone.PWRTime --; } else { BeepPwrOff(); } if (Tone.OSCTime != 0) { Tone.OSCTime --; } else { BEEP_Off(); pTone ++; //取下一个音调
BuzzerStatus = 0; } break; default: break; } }
以上代码中,BEEP_Off(),BEEP_On(),BeepPwrOff(),BEEP_SetFreq()都在头文件 beep.h 中声 明,由底层代码实现。


上层代码只需在主循环中每 10ms 调用一次 BuzzerCtrl()函数,在需要发音的地方调用一次 BuzzerStart()函数,即可实现和弦音的播放了。




思维拓展:依据以上代码的结构,可以很容易的通过定义 TONE_Def 数组实现任意节奏,任意曲调的输 出。

如下段:
?
[Copy to clipboard]View Code C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
const TONE_Def Tone4[] = {
//两只老虎(两只老虎两只老
虎 跑得快 跑得快)
{FREQ_2K, 25, 25},//1 {FREQ_2K3, 25, 25},//2 {FREQ_2K6, 25, 25},//3 {FREQ_2K, 25, 25},//1 {FREQ_2K, 25, 25},//1 {FREQ_2K3, 25, 25},//2 {FREQ_2K6, 25, 25},//3 {FREQ_2K, 25, 25},//1 {FREQ_2K3, 25, 25},//2 {FREQ_2K6, 25, 25},//3 {FREQ_2K9, 50, 25},//4 稍有停顿 {FREQ_2K3, 25, 25},//2 {FREQ_2K6, 25, 25},//3 {FREQ_2K9, 100, 25},//4 和弦效果 {FREQ_NO, 0, 0} //停止 };
当然,你可以添加一些按键,为每个按键设定一个特定音调的和弦音输出,就做成一个电子琴了,音质很 不错的哦:)。









相关主题