buzzer.c
2.6 KB
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
#include "buzzer.h"
#include "tva.h"
#include "FOC.h"
#include <string.h>
// 定义一个二维数组来存储音调频率对照表
// 每一行代表一个八度,每一列代表不同的音符
NoteFrequency const play_hz[8][7] = {
// C0 - B0
{{0, 16}, {1, 18}, {2, 21}, {3, 22}, {4, 25}, {5, 28}, {6, 31}},
// C1 - B1
{{0, 33}, {1, 37}, {2, 41}, {3, 44}, {4, 49}, {5, 55}, {6, 62}},
// C2 - B2
{{0, 65}, {1, 73}, {2, 82}, {3, 87}, {4, 98}, {5, 110}, {6, 124}},
// C3 - B3
{{0, 131}, {1, 147}, {2, 165}, {3, 175}, {4, 196}, {5, 220}, {6, 247}},
// C4 - B4 (中央C开始的八度)
{{0, 262}, {1, 294}, {2, 330}, {3, 349}, {4, 392}, {5, 440}, {6, 494}},
// C5 - B5
{{0, 523}, {1, 587}, {2, 659}, {3, 699}, {4, 784}, {5, 880}, {6, 988}},
// C6 - B6
{{0, 1047}, {1, 1175}, {2, 1319}, {3, 1397}, {4, 1568}, {5, 1760}, {6, 1976}},
// C7 - B7
{{0, 2093}, {1, 2349}, {2, 2637}, {3, 2794}, {4, 3136}, {5, 3520}, {6, 3951}}
};
TimeRec_s buzzer_TimeS = {0};
uint32_t pastedTime;
volatile float Ud;
const ToneNote MelodyStart[3] = {{Octave,1,200}, {Octave,2,150}, {Octave,5,150}};
const ToneNote MelodyConnect[3] = {{Octave,1,200}, {Octave,2,150}, {Octave,5,150}};
const ToneNote MelodyEnter[2] = {{Octave,2,150}, {Octave,5,150}};
const ToneNote MelodyQuit[2] = {{Octave,5,150}, {Octave,2,150}};
void playMusic(const ToneNote *Melody,uint32_t size)
{
uint32_t hz;
uint32_t i, j;
float value;
value = foc_ULimit/foc_Udc;
for (i = 0; i < size/ sizeof(ToneNote); i++)
{
hz = play_hz[Melody[i].octave ][Melody[i].note].frequency; // 由声调获取频率
for (j = 0; j < Melody[i].play_time*hz/1000; j++)
{
if (Melody[i].octave)
{
Set_PWM(0, 0, value);
delay_us(500000 / hz);
Set_PWM(0, 0, 0);
delay_us(500000 / hz);
}
else
{
Set_PWM(0, 0, value);
delay_us(500000 / hz);
}
}
}
Set_PWM(0, 0, 0);
}
void playMusic_Ud(const ToneNote *Melody,uint32_t size)
{
static uint32_t hz;
static uint32_t i, j;
if (i < sizeof(Melody) / sizeof(Melody[0]))
{
hz = play_hz[Melody[i].octave ][Melody[i].note].frequency; // 由声调获取频率
if (j < Melody[i].play_time * hz / 1000)
{
pastedTime += TimeFlash_us(&buzzer_TimeS);
if (pastedTime > 500000 / hz)
{
if (Melody[i].octave)//暂定如果为零则代表不发声
{
if (Ud)
{
Ud = 0;
j++;
}
else
Ud = 5;
}
else
{
j++;
Ud = 0;
}
pastedTime = 0;
}
}
else
{
j = 0;
i++;
}
}else
{
i = 0;
j = 0;
pastedTime = 0;
memset(&buzzer_TimeS, 0, sizeof(TimeRec_s));
}
}