1 蜂鸣器的原理
1.1 无源蜂鸣器原理
(1)早期的蜂鸣器都是无源的。
(2)内部结构和材料。
(3)发声原理。
(4)控制信号,是高低电平相间的方波。
(5)电路图。
(6)音调如何控制,音调受震动频率控制,就等于控制信号的频率。频率越高音调越高,听起来越刺耳。
(7)声音大小如何控制,由硬件决定的,没法写代码去控制声音大小。
1.2 有源蜂鸣器
(1)无源蜂鸣器的缺陷,必须用频率信号驱动,有时候不具备这个条件。
(2)内置震荡电路后形成有源蜂鸣器。
(3)有源蜂鸣器也可以用频率信号驱动。
2 让蜂鸣器响起来
(1)接线确定。P0.0接到J8上面。
(2)最简单:使用delay让蜂鸣器响起来。
(3)调节delay时间感受音调变化。
#include <reg51.h>
sbit BUZZER = P0^0; // buzzer的驱动引脚
void delay(void)
{
unsigned char i, j;
for (i=0; i<5; i++)
for (j=0; j<5; j++);
}
void main(void)
{
while (1)
{
BUZZER = 1;
delay();
BUZZER = 0;
delay();
}
}
3 用定时器控制蜂鸣器音调
3.1 上节驱动方法的问题
(1)不容易精准控制时间。
(2)CPU控制蜂鸣器中不能做其他事。
3.2 定时器控制蜂鸣器响
(1)10KHz => 1/10000s => 100us =>高电平+低电平一共100us,那高电平和低电平的时间都是50us。所以要定的时间就是50us
(2)外部晶振12MHz + 12T设置 => 内部时钟频率1MHz => 1us => 65536-50。
#include <reg51.h>
sbit BUZZER = P0^0; // buzzer的驱动引脚
#define XKHZ 2 // 要定多少Khz,就直接写这里
#define US (500/XKHZ)
#define N (65535-US)
void timer0_isr(void) interrupt 1 using 1
{
TL0 = N % 256;
TH0 = N / 256;
BUZZER = !BUZZER;
}
void main(void)
{
TMOD = 0x01; // T0使用16bit定时器
TL0 = N % 256;
TH0 = N / 256;
TR0 = 1; // T0打开开始计数
ET0 = 1; // T0中断允许
EA = 1; // 总中断允许
BUZZER = 1;
while