国产午夜久久无码_欧美日韩国产在线精品影院_美女被啪到深处娇喘在线观看_在线观看日本高清区_58页精品日韩欧美_国产经典一级毛片_万里长征黑料不打烊最新网站_亚洲av无码久久精品蜜桃播放_脱了美女的内裤猛烈进入gif_亚洲人成网i8禁止

歡迎訪問東莞市鳴躍電子科技有限公司官網(wǎng)
13729959073    簡(jiǎn)體中文 | 繁體中文    
東莞市鳴躍電子科技有限公司
新聞?lì)悇e

行業(yè)信息

公司新聞

常見問題

東莞市鳴躍電子科技有限公司
電話:0769-89916160
手機(jī):13729959073
傳真:0769-87790237
郵箱:peirong2005@yeah.net
地址:東莞市長(zhǎng)安鎮(zhèn)宵邊上洋管理區(qū)長(zhǎng)興三街8號(hào)
常見問題
您的位置:首頁(yè) > 常見問題 > 蜂鳴器和弦音發(fā)聲控制

蜂鳴器和弦音發(fā)聲控制

編輯:   瀏覽:1446   發(fā)布時(shí)間:2017-05-05下載完整文檔
前言:現(xiàn)在一些帶按鍵顯示控制面板的家電(比較常見的是柜式空調(diào))在按鍵操作的時(shí)候會(huì)有悅耳的和弦音發(fā)出,特別是開關(guān)機(jī)或操作上下鍵時(shí)會(huì)有不同變調(diào)的和弦音,相比普通的嘀嘀聲給人更愉悅的操作體驗(yàn)。
1.控制方式說明
此處以型號(hào)為SH2225T2PA的蜂鳴器(諧振頻率2.6KHz)為例。蜂鳴器模塊有兩個(gè)驅(qū)動(dòng)引腳與MCU相連,一個(gè)是振蕩信號(hào)輸入引腳,由MCU提供相應(yīng)頻率的方波信號(hào)驅(qū)動(dòng)蜂鳴器發(fā)聲,一個(gè)是供電控制端,供電切斷后蜂鳴器靠電解電容放電維持其發(fā)聲,會(huì)有音量漸漸變小的效果。
原理圖如下所示, MC9為供電控制端,MC8為振蕩信號(hào)輸入端。MC9為高電平時(shí),三極管Q4導(dǎo)通,然后Q2導(dǎo)通,蜂鳴器開始供電,同時(shí)電容CD2充電。若MC8有一定頻率的方波信號(hào)發(fā)出,則蜂鳴器可發(fā)出鳴叫。若此時(shí)先關(guān)掉供電,即MC9置低電平,MC8依然發(fā)出方波信號(hào),則蜂鳴器可依靠CD2放電發(fā)出聲音,但隨著電容電量減少,音量會(huì)逐漸減小,形成蜂鳴聲漸隱的和弦音效果。要實(shí)現(xiàn)變調(diào)的效果,則可通過短時(shí)間內(nèi)切換發(fā)出幾種不同頻率的蜂鳴聲來實(shí)現(xiàn)。
以下是3種比較典型的和弦音的實(shí)現(xiàn)細(xì)節(jié):(符號(hào)說明:Tf:頻率給定持續(xù)時(shí)間(ms) Tv:電壓給定持續(xù)時(shí)間(ms) F:輸出頻率(KHz))
單聲和弦音:短暫鳴響后音量漸隱
§             F=2.6,Tv=200,Tf=1000
開機(jī)和弦音:三升調(diào),按音調(diào)分3個(gè)階段
1.          F=2.3,Tv=200,Tf=200
2.          F=2.6,Tv=200,Tf=200
3.          F=2.9,Tv=100,Tf=2100
關(guān)機(jī)和弦音:三降調(diào),按音調(diào)分3個(gè)階段
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.編程實(shí)例
MCU:STM8S903K3 開發(fā)環(huán)境: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
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef __BUZZER_H
#define __BUZZER_H
 
#include "common.h"
#include "beep.h"
typedef enum
{
  MONO = 0,     //單音
  POLY_ON = 1,  //開機(jī)和弦
  POLY_OFF = 2  //關(guān)機(jī)和弦
}Tone_Type;  //蜂鳴器聲音類型
 
