80S52:无源蜂鸣器模块
功能:嗡嗡叫发声
这个无源蜂鸣器的操作非常水所以我也水过去好了
先上电路连接图(Proteus仿真):
从图中可见我们能操作的也就P3.3一个端口,只要不停地输出0,1,0,1就能让蜂鸣器振动发声,那么如何发出美妙的声音呢,只要在0和1的变换之间插入不同长度的延时就能做到音阶的变化,本人不懂乐理,更搞不清楚具体要延时几微秒,但可以问度娘手动滑稽。
然后看到了大佬们惊为天人的作品:
基于T0定时/计数器的最炫民族风。。。
#include<reg52.h>
sbit BUZZER = P3^3;
#define uchar unsigned char
#define uint unsigned int
#define REST 36
#define A 0
#define AB 1
#define B 2
#define BC 3
#define C 4
#define D 5
#define DE 6
#define E 7
#define EF 8
#define F 9
#define FG 10
#define G 11
#define L 12
#define LM 13
#define M 14
#define MN 15
#define N 16
#define O 17
#define OP 18
#define P 19
#define PQ 20
#define Q 21
#define QR 22
#define R 23
#define S 24
#define SU 25
#define U 26
#define UV 27
#define V 28
#define W 29
#define WX 30
#define X 31
#define XY 32
#define Y 33
#define YZ 34
#define Z 35
uchar code m_note[][2] = {
{248,136},{248,243},{249,88},{249,184},{250,18},{250,103},{250,184},{251,3},{251,75},
{251,143},{251,206},{252,11},{252,67},{252,121},{252,172},{252,219},{253,9},{253,51},
{253,91},{253,129},{253,165},{253,199},{253,231},{254,5},{254,33},{254,60},{254,85},
{254,109},{254,132},{254,153},{254,173},{254,192},{254,210},{254,227},{254,243},{255,2},
{0,0},
};
uchar code display[][2] = {
{N,8},{F,4},{F,4},{L,8},{N,8},{M,4},{M,2},{N,2},{M,4},{L,4},
{M,4},{L,4},{F,8},{N,8},{F,4},{F,4},{L,8},{N,8},
{P,4},{M,2},{N,2},{M,4},{L,4},{M,4},{L,4},{G,4},{E,4},
{N,8},{F,4},{F,4},{L,8},{N,8},{M,4},{M,2},{N,2},{M,4},{L,4},
{M,4},{L,4},{F,4},{E,4},{N,8},{F,4},{F,4},{L,8},{N,8},
{P,4},{N,4},{0xff,24},
{F,8},{F,4},{E,4},{F,8},{F,4},{L,4},{L,8},{M,4},{L,4},{F,8},
{0xff,8},{L,8},{L,4},{E,4},{L,4},{M,4},{N,4},{P,4},{P,4},{N,4},
{M,8},{N,8},{0xff,8},{Q,4},{Q,4},{Q,4},{P,4},{N,4},{N,8},{L,4},
{F,4},{F,4},{F,4},{N,4},{M,8},{0xff,8},{N,4},{N,4},{P,4},{N,4},
{M,4},{N,4},{M,4},{L,4},{F,8},{E,8},{F,8},{0xff,8},
{F,8},{F,4},{E,4},{F,8},{F,4},{L,4},{L,8},{M,4},{L,4},{F,8},
{0xff,8},{L,8},{L,4},{E,4},{L,4},{M,4},{N,4},{P,4},{P,4},{N,4},
{M,8},{N,8},{0xff,8},{Q,4},{Q,4},{Q,4},{P,4},{N,4},{N,8},{L,4},
{F,4},{F,4},{F,4},{N,4},{M,8},{0xff,8},{N,4},{N,4},{P,4},{N,4},
{M,4},{N,4},{M,4},{L,4},{F,8},{E,8},{F,8},{0xff,8},
{N,4},{N,4},{P,4},{N,4},{N,4},{P,4},{P,4},{Q,4},{S,4},{Q,4},
{P,8},{Q,8},{0xff,8},
{F,8},{F,4},{E,4},{F,8},{L,8},{M,4},{N,2},{M,2},{L,4},{M,4},
{N,8},{0xff,8},{F,4},{Q,4},{Q,4},{P,4},{M,4},{N,2},{M,2},
{L,4},{M,4},{N,8},{0xff,8},{0xff,16},{L,4},{F,4},{F,4},{L,4},
{M,8},{E,4},{E,4},{N,4},{P,4},{N,4},{M,4},{L,8},{0xff,8},
{F,4},{L,4},{M,4},{N,4},{M,4},{L,4},{E,4},{C,4},{F,8},{0xff,8},{0xff,16},
{F,8},{F,4},{E,4},{F,8},{L,8},{M,4},{N,2},{M,2},{L,4},{M,4},
{N,8},{0xff,8},{F,4},{Q,4},{Q,4},{P,4},{M,4},{N,2},{M,2},
{L,4},{M,4},{N,8},{0xff,8},{0xff,16},{L,4},{F,4},{F,4},{L,4},
{M,8},{E,4},{E,4},{N,4},{P,4},{N,4},{M,4},{L,12},{L,4},
{F,4},{L,4},{M,4},{N,4},{P,4},{N,4},{N,4},{P,4},{Q,8},{0xff,8},{0xff,8},
{Q,6}, {Q,2},{Q,4},{Q,4},{Q,6},{P,2},{N,4},{M,4},{M,6},{M,2},{N,6},{P,2},{N,6},{M,2},
{L,6},{F,2},{F,8},{F,4},{E,4},{F,8},{F,4},{L,4}, {M,4},{N,2},{M,2}, {L,4},{M,4},{N,8},{0xff,8},
{Q,4},{P,4},{N,4},{M,4},{P,4},{N,4},{M,4},{L,4},{L,8},{0xff,8},{F,2}, {A,2},{B,2},{C,2},{B,2},
{A,2}, {F,2},{A,2},
{N,4},{N,4},{P,4},{N,4},{N,4},{P,4},{P,4},{Q,4},{S,4},{Q,4},
{P,8},{Q,8},{0xff,8},
{F,8},{F,4},{E,4},{F,8},{L,8},{M,4},{N,2},{M,2},{L,4},{M,4},
{N,8},{0xff,8},{F,4},{Q,4},{Q,4},{P,4},{M,4},{N,2},{M,2},
{L,4},{M,4},{N,8},{0xff,8},{0xff,16},{L,4},{F,4},{F,4},{L,4},
{M,8},{E,4},{E,4},{N,4},{P,4},{N,4},{M,4},{L,8},{0xff,8},
{F,4},{L,4},{M,4},{N,4},{M,4},{L,4},{E,4},{C,4},{F,8},{0xff,8},{0xff,16},
{F,8},{F,4},{E,4},{F,8},{L,8},{M,4},{N,2},{M,2},{L,4},{M,4},
{N,8},{0xff,8},{F,4},{Q,4},{Q,4},{P,4},{M,4},{N,2},{M,2},
{L,4},{M,4},{N,8},{0xff,8},{0xff,16},{L,4},{F,4},{F,4},{L,4},
{M,8},{E,4},{E,4},{N,4},{P,4},{N,4},{M,4},{L,12},{L,4},
{F,4},{L,4},{M,4},{N,4},{P,4},{N,4},{N,4},{P,4},{Q,8},{0xff,8},{0xff,8},
{0,0xff},
};
uchar time_h,time_l;
void Delay(uchar x);
void main()
{
uchar j;
uint i;
TMOD = 0x01;
ET0 = 1;
EA = 1;
TR0 = 1;
i = 0;
j = 0;
while(1)
{
while(display[i][1] != 0xff)
{
if(display[i][0] == 0xff)
{
TR0 = 0;
Delay(display[i][1]);
BUZZER = 1;
}
else
{
time_h = m_note[display[i][0]][0];
time_l = m_note[display[i][0]][1];
TH0 = time_h;
TL0 = time_l;
ET0 = 1;
TR0 = 1;
Delay(display[i][1]);
TR0 = 0;
ET0 = 0;
BUZZER = 1;
}
i++;
}
i = 0;
}
}
void Timer0() interrupt 1
{
TR0 = 0;
TH0 = time_h;
TL0 = time_l;
BUZZER = ~BUZZER;
TR0 = 1;
}
void Delay(uchar x)
{
uint i,j;
for(i = 0;i < x;i++)
for(j = 0;j < 12000;j++);
}
我自己跑了一下,效果大概如下:
妙啊!