文档详情

蜂鸣器和弦音发声控制

飞***
实名认证
店铺
PDF
133.83KB
约10页
文档ID:35410157
蜂鸣器和弦音发声控制_第1页
1/10

蜂鸣器和弦音发声控制前言:现在一些带按键显示控制面板的家电(比较常见的是柜式空调)在按键操作 的时候会有悦耳的和弦音发出,特别是开关机或操作上下键时会有不同变调的和弦音,相比普通的嘀嘀声给人更愉悦的操作体验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 CodeC 1 2 3 4 5 6 #ifndef __BUZZER_H#define __BUZZER_H#include “common.h“#include “beep.h“typedefenum7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 {MONO =0,//单音POLY_ON =1,//开机和弦POLY_OFF = 2//关机和弦} Tone_Type;//蜂鸣器声音类型typedefstruct{FREQ_Type Freq;//频率u8 OSCTime;//振荡持续时间,最小单位为10msu8 PWRTime;//供电持续时间,最小单位为10ms} TONE_Def;//音调结构体void BuzzerStart( Tone_Type ToneType) ;void BuzzerCtrl( void) ;#endif /* __BUZZER_H *//* buzzer.c文件*/ ?[Copy to clipboard]View CodeC 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #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}} ; //关机和弦音TONE_Def * pTone;static u8 BuzzerStatus = 0;//蜂鸣器启动,需要发声时调用void BuzzerStart( Tone_Type ToneType){switch( ToneType){case MONO:pTone = Tone1;break;case POLY_ON :20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 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){39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 case0:Tone =* pTone ;if( Tone.Freq!= FREQ_NO )//非结束符{//先判断供电持续时间if( Tone.PWRTime!=0){Tone.PWRTime--;BeepPwrOn() ;}else{BuzzerStatus = 2;break;}//再判断振荡持续时间if( Tone.OSCTime!=0){Tone.OSCTime--;58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 BEEP_SetFreq( Tone.Freq ) ;BEEP_On() ;}else{BeepPwrOff() ;BuzzerStatus = 2;break;}//判断完成,开始递减计时BuzzerStatus = 1;}else/* Tone.Freq == FREQ_NO *///是结束符{BuzzerStatus = 2;}break;case1:if( Tone.PWRTime!=0)77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 {Tone.PWRTime--;}else{BeepPwrOff() ;}if( Tone.OSCTime!=0){Tone.OSCTime--;}else{BEEP_Off() ;pTone ++;//取下一个音调BuzzerStatus = 0;}break;default:96 97 break;}}以上代码中,BEEP_Off(),BEEP_On() ,BeepPwrOff(),BEEP_SetFreq()都在头文件 beep.h 中声明,由底层代码实现。

上层代码只需在主循环中每10ms 调用一次BuzzerCtrl()函数,在需要发音的地方调 用一次 BuzzerStart()函数,即可实现和弦音的播放了思维拓展 :依据以上代码的结构,可以很容易的通过定义TONE_Def数组实现任意节奏,任意曲调的输出如下段:?[Copy to clipboard]View CodeC 1 2 3 4 5 6 7 8 9 10 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 } , //211 12 13 14 15 16 17 { 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}//停止} ;当然,你可以添加一些按键,为每个按键设定一个特定音调的和弦音输出,就做成 一个电子琴了,音质很不错的哦:)。

下载提示
相似文档
正为您匹配相似的精品文档