//文件buz.h
#ifndef _BUZ_H_
#define _BUZ_H_
//SetupBzhx(M_BZ_KEY) ;
//=====buz 驱动频率定义==============
//声音结束符定义==
#define VFR0 0
#define VFR1 VP3K3
#define VFR2 VP4K1
#define VFR3 VP4K9
#define VP2K3 2609 //2k
#define VP2K6 2308
#define VP2K9 2069 //
#define VP3K3 1818//12000/2/3.3 //4K
#define VP4K1 1463//12000/2/4.1
#define VP4K9 1224//12000/2/4.9 //
//=====buz 驱动port定义==============
sbit P_BZV = P2^6 ; //BUZ 充电
sbit P_BUZ = P0^2 ; //BUZ 驱动
//=====BUZ port操作==================
#define BUZ_ON P_BUZ = 1
#define BUZ_OFF P_BUZ = 0//
#define BuzVcc_ON P_BZV = 0
#define BuzVcc_OFF P_BZV = 1
//=====蜂鸣器声音种类================
#define M_BZ (unsigned char)0 //无
#define M_BZ_KEY (unsigned char)1 //按键音
#define M_BZ_ON (unsigned char)2 //开机音
#define M_BZ_OFF (unsigned char)3 //关机音
//=====蜂鸣器工作过程状态==========
#define MBZ_RST (unsigned char)0
#define MBZ_P1 (unsigned char)1
#define MBZ_P2 (unsigned char)2
#define MBZ_P3 (unsigned char)3
#define MBZ_P4 (unsigned char)4
//=====蜂鸣器声音结构定义=====
typedef struct tBUZHX
{
uint16 BzFre ; //蜂鸣器 频率
uint8 T_BzO ; //蜂鸣间 频率输出时间
uint8 T_BzV ; //蜂鸣器 VCC供电时间
}tBuzHx ;
//====函数声明=====
extern void SetupBzhx(uint8 MBz) ;
extern void CmdBzhx(void) ;
#endif
//文件buz.c
#include "global.h"
#include "hxbuz.h"
tBuzHx *tBzHx ;
#define VTB1 20 //20
#define VTB2 6 //20
#define VTB3 100 //50
const tBuzHx Bzx0[]={{VFR0,0,0}} ;
const tBuzHx Bzx1[]={{VFR2,VTB3,VTB2},{VFR0,0,0}} ;
//const tBuzHx Bzx2[]={{VP2K3,20,20},{VP2K6,20,20},{VP2K9,210,10},{VFR0,0,0}} ;
//const tBuzHx Bzx3[]={{VP2K9,20,20},{VP2K6,20,20},{VP2K3,210,10},{VFR0,0,0}} ;
const tBuzHx Bzx2[]={{VFR1,VTB1,VTB2},{VFR2,VTB1,VTB2},{VFR3,VTB3,VTB2},{VFR0,0,0}} ;
const tBuzHx Bzx3[]={{VFR3,VTB1,VTB2},{VFR2,VTB1,VTB2},{VFR1,VTB3,VTB2},{VFR0,0,0}} ;
uint8 RBzStatus = 0 ;
//***************************************
// 函数名称:SetupBzhx
// 函数功能:设置蜂鸣器模式
// 入口參数:该模式下的蜂鸣次数 蜂鸣相关数据清0
// 出口參数:无
// 返 回 值:无
//***************************************
void SetupBzhx(uint8 MBz)
{
RBzStatus = MBZ_P1 ;
BuzVcc_OFF ;
BUZ_OFF ;
TIMER5_IE_DIS ;
switch(MBz)
{
case M_BZ_KEY:
tBzHx = Bzx1 ;
break ;
case M_BZ_ON:
tBzHx = Bzx2 ;
break ;
case M_BZ_OFF:
tBzHx = Bzx3 ;
break ;
default :
tBzHx = Bzx0 ;
RBzStatus = MBZ_RST ;
break ;
}
}
//*************************************
// 函数名称:CmdBzhx
// 函数功能:蜂鸣器控制 -
// 入口參数:无
// 出口參数:无
// 返 回 值:无
//***************************************
void CmdBzhx(void)
{
static tBuzHx Bx1 ;
switch(RBzStatus)
{
case MBZ_P1 :
Bx1 = *tBzHx ;
Timer5_Reload(Bx1.BzFre) ;//设置频率
if(Bx1.BzFre != VFR0) //非结束符
{
RBzStatus = MBZ_P2 ;
if(Bx1.T_BzV != 0)
{
Bx1.T_BzV -- ;
BuzVcc_ON ;
}
else
{
// BuzVcc_OFF ;
}
if(Bx1.T_BzO != 0)
{
Bx1.T_BzO -- ;
TIMER5_IE_ENB ;
}
else
{
// TIMER5_IE_DIS ;
}
}
else //为结束符
{
RBzStatus = MBZ_RST ;
}
break ;
case MBZ_P2 :
if(Bx1.T_BzV != 0)
{
Bx1.T_BzV -- ;
BuzVcc_ON ;
}
else
{
BuzVcc_OFF ;
}
if(Bx1.T_BzO != 0)
{
Bx1.T_BzO -- ;
TIMER5_IE_ENB ;
}
else
{
TIMER5_IE_DIS ;
BUZ_OFF ;
tBzHx ++ ; //取下一个音调
RBzStatus = MBZ_P1 ;
}
break ;
default :
break ;
}
}
//======简易例程===========
void main(void)
{
Delay() ;
SetupBzhx(M_BZ_KEY) ; //调用音调程序-按键音
while(1)
{
if(F_10MS)
{
F_10MS = 0 ;
CmdBzhx() ; //10MS调用一次程序
}
}
}
//-----定时器5中断程序------- 产生所须要的频率
// [定时器5中断入口]
void Timer5Interrupt() interrupt 1 //timer5
{
// P0 ^= SETB3 ;
Bank1;
ClrTF5 ; //Bank1;
Bank0;
P_BUZ ^= P_BUZ ;
}
转载于:https://www.cnblogs.com/mfrbuaa/p/5243067.html