单片机蜂鸣器和弦音

目录

前言

电路设计

原理说明

软件设计

头文件buz.h代码

buz.c代码


前言

现在一些家电(空调,风扇,加湿器)按键时有悦耳的和弦音发出,特别是开关机或操作上下键时会有不同变调的和弦音,相比普通的嘀嘀声给人更愉悦的操作体验。

电路设计

原理说明

BUZ引脚负责输出PWM方波,BZV引脚负责充电控制。

例如,要发出“叮”的一声,在BUZ输出4KHz方波200ms,BZV输出低电平50ms。

先对电容充电;50ms后,BZV输出低电平,无源蜂鸣器由电容来提供驱动电流。

随著电容放电,声音逐渐减弱,产生类似风铃尾音的效果。

200ms后,关闭BUZ的输出。

变化不同频率,不同的时间,产生丰富和弦。

软件设计

头文件buz.h代码

//==========================================================
#ifndef _buz1_h_
#define _buz1_h_
//==========================================================
#define VTB0 0
#define VTB1 8
#define VTB2 20
#define VTB3 100

#define VPOFF 0
#define VP3K3 2424
#define VP4K1 1951
#define VP4K9 1632
//==========================================================
#define P_BZV PB4 //BUZ 充电
#define P_BUZ PC3 //BUZ 驱动
#define BUZ_ON FlagBuz = 1
#define BUZ_OFF FlagBuz = 0
#define BZV_ON P_BZV = 0
#define BZV_OFF P_BZV = 1
//==========================================================
typedef enum
{
    BZ_NO = 0, //关
    BZ_KEY,    //按键音
    BZ_ON,     //开机音
    BZ_OFF,    //关机音
    BZ_ERR,    //报警音
    BZ_PON,
} BUZ_MODE;
//==========================================================
extern bit FlagBuz;
//==========================================================
extern void BuzHz_In(u8 mode);
extern void Buz_Drive(void);
//==========================================================
#endif
//==========================================================

buz.c代码

//==========================================================
#include "main.h"
//==========================================================
bit FlagBuz;
//==========================================================
typedef struct
{
    u16 Fre; //蜂鸣器 频率
    u8 VOn;  //蜂鸣器 VCC供电时间
    u8 On;   //蜂鸣间 频率输出时间
} BUZS;
//==========================================================
BUZS BuzD1;
//==========================================================
enum
{
    BUZEND = 0,
    BUZSTART = 1,
    BUZING = 2,
} BuzState;
//==========================================================
const BUZS *BuzDP; //列表指针
//==========================================================
const BUZS BuzTabKey[] = {
    {VP4K1, VTB1, VTB2},
    {VPOFF, VTB0, VTB0}};
const BUZS BuzTabOn[] = {
    {VP3K3, VTB1, VTB2},
    {VP4K1, VTB1, VTB2},
    {VP4K9, VTB1, VTB3},
    {VPOFF, VTB0, VTB0}};
const BUZS BuzTabOff[] = {
    {VP4K9, VTB1, VTB2},
    {VP4K1, VTB1, VTB2},
    {VP3K3, VTB1, VTB3},
    {VPOFF, VTB0, VTB0}};
const BUZS BuzTabErr[] = {
    {VP4K1, VTB1, VTB3},
    {VP4K1, VTB1, VTB3},
    {VP4K1, VTB1, VTB3},
    {VPOFF, VTB0, VTB0}};
const BUZS BuzTabPon[] = {
    {VP4K1, VTB2, VTB3},
    {VPOFF, VTB0, VTB0}};
//==========================================================
//蜂鸣器一次参数输入
//指针指向对应的表取对应的时间
//==========================================================
void BuzHz_In(u8 mode)
{
    switch (mode)
    {
    case BZ_KEY:
        BuzDP = BuzTabKey;
        break;
    case BZ_ON:
        BuzDP = BuzTabOn;
        break;
    case BZ_OFF:
        BuzDP = BuzTabOff;
        break;
    case BZ_ERR:
        BuzDP = BuzTabErr;
        break;
    case BZ_PON:
        BuzDP = BuzTabPon;
        break;
    default:
        BuzState = BUZEND;
        break;
    }
    BuzState = BUZSTART;
}
//==========================================================
//BUZ的PWM是T1中断反转电平
//设置T1中断周期
//==========================================================
void Buz_Cycle(u16 Cycle)
{
    T1UIE = 1;
    TIM1ARRH = (Cycle - 1) >> 8;   //周期
    TIM1ARRL = (Cycle - 1) & 0xFF; //
}
//==========================================================
//蜂鸣器计时函数10ms调用
//==========================================================
void Buz_Drive(void)
{
    switch (BuzState)
    {
    case BUZEND: //结束
        T1UIE = 0;
        BZV_OFF;
        BUZ_OFF;
        break;
    case BUZSTART:              //开始
        BuzD1 = *BuzDP;         //取音调数据
        if (BuzD1.Fre != VPOFF) //非结束符
        {
            BuzState = BUZING;
            Buz_Cycle(BuzD1.Fre); //设置频率
        }
        else
            BuzState = BUZEND;
        break;
    case BUZING: //响中
        if (BuzD1.VOn != 0)
        {
            BuzD1.VOn--;
            BZV_ON;
        }
        else
        {
            BZV_OFF;
        }
        if (BuzD1.On != 0)
        {
            BuzD1.On--;
            FlagBuz = 1;
        }
        else
        {
            BUZ_OFF;
            BuzDP++;             //指向下一个
            BuzState = BUZSTART; //
        }
        break;
    default:
        BuzState = BUZEND;
        break;
    }
}
//==========================================================

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值