/* 1、此程序适用有源和无源蜂鸣器的驱动 2、可自由定义多种蜂鸣声音 3、只需传递一个参数就能达到让BUZ的声音重复响几次 4、程序结构清晰 操作方便 */ //=====蜂鸣器驱动寄存器定义===== typedef struct tBUZ { uint8 RM_BZ ; //蜂鸣器模式 uint16 T_BzFre ; //蜂鸣间隔时间 uint8 T_BBNum ; //蜂鸣器在模式下的蜂鸣次数 uint8 F_Buz ; //驱动信号标志 }tBuz ; tBuz tBz ; //定义结构体 #define RM_BZ tBz.RM_BZ #define T_BzFre tBz.T_BzFre #define T_BBNum tBz.T_BBNum #define F_Buz tBz.F_Buz //=====buz 驱动端口==== #define P_BUZ PC7_OUT #define BUZ_PCPL PC_OUT ^= SETB7 ; //BUZ IO 取反 //=====BUZ 端口操作==== 有效端口为1 0 #define OFFIO_BUZ {P_BUZ = 0 ; F_Buz = 0 ;}// #define ONIO_BUZ F_Buz = 1// //---------------------------------- #define VT_BUZ(x) (x) //宏定义 BUZ的几中常见声音 #define M_BZ (unsigned char)0 #define M_BZ_KEY (unsigned char)1 //短响 #define M_BZ_BB (unsigned char)3 //滴..滴 定时音 #define M_BZ_LKEY (unsigned char)4 //长响 #define M_BZ_ERR (unsigned char)5 //报警 //************************************* // 函数名称:SetBuz // 函数功能:设置蜂鸣器模式 // 入口参数:该模式下的蜂鸣次数 // 出口参数:无 // 返 回 值:无 //*************************************** void SetupBz(uint8 RM_BZIn,uint8 BNum) { T_BzFre = 0 ; //蜂鸣频率 T_BBNum = BNum ;//该蜂鸣模式的蜂鸣总次数 RM_BZ = RM_BZIn ; //蜂鸣模式 OFFIO_BUZ ; } //************************************* // 函数名称:CmdBuz // 函数功能:蜂鸣器控制 // 入口参数:无 // 出口参数:无 // 返 回 值:无 // 备注 :以下编写了四种常用的蜂鸣器的提示音 读者可自行修改声音及再增加声音类型 //*************************************** void CmdBz(void) { switch(RM_BZ) { case M_BZ: SetupBz(M_BZ,0); break ; //-------------------- case M_BZ_KEY: // 计1次 T_BzFre ++ ; if(T_BzFre <= VT_BUZ(10))//5 { ONIO_BUZ ; } else { SetupBz(M_BZ,0); } break ; //---------------------------- case M_BZ_BB : //定时音提示-翻炒提示音 if(T_BBNum != 0) { T_BzFre ++ ; if(T_BzFre<= VT_BUZ(20)) { ONIO_BUZ ; } else if(T_BzFre <= VT_BUZ(30)) { OFFIO_BUZ ; } else if(T_BzFre <= VT_BUZ(50)) { ONIO_BUZ ; } else if(T_BzFre <= VT_BUZ(100)) { OFFIO_BUZ ; } else { T_BzFre = 0 ; T_BBNum -- ; } } else { SetupBz(M_BZ,0); } break ; //---------------------------- case M_BZ_LKEY ://关机 长响音 if(T_BBNum != 0) { T_BzFre ++ ; if(T_BzFre <= VT_BUZ(80))//BZ_T1 { ONIO_BUZ ; } else if(T_BzFre <= VT_BUZ(100))//BZ_T2 { OFFIO_BUZ ; } else { T_BzFre = 0 ; T_BBNum -- ; } } else { SetupBz(M_BZ,0); } break ; //------------------- case M_BZ_ERR : if(T_BBNum != 0) { T_BzFre ++ ; if(T_BzFre <= VT_BUZ(12)) { ONIO_BUZ ; } else if(T_BzFre <= VT_BUZ(20)) { OFFIO_BUZ ; } else { T_BzFre = 0 ; T_BBNum -- ; } } else { SetupBz(M_BZ,0); } break ; //------------------- default : SetupBz(M_BZ,0); break ; } } //---应用实例----- void main(void) { SetupBz(M_BZ_LKEY,2) ;//上电蜂鸣器长响两声 while(1) { while(!F_10MS) ; //10MS跑一次主程序 F_10MS = 0 ; CmdBz() ; } } //中断服务程序 void interrupt server(void) { //定时125U中断一次 if(F_Buz) { BUZ_PCPL ; //BUZ 取反 针对无源BUZ -- 4K //ONIO_BUZ ; // BUZ直驱 针对有源BUZ } }