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);
}
}