1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
/******************************************************************************
文 件 名:Buzzer.c
功能描述:蜂鸣器驱动库文件
作 者:张暄
版 本:V1.0
日 期:2016.5.18
******************************************************************************/
#include "Buzzer.h"
#include "TimerB.h"
#define BUZZER_PWM_CHANNEL TIMERB_0_CH11
/******************************************************************************
单音列表
******************************************************************************/
const SingleSoundStruct SingleSound[] =
{
{2381, 210 , 23, 0}, //Tic
{2174, 230, 41, 0}, //Tac
{200, 600, 7812, 1500}, //Dong
{ 75, 380, 7844, 1000}, //Pling
{ 96, 180, 5755, 1000}, //Plong
{127, 640, 1094, 1094}, //Park Beep
};
/******************************************************************************
复合音列表
******************************************************************************/
const ComplexSoundStruct ComplexSound[] =
{
{{BUZZER_SINGLE_SOUND_TIC}, 1}, //Tic
{{BUZZER_SINGLE_SOUND_TAC}, 1}, //Tac
{{BUZZER_SINGLE_SOUND_DONG}, 1}, //Dong
{{BUZZER_SINGLE_SOUND_PLING}, 1}, //Pling
{{BUZZER_SINGLE_SOUND_PLONG}, 1}, //Plong
{{BUZZER_SINGLE_SOUND_PARK_BEEP}, 1}, //Park Beep
{{BUZZER_SINGLE_SOUND_PLING, BUZZER_SINGLE_SOUND_PLONG}, 2}, //Pling-Plong
};
/******************************************************************************
全局变量f
******************************************************************************/
uint8_t BuzzerSoundPlayStat;
uint8_t BuzzerSoundUpdate;
uint8_t * pBuzzerSoundID;
uint8_t BuzzerSoundCnt;
uint16_t BuzzerPrechargeTimer;
uint16_t BuzzerSoundPlayTime;
uint16_t BuzzerSoundFadeOutTime;
TrackInfoStruct BuzTrack[BUZZER_TRACK_CNT];
/******************************************************************************
函数名:Buzzer_Track_Play
功 能:蜂鸣器播放某一音轨
如果同一时间内有两条或多条音轨同时被播放,只有音轨编号较大的音轨将被播放
出来
参 数:TrackID :音轨编号
返回值:无
******************************************************************************/
void Buzzer_Track_Play ( uint8_t TrackID )
{
BuzTrack[TrackID].RepeatTimer = 0;
if ( BuzTrack[TrackID].RepeatNum == 0 )
BuzTrack[TrackID].Mode = BUZZER_SOUND_PLAY_NONSTOP;
else
BuzTrack[TrackID].Mode = BUZZER_SOUND_PLAY_REPEAT;
}
/******************************************************************************
函数名:Buzzer_Track_Pause
功 能:蜂鸣器暂停播放某一音轨
参 数:TrackID :音轨编号
返回值:无
******************************************************************************/
void Buzzer_Track_Pause ( uint8_t TrackID )
{
BuzTrack[TrackID].Mode = BUZZER_SOUND_PLAY_IDLE;
}
/******************************************************************************
函数名:Buzzer_Track_Pause
功 能:蜂鸣器停止播放某一音轨
参 数:TrackID :音轨编号
返回值:无
******************************************************************************/
void Buzzer_Track_Stop ( uint8_t TrackID )
{
BuzTrack[TrackID].Mode = BUZZER_SOUND_PLAY_IDLE;
BuzTrack[TrackID].RepeatCnt = BuzTrack[TrackID].RepeatNum;
}
/******************************************************************************
函数名:Buzzer_Stop_All_Track
功 能:停止播放所有音轨
参 数:无
返回值:无
******************************************************************************/
void Buzzer_Stop_All_Track ( void )
{
uint8_t i;
for ( i = 0; i < BUZZER_TRACK_CNT; i++ )
{
BuzTrack[i].Mode = BUZZER_SOUND_PLAY_IDLE;
BuzTrack[i].RepeatCnt = BuzTrack[i].RepeatNum;
}
}
/******************************************************************************
函数名:Buzzer_Get_Track_Status
功 能:获取蜂鸣器某一音轨的状态
参 数:TrackID :音轨编号
返回值:0 - 空闲 1 - 播放中
******************************************************************************/
uint8_t Buzzer_Get_Track_Status ( uint8_t TrackID )
{
if ( BuzTrack[TrackID].Mode == BUZZER_SOUND_PLAY_IDLE )
return 0;
else
return 1;
}
/******************************************************************************
函数名:Buzzer_Get_All_Track_Status
功 能:获取蜂鸣器全部音轨的状态
参 数:无
返回值:0 - 空闲 1 - 有某一音轨播放中
******************************************************************************/
uint8_t Buzzer_Get_All_Track_Status ( void )
{
uint8_t i;
i = BUZZER_TRACK_CNT;
while ( i )
{
i--;
if ( BuzTrack[i].Mode != BUZZER_SOUND_PLAY_IDLE )
return 1;
}
return 0;
}
/******************************************************************************
函数名:Buzzer_Get_Track_Remaining_Repeat_Num
功 能:获取蜂鸣器某一音轨的剩余重复次数
参 数:TrackID :音轨编号
返回值:当返回值 大于0 时表示剩余的重复次数
当返回值 等于0 时 且 该音轨正在播放中 表示当前音轨处于不停的播放状态
******************************************************************************/
uint8_t Buzzer_Get_Track_Remaining_Repeat_Num ( uint8_t TrackID )
{
return BuzTrack[TrackID].RepeatCnt;
}
/******************************************************************************
函数名:Buzzer_Set_Track_Remaining_Repeat_Num
功 能:重新设定蜂鸣器某一音轨的剩余重复次数
参 数:TrackID :音轨编号
RepeatNum :重复次数
返回值:无
******************************************************************************/
void Buzzer_Set_Track_Remaining_Repeat_Num ( uint8_t TrackID, uint8_t RepeatNum )
{
BuzTrack[TrackID].RepeatCnt = RepeatNum;
}
/******************************************************************************
函数名:Buzzer_Track_Init
功 能:蜂鸣器单音连续播放
参 数:TrackID :音轨编号,编号数越大,优先级越高
SoundID :播放的声音的ID
RepeatNum :重复播放次数,0表示不停的播放直到调用停止播放函数为止
RepeatCycle:重复播放周期,周期 = RepeatCycle * 20ms
返回值:无
******************************************************************************/
void Buzzer_Track_Init ( uint8_t TrackID, uint8_t SoundID, uint8_t RepeatNum, uint8_t RepeatCycle )
{
BuzTrack[TrackID].Mode = BUZZER_SOUND_PLAY_IDLE;
BuzTrack[TrackID].SoundID = SoundID;
BuzTrack[TrackID].RepeatNum = RepeatNum;
BuzTrack[TrackID].RepeatCnt = RepeatNum;
BuzTrack[TrackID].RepeatCycle = RepeatCycle;
}
/******************************************************************************
函数名:Buzzer_Track_Play_Service
功 能:蜂鸣器音轨播放服务函数,用于蜂鸣器播放音轨的后台控制
参 数:无
返回值:无
******************************************************************************
注 意:该服务函数必须每20ms被调用一次
******************************************************************************/
void Buzzer_Track_Play_Service ( void )
{
uint8_t i;
i = BUZZER_TRACK_CNT;
while ( i )
{
i--;
if ( BuzTrack[i].Mode != BUZZER_SOUND_PLAY_IDLE )
{
if ( BuzTrack[i].RepeatTimer == 0 )
{
Buzzer_Play_Sound ( BuzTrack[i].SoundID );
BuzTrack[i].RepeatTimer = BuzTrack[i].RepeatCycle;
if ( BuzTrack[i].Mode == BUZZER_SOUND_PLAY_REPEAT )
{
BuzTrack[i].RepeatCnt--;
if ( BuzTrack[i].RepeatCnt == 0 )
{
BuzTrack[i].Mode = BUZZER_SOUND_PLAY_IDLE;
BuzTrack[i].RepeatCnt = BuzTrack[i].RepeatNum;
}
}
}
else
BuzTrack[i].RepeatTimer--;
return;
}
}
}
/******************************************************************************
函数名:Buzzer_Play_Sound
功 能:控制蜂鸣器播放一个复合音
参 数:播放的声音的ID
返回值:无
******************************************************************************/
void Buzzer_Play_Sound ( uint8_t SoundID )
{
if ( BuzzerSoundPlayStat != 0 ) //(如果当前有声音在播放)打断当前声音播放
{
TimerB_PWM_Channel_Stop(BUZZER_PWM_CHANNEL);
LINE_BUZZER = 1;
BuzzerSoundPlayStat = 0;
BuzzerPrechargeTimer = 640;//500; //这时电容可能未充满电,需要一段预充电时间
}
else
BuzzerPrechargeTimer = 0; //首次播放不需要预充电
BuzzerSoundUpdate = 1;
pBuzzerSoundID = (uint8_t *)ComplexSound[SoundID].SoundTable;
BuzzerSoundCnt = ComplexSound[SoundID].SoundCnt;
//播放声音
BuzzerSoundPlayStat = 1;
}
/******************************************************************************
函数名:Buzzer_Init
功 能:蜂鸣器播放初始化程序
参 数:无
返回值:无
******************************************************************************/
void Buzzer_Init ( void )
{
LINE_BUZZER = 0;
TimerB_PWM_Channel_Stop(BUZZER_PWM_CHANNEL);
TimerB_PWM_Channel_Init(BUZZER_PWM_CHANNEL, TIMERB_CLOCK_0, TIMERB_HIGH);
BuzzerSoundPlayStat = 0;
}
/******************************************************************************
函数名:Buzzer_Shutdown
功 能:关闭蜂鸣器
参 数:无
返回值:无
******************************************************************************/
void Buzzer_Shutdown ( void )
{
LINE_BUZZER = 0;
TimerB_PWM_Channel_Stop(BUZZER_PWM_CHANNEL);
BuzzerSoundPlayStat = 0;
}
/******************************************************************************
函数名:Buzzer_Play_ISR
功 能:蜂鸣器播放中断服务函数
参 数:无
返回值:无
******************************************************************************
注 意:该服务函数必须嵌入到64us定时中断内
******************************************************************************/
void Buzzer_Play_ISR ( void )
{
if ( BuzzerSoundPlayStat )
{
if ( BuzzerPrechargeTimer )
BuzzerPrechargeTimer--;
else
{
if ( BuzzerSoundUpdate )
{
TimerB_PWM_Channel_Fre_Set(BUZZER_PWM_CHANNEL, SingleSound[*pBuzzerSoundID].Freq, SingleSound[*pBuzzerSoundID].Duty);
//TimerB_PWM_Channel_Duty_Set(BUZZER_PWM_CHANNEL, SingleSound[*pBuzzerSoundID].Duty);
TimerB_PWM_Channel_Start(BUZZER_PWM_CHANNEL);
BuzzerSoundPlayTime = SingleSound[*pBuzzerSoundID].PlayTime;
BuzzerSoundFadeOutTime = SingleSound[*pBuzzerSoundID].FadeOutTime;
BuzzerSoundUpdate = 0;
}
BuzzerSoundPlayTime--;
if ( BuzzerSoundPlayTime < BuzzerSoundFadeOutTime )
LINE_BUZZER = 0;
if ( BuzzerSoundPlayTime == 0 )
{
LINE_BUZZER = 1; //重新对蜂鸣器电容充电
TimerB_PWM_Channel_Stop(BUZZER_PWM_CHANNEL); //关闭蜂鸣器频率输出
BuzzerSoundCnt--;
if ( BuzzerSoundCnt )
{
BuzzerPrechargeTimer = 640 ;//500; //增加预充电时间32ms
BuzzerSoundUpdate = 1;
pBuzzerSoundID++;
}
else
BuzzerSoundPlayStat = 0;
}
}
}
}
void Warning_Sound_Init ( void )
{
Buzzer_Track_Init ( 0, BUZZER_SOUND_TIC, 1, 25 ); // Track0 Tic x1 @500ms 转向灯上升沿
Buzzer_Track_Init ( 1, BUZZER_SOUND_TAC, 1, 25 ); // Track1 Tac x1 @500ms 转向灯下降沿
Buzzer_Track_Init ( 2, BUZZER_SOUND_PLING, 120, 48 ); // Track2 Pling x120 @1000ms 安全带
Buzzer_Track_Init ( 3, BUZZER_SOUND_PLING, 5, 48 ); // Track3 Pling x∞ @1000ms 超速
Buzzer_Track_Init ( 4, BUZZER_SOUND_DONG , 60, 48 ); // Track4 Dong x60 @1000ms 门开
Buzzer_Track_Init ( 5, BUZZER_SOUND_DONG , 60, 48 ); // Track5 Dong x60 @1000ms 手刹
Buzzer_Track_Init ( 6, BUZZER_SOUND_DONG , 0, 48 ); // Track6 Dong x∞ @1000ms 小灯未关
Buzzer_Track_Init ( 7, BUZZER_SOUND_PLING_PLONG , 3, 50 ); // Track7 Pling-Plong x3 @1900ms 通用
Buzzer_Track_Init ( 8, BUZZER_SOUND_DONG , 3, 50 ); // Track8 Dong x3 @1000ms 通用
Buzzer_Track_Init ( 9, BUZZER_SOUND_PARK_BEEP , 0, 48 ); // Track8 Park Beep x∞ @1000ms 雷达
}