【Proteus仿真】51单片机驱动蜂鸣器播放《天空之城》

【Proteus仿真】51单片机驱动蜂鸣器播放《天空之城》


  • Proteus仿真电路

由于是音乐播放,无法展示其声音。

在这里插入图片描述

主程序代码

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
#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"

//蜂鸣器端口定义
sbit Buzzer=P1^5;

//播放速度,值为四分音符的时长(ms)
#define SPEED 500

//音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#
#define P 0
#define L1 1
#define L1\_ 2
#define L2 3
#define L2\_ 4
#define L3 5
#define L4 6
#define L4\_ 7
#define L5 8
#define L5\_ 9
#define L6 10
#define L6\_ 11
#define L7 12
#define M1 13
#define M1\_ 14
#define M2 15
#define M2\_ 16
#define M3 17
#define M4 18
#define M4\_ 19
#define M5 20
#define M5\_ 21
#define M6 22
#define M6\_ 23
#define M7 24
#define H1 25
#define H1\_ 26
#define H2 27
#define H2\_ 28
#define H3 29
#define H4 30
#define H4\_ 31
#define H5 32
#define H5\_ 33
#define H6 34
#define H6\_ 35
#define H7 36

//索引与频率对照表
unsigned int FreqTable[]={
0,
63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
};

//乐谱
unsigned char code Music[]={
//音符,时值,

//1
P, 4,
P, 4,
P, 4,
M6, 2,
M7, 2,

H1, 4+2,
M7, 2,
H1, 4,
H3, 4,

M7, 4+4+4,
M3, 2,
M3, 2,

//2
M6, 4+2,
M5, 2,
M6, 4,
H1, 4,

M5, 4+4+4,
M3, 4,

M4, 4+2,
M3, 2,
M4, 4,
H1, 4,

//3
M3, 4+4,
P, 2,
H1, 2,
H1, 2,
H1, 2,

M7, 4+2,
M4_,2,
M4_,4,
M7, 4,

M7, 8,
P, 4,
M6, 2,
M7, 2,

//4
H1, 4+2,
M7, 2,
H1, 4,
H3, 4,

M7, 4+4+4,
M3, 2,
M3, 2,

M6, 4+2,
M5, 2,
M6, 4,
H1, 4,

//5
M5, 4+4+4,
M2, 2,
M3, 2,

M4, 4,
H1, 2,
M7, 2+2,
H1, 2+4,

H2, 2,
H2, 2,
H3, 2,
H1, 2+4+4,

//6
H1, 2,
M7, 2,
M6, 2,
M6, 2,
M7, 4,
M5_,4,


M6, 4+4+4,
H1, 2,
H2, 2,

H3, 4+2,
H2, 2,
H3, 4,
H5, 4,

//7
H2, 4+4+4,
M5, 2,
M5, 2,

H1, 4+2,
M7, 2,
H1, 4,
H3, 4,

H3, 4+4+4+4,

//8
M6, 2,
M7, 2,
H1, 4,
M7, 4,
H2, 2,
H2, 2,

H1, 4+2,
M5, 2+4+4,

H4, 4,
H3, 4,
H3, 4,
H1, 4,

//9
H3, 4+4+4,
H3, 4,

H6, 4+4,
H5, 4,
H5, 4,

H3, 2,
H2, 2,
H1, 4+4,
P, 2,
H1, 2,

//10
H2, 4,
H1, 2,
H2, 2,
H2, 4,
H5, 4,

H3, 4+4+4,
H3, 4,

H6, 4+4,
H5, 4+4,

//11
H3, 2,
H2, 2,
H1, 4+4,
P, 2,
H1, 2,

H2, 4,
H1, 2,
H2, 2+4,
M7, 4,

M6, 4+4+4,
P, 4,

0xFF //终止标志
};

unsigned char FreqSelect,MusicSelect;

void main()
{
Timer0Init();
while(1)
{
if(Music[MusicSelect]!=0xFF) //如果不是停止标志位
{
FreqSelect=Music[MusicSelect]; //选择音符对应的频率
MusicSelect++;
Delay(SPEED/4\*Music[MusicSelect]); //选择音符对应的时值
MusicSelect++;
TR0=0;
Delay(5); //音符间短暂停顿
TR0=1;
}
else //如果是停止标志位
{
TR0=0;
while(1);
}
}
}

void Timer0\_Routine() interrupt 1
{
if(FreqTable[FreqSelect]) //如果不是休止符
{
/\*取对应频率值的重装载值到定时器\*/
TL0 = FreqTable[FreqSelect]%256; //设置定时初值
TH0 = FreqTable[FreqSelect]/256; //设置定时初值
Buzzer=!Buzzer; //翻转蜂鸣器IO口
}
}


程序源码

1
2
3
链接:https://pan.baidu.com/s/1eQB-ckYFw0MG9CpptNNu3Q 
提取码:whd9


心简单,世界就简单,幸福才会生长;心自由,生活就自由,到哪都有快乐。生活再不如人意,都要学会自我温暖和慰藉,给自己多一点欣赏和鼓励。我们的生存背景大多是冷色的,逼迫着我们在危机中奋进,在两难中抉择,在困惑中放弃。