typedef struct
{
  FREQ_Type Freq;    //頻率
  u8 OSCTime; //振蕩持續(xù)時(shí)間,最小單位為10ms
  u8 PWRTime; //供電持續(xù)時(shí)間,最小單位為10ms
} TONE_Def; //音調(diào)結(jié)構(gòu)體
 
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
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
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#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}};//開機(jī)和弦音
const TONE_Def Tone3[] = {{FREQ_2K9, 20, 20},{FREQ_2K6, 20, 20},{FREQ_2K3, 210, 10},{FREQ_NO, 0, 0}};//關(guān)機(jī)和弦音
 
TONE_Def * pTone;
static u8 BuzzerStatus = 0;
 
//蜂鳴器啟動(dòng),需要發(fā)聲時(shí)調(diào)用
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執(zhí)行一次
void BuzzerCtrl(void)
{
  static TONE_Def Tone;
 
  switch (BuzzerStatus)
  {
    case 0:
      Tone = *pTone;
      if (Tone.Freq != FREQ_NO) //非結(jié)束符
      {
        //先判斷供電持續(xù)時(shí)間
        if (Tone.PWRTime != 0)
        {
          Tone.PWRTime --;
          BeepPwrOn();
        }
        else
        {
          BuzzerStatus = 2;
          break;
        }
        //再判斷振蕩持續(xù)時(shí)間
        if (Tone.OSCTime != 0)
        {
          Tone.OSCTime --;
          BEEP_SetFreq(Tone.Freq);
          BEEP_On();
        }
        else
        {
          BeepPwrOff();
          BuzzerStatus = 2;
          break;
        }
        //判斷完成,開始遞減計(jì)時(shí)
        BuzzerStatus = 1;
      }
      else /* Tone.Freq == FREQ_NO */ //是結(jié)束符
      {
        BuzzerStatus = 2;
      }
      break;
    case 1:
      if (Tone.PWRTime != 0)
      {
        Tone.PWRTime --;
      }
      else
      {
        BeepPwrOff();
      }
      if (Tone.OSCTime != 0)
      {
        Tone.OSCTime --;
      }
      else
      {
        BEEP_Off();
        pTone ++;   //取下一個(gè)音調(diào)
        BuzzerStatus = 0;
      }
      break;
    default:
      break;
  }
}
以上代碼中,BEEP_Off(),BEEP_On(),BeepPwrOff(),BEEP_SetFreq()都在頭文件beep.h中聲明,由底層代碼實(shí)現(xiàn)。
上層代碼只需在主循環(huán)中每10ms調(diào)用一次BuzzerCtrl()函數(shù),在需要發(fā)音的地方調(diào)用一次BuzzerStart()函數(shù),即可實(shí)現(xiàn)和弦音的播放了。
思維拓展:依據(jù)以上代碼的結(jié)構(gòu),可以很容易的通過定義TONE_Def數(shù)組實(shí)現(xiàn)任意節(jié)奏,任意曲調(diào)的輸出。如下段:
?[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} //停止
};
當(dāng)然,你可以添加一些按鍵,為每個(gè)按鍵設(shè)定一個(gè)特定音調(diào)的和弦音輸出,就做成一個(gè)電子琴了,音質(zhì)很不錯(cuò)的哦:)。

為了方便鳴躍電子與您有更深入的技術(shù)交流與提升,請(qǐng)?zhí)顚懴旅娲绑w,提交后將直接下載此完整文檔,謝謝!

稱   呼: *
性   別: 先生     女士
電   話: *
郵   箱: *
公司名:
驗(yàn)證碼:  
   
關(guān)于我們
公司簡(jiǎn)介
品質(zhì)管理
辦公環(huán)境
合作伙伴
典型案例
新聞信息
行業(yè)信息
公司新聞
常見問題
產(chǎn)品展示
喇叭系列
蜂鳴器系列
咪頭系列
聯(lián)系我們
電話:0769-89916160
手機(jī):13729959073
傳真:0769-87790237
郵箱:peirong2005@yeah.net
地址:東莞大嶺山鎮(zhèn)矮嶺冚向東街沿河西路1號(hào)5樓
掃一掃微信二維碼
版權(quán)所有©東莞市鳴躍電子科技有限公司   制作與維護(hù):星河東莞網(wǎng)頁(yè)設(shè)計(jì)   企業(yè)郵箱   站點(diǎn)地圖     粵ICP備16011160號(hào)