1

【代码】蜂鸣器FlowerDance

 1 year ago
source link: https://en.loli.fj.cn/2022/12/02/%E8%9C%82%E9%B8%A3%E5%99%A8FlowerDance/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【代码】蜂鸣器FlowerDance

2022-12-022022-12-03

蜂鸣器FlowerDance
接线方式:蜂鸣器一端接P1.0,另一端接电源正极

#include<8052.h>

// 存放寄存器高位
unsigned int h;
// 存放寄存器低位
unsigned int l;

void init()
{
// 指定开启定时计数器0中断
IE = 0x82;
// 为定时/计数器0指定模式
// 指定门控信号为软件开启
// 指定工作在定时模式
// 指定工作方式3
TMOD = 0x01;
}

void delay(unsigned int ms)
{
unsigned int j;
while (ms--)
for (j = 600; j > 0; j--);
}

void main(void)
{
init();
// 初始蜂鸣器
P1_0 = 1;

// C大调中音7音阶数组
__code unsigned int pitch[] = {
262, 294, 330, 349, 392, 440, 494,
523, 587, 659, 698, 784, 880, 988,
1046, 1175, 1318, 1397, 1568, 1760, 1976,
2092, 2350, 2636, 2794, 3136, 3520, 3952,
0};
// 每次蜂鸣器发声的音调
__code unsigned int tone[] = {
17, 16, 20, 16, 17, 16, 13, 16,
17, 16, 20, 16, 17, 16, 13, 16,
17, 16, 20, 16, 17, 16, 13, 16,
17, 16, 20, 16, 17, 16, 13, 16,
17, 16, 20, 16, 17, 16, 13, 16,
17, 16, 20, 16, 17, 16, 13, 16,
17, 16, 20, 16, 17, 16, 20, 16,
17,
17, 29, 13, 15, 16, 16, 19,
16, 21, 20, 19, 20, 24,
20, 24, 23, 24, 21, 19,
20, 29, 24,
17, 29, 13, 15, 17, 16, 19,
16, 19, 20, 21, 22, 21, 20, 19,
20, 24, 23, 24, 20, 24, 23, 24, 20, 24, 23, 24, 20, 24, 23, 24,
20, 24, 22, 24, 20, 24, 22, 24, 20, 24, 22, 24, 20, 17,
22, 21, 22, 23, 21, 20, 19, 17, 19,
20, 19, 20, 22, 19, 18, 17, 17, 19,
18, 17, 16, 18, 17, 16, 15, 17,
16, 15, 14, 13, 12, 13, 14, 10,
15, 14, 15, 16, 14, 13, 12, 10, 12,
13, 12, 13, 15, 12, 11, 10, 10, 12,
11, 18, 17, 16, 15, 14, 17, 16, 15, 14,
13, 17, 12, 17, 13,
17, 29, 13, 15, 17, 16, 19,
16, 21, 20, 19, 20, 24,
20, 24, 23, 24, 21, 19,
20, 29, 17,
17, 29, 13, 15, 17, 16, 19,
16, 19, 20, 21, 22, 21, 20, 19,
20, 24, 23, 24, 20, 24, 23, 24, 20, 24, 23, 24, 20, 24, 23, 24,
20, 24, 22, 24, 20, 24, 22, 24, 20, 24, 22, 24, 20, 17,
17, 29, 13, 15, 17, 16, 19,
16, 21, 20, 19, 20, 24,
20, 24, 23, 24, 21, 19,
20, 29, 17,
17, 29, 13, 15, 17, 16, 19,
16, 15, 20, 21, 17, 22, 16, 21, 16, 20, 14, 19,
20, 24, 23, 24, 20, 24, 23, 24, 20, 24, 23, 24, 20, 24, 23, 24,
20, 24, 22, 24, 20, 24, 22, 24, 20, 24, 22, 24, 20, 17,
22, 21, 22, 23, 21, 20, 19, 17, 19,
20, 19, 20, 22, 19, 18, 17, 17, 19,
18, 17, 16, 18, 17, 16, 15, 17,
16, 15, 14, 13, 12, 13, 14, 10,
15, 14, 15, 16, 14, 13, 12, 10, 12,
13, 12, 13, 15, 12, 11, 10, 10, 12,
11, 18, 17, 16, 15, 14, 17, 16, 15, 14,
13, 17, 12, 17, 13,
20, 13, 15, 17, 20, 13, 15, 17, 21, 16, 17, 20, 21, 16, 22, 21,
20, 17, 22, 17, 21, 17, 19, 17, 20, 13, 19, 13, 17, 13, 19, 13,
20, 13, 15, 17, 20, 13, 15, 17, 21, 16, 17, 20, 21, 16, 22, 21,
20, 15, 22, 15, 23, 16, 24, 17, 23, 16, 22, 20,
20, 13, 15, 17, 20, 13, 15, 17, 21, 16, 17, 20, 21, 16, 22, 21,
20, 17, 22, 17, 21, 17, 19, 17, 20, 13, 19, 13, 17, 13, 19, 13,
20, 13, 15, 17, 20, 13, 15, 17, 21, 16, 17, 20, 21, 16, 22, 21,
20, 29, 20,
17, 16, 20, 16, 17, 16, 13, 16,
17, 16, 20, 16, 17, 16, 13, 16,
17, 16, 16, 20, 16, 17, 16, 13, 16,
17, 16, 20, 16, 17, 16, 13, 16,
17, 16, 20, 16, 17, 16, 13, 16,
17, 16, 20, 16, 17, 16, 13, 16,
17, 16, 16, 20, 16, 17, 16, 13, 16,
17, 16, 20, 16, 17, 16, 13, 16
};
// 每次音调响的时长
__code unsigned int rhythm[] = {
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
12,
4, 1, 1, 1, 1, 4, 4,
3, 1, 3, 1, 4, 4,
4, 4, 3, 1, 2, 2,
12, 2, 2,
4, 1, 1, 1, 1, 4, 4,
2, 2, 2, 2, 2, 2, 2, 2,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
2, 2, 2, 2, 2, 2, 2, 1, 1,
2, 2, 2, 2, 2, 2, 2, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 1, 1,
2, 2, 2, 2, 2, 2, 2, 1, 1,
2, 1, 1, 1, 1, 2, 2, 2, 2, 2,
2, 2, 2, 2, 8,
4, 1, 1, 1, 1, 4, 4,
3, 1, 3, 1, 4, 4,
4, 4, 2, 2, 2, 2,
12, 2, 2,
4, 1, 1, 1, 1, 4, 4,
2, 2, 2, 2, 2, 2, 2, 2,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
4, 1, 1, 1, 1, 4, 4,
3, 1, 3, 1, 4, 4,
4, 4, 2, 2, 2, 2,
12, 2, 2,
4, 1, 1, 1, 1, 4, 4,
2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
2, 2, 2, 2, 2, 2, 2, 1, 1,
2, 2, 2, 2, 2, 2, 2, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 1, 1,
2, 2, 2, 2, 2, 2, 2, 1, 1,
2, 1, 1, 1, 1, 2, 2, 2, 2, 2,
2, 2, 2, 2, 8,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 2,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
12, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
1, 1, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2,
1, 1, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 34
};
// 累加器
unsigned char i = 0;

while (1)
{
h = (65536 - 1000000/pitch[tone[i] - 1]/2) / 256;
l = (65536 - 1000000/pitch[tone[i] - 1]/2) % 256;
// 为定时/计数器0指定时间初值(1ms=1000次)
TH0 = h;
TL0 = l;
// 为定时/计数器0开启计数
TR0 = 1;
delay(rhythm[i] * 300);
// 为定时/计数器0关闭计数
TR0 = 0;
// 蜂鸣器断电
P1_0 = 0;
// 累加器增加
i += 1;
i %= sizeof(tone)/sizeof(tone[0]);
}
}

void timer0(void) __interrupt 1
{
// 阻止计数
TR0 = 0;

// 业务代码
if (P1_0) P1_0 = 0;
else P1_0 = 1;

// 重新指定计数初值
TH0 = h;
TL0 = l;
// 恢复计数
TR0 = 1;
}

原创力文档——ppiano


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK