51单片机驱动外设蜂鸣器

51单片机驱动外设蜂鸣器

51单片机连接有源/无源蜂鸣器的驱动程序,软件特性可以在proteus上仿真,51单片机采用12MHz晶振。由于51单片机I/O输出电流较小,蜂鸣器驱动电路可添加三极管做电流放大。下面直接上代码:

蜂鸣器控制端口定义

sbit BUZZER_PORT = P2^0;    // 蜂鸣器

有源蜂鸣器驱动接口

void buzzer_enable(void);       // 使能蜂鸣器
void buzzer_disable(void);      // 关闭蜂鸣器
void buzzer_enable_ms(u32 ms);  // 打开蜂鸣器ms毫秒

使能有源蜂鸣器

本系统采用NPN型三极管驱动蜂鸣器,因此置1蜂鸣器发声,不会自动关闭。

/*******************************************************************************
* 函 数 名         : buzzer_enable
* 函数功能         : 使能蜂鸣器
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_enable(void)       // 使能蜂鸣器
{
    BUZZER_PORT = 1;
}

关闭有源蜂鸣器

本系统采用NPN型三极管驱动蜂鸣器,因此置0关闭。

/*******************************************************************************
* 函 数 名         : buzzer_disable
* 函数功能         : 关闭蜂鸣器
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_disable(void)      // 关闭蜂鸣器
{
    BUZZER_PORT = 0;
}

打开有源蜂鸣器并持续一段时间

本系统采用NPN型三极管驱动蜂鸣器,因此置1蜂鸣器发声,置0关闭。

/*******************************************************************************
* 函 数 名         : buzzer_enable_ms
* 函数功能         : 打开蜂鸣器ms毫秒
* 输    入         : ms:毫秒数
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_enable_ms(u32 ms)  // 打开蜂鸣器ms毫秒
{
    BUZZER_PORT = 1;
    buzzer_delay_ms(ms);
    BUZZER_PORT = 0;
}

无源蜂鸣器驱动接口

void buzzer_enable_passive(void);       // 使能无源蜂鸣器
void buzzer_disable_passive(void);      // 关闭无源蜂鸣器
void buzzer_enable_ms_passive(u32 ms);  // 打开无源蜂鸣器ms毫秒

使能无源蜂鸣器

本系统采用NPN型三极管驱动蜂鸣器,由于采用无源蜂鸣器,需要不间断切换蜂鸣器信号引脚状态,并使1和0状态持续一定时长,否则会自动关闭。

/*******************************************************************************
* 函 数 名         : buzzer_enable_passive
* 函数功能         : 使能无源蜂鸣器
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_enable_passive(void)       // 使能无源蜂鸣器
{
    static u8 state = 0;

    state++;
    if (state % 2 == 0) {
        BUZZER_PORT = 1;
    } else {
        BUZZER_PORT = 0;
    }
    buzzer_delay_ms(1);
}

关闭无源蜂鸣器

直接将蜂鸣器信号引脚状态置为某一确定状态即可,由于使用NPN型三极管驱动蜂鸣器,推荐置0。

/*******************************************************************************
* 函 数 名         : buzzer_disable_passive
* 函数功能         : 关闭无源蜂鸣器
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_disable_passive(void)      // 关闭无源蜂鸣器
{
    BUZZER_PORT = 0;
}

打开无源蜂鸣器并持续一段时间

持续调用使能无源蜂鸣器即可。

/*******************************************************************************
* 函 数 名         : buzzer_enable_ms_passive
* 函数功能         : 打开无源蜂鸣器ms毫秒
* 输    入         : ms:毫秒数
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_enable_ms_passive(u32 ms)  // 打开无源蜂鸣器ms毫秒
{
    for(; ms > 0; ms--) {
        buzzer_enable_passive();
    }
    buzzer_disable_passive();
}

附录 - 蜂鸣器驱动(buzzer.h)

#ifndef __BUZZER_H__
#define __BUZZER_H__

#include <reg52.h>
#include "include.h"

#ifdef ELECTRONIC_MARS
sbit BUZZER_PORT = P2^0;    // 蜂鸣器
#endif
#ifdef ELECTRONIC_MOON
sbit BUZZER_PORT = P1^5;
#endif

void buzzer_delay_ms(u16 ms);   // 52单片机12MHZ时钟,延时1ms函数
void buzzer_enable(void);       // 使能蜂鸣器
void buzzer_disable(void);      // 关闭蜂鸣器
void buzzer_enable_ms(u32 ms);  // 打开蜂鸣器ms毫秒
void buzzer_enable_passive(void);       // 使能无源蜂鸣器
void buzzer_disable_passive(void);      // 关闭无源蜂鸣器
void buzzer_enable_ms_passive(u32 ms);  // 打开无源蜂鸣器ms毫秒
void test_buzzer(void);  // buzzer测试代码

#endif

附录 - 蜂鸣器驱动(buzzer.c)

#include "buzzer.h"

/*******************************************************************************
* 函 数 名         : buzzer_delay_ms
* 函数功能         : 52单片机12MHZ时钟,延时1ms函数
* 输    入         : ms:延时ms数
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_delay_ms(u16 ms)  // 52单片机12MHZ时钟,延时1ms函数
{
    u8 i;

    for (; ms; ms--) {
        for (i = 0; i < 123; i++);
    }
}

/*******************************************************************************
* 函 数 名         : buzzer_enable
* 函数功能         : 使能蜂鸣器
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_enable(void)       // 使能蜂鸣器
{
    BUZZER_PORT = 1;
}

/*******************************************************************************
* 函 数 名         : buzzer_disable
* 函数功能         : 关闭蜂鸣器
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_disable(void)      // 关闭蜂鸣器
{
    BUZZER_PORT = 0;
}

/*******************************************************************************
* 函 数 名         : buzzer_enable_ms
* 函数功能         : 打开蜂鸣器ms毫秒
* 输    入         : ms:毫秒数
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_enable_ms(u32 ms)  // 打开蜂鸣器ms毫秒
{
    BUZZER_PORT = 1;
    buzzer_delay_ms(ms);
    BUZZER_PORT = 0;
}

/*******************************************************************************
* 函 数 名         : buzzer_enable_passive
* 函数功能         : 使能无源蜂鸣器
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_enable_passive(void)       // 使能无源蜂鸣器
{
    static u8 state = 0;

    state++;
    if (state % 2 == 0) {
        BUZZER_PORT = 1;
    } else {
        BUZZER_PORT = 0;
    }
    buzzer_delay_ms(1);
}

/*******************************************************************************
* 函 数 名         : buzzer_disable_passive
* 函数功能         : 关闭无源蜂鸣器
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_disable_passive(void)      // 关闭无源蜂鸣器
{
    BUZZER_PORT = 0;
}

/*******************************************************************************
* 函 数 名         : buzzer_enable_ms_passive
* 函数功能         : 打开无源蜂鸣器ms毫秒
* 输    入         : ms:毫秒数
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void buzzer_enable_ms_passive(u32 ms)  // 打开无源蜂鸣器ms毫秒
{
    for(; ms > 0; ms--) {
        buzzer_enable_passive();
    }
    buzzer_disable_passive();
}

/*******************************************************************************
* 函 数 名         : test_buzzer
* 函数功能         : buzzer测试代码
* 输    入         : void
* 输    出         : void
* 说    名         : none
*******************************************************************************/
void test_buzzer(void)  // buzzer测试代码
{
    while (1) {
        buzzer_enable_ms(500);
        buzzer_delay_ms(1000);
        buzzer_enable();
        buzzer_delay_ms(1000);
        buzzer_disable();
        buzzer_delay_ms(1000);
    }
}
发布了24 篇原创文章 · 获赞 53 · 访问量 3969

猜你喜欢

转载自blog.csdn.net/weixin_44413515/article/details/105152961