//文件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 ; }