11_单片机_蜂鸣器
部分内容参考,详情请查阅 https://blog.csdn.net/qq_36347513/article/details/121474727
1. 声音是由物体振动产生的声波。是通过介质(空气或固定、液体)传播,并能被人或动物听觉器官所感知的波动现象。
人耳识别声音的频率为 20Hz~20KHz
频率:每秒钟周期性变化的次数(物体在1秒内振动的次数)
周期:物体振动 一次所经历的时间,T=1/f
2. 蜂鸣器:是一种一体化结构的电子讯响器。
2.1. 根据驱动方式分类:有源蜂鸣器(也称自激式蜂鸣器)和 无源蜂鸣器(也成为他激式蜂鸣器)
”源“ 是指振动源。
a. 有源蜂鸣器内部带振动源,只要一上电就会发声;工作原理如下:

b. 无源蜂鸣器内部不带振动源,所以直接使用直流信号无法使其发声,必须使用PWM驱动

有源蜂鸣器优点:程序控制简单;无源蜂鸣器优点:价格便宜;声音频率可控
2.2. 单片机的蜂鸣器电路

3. 定时器实现控制蜂鸣器发声(当前是无源蜂鸣器)
3.1. 延时函数 实现上述现象
1 #include <REG51.H> 2 3 /********************************* 4 * 使用”延时函数“实现蜂鸣器发声 5 *********************************/ 6 7 sbit buzzer = P0^0; 8 9 /**********函数声明***************/ 10 void delay50us(void); // f = 1/50*2*(10^-6) = 10KHz 11 void delay500us(void); // f = 1/500*2*(10^-6) = 1KHz 12 void delay1ms(void); // f = 1/1*2*(10^-3) = 500Hz 13 void delay10ms(void); // f = 1/10*2*(10^-3) = 50Hz 14 void delay100ms(void); // f = 1/100*2*(10^-3) = 5Hz 15 16 void main(void) 17 { 18 while(1) 19 { 20 buzzer = 0; 21 delay100ms(); 22 buzzer = 1; 23 delay100ms(); 24 } 25 } 26 27 void delay50us(void) 28 { 29 unsigned char a,b; 30 for(b=9;b>0;b--) 31 for(a=1;a>0;a--); 32 } 33 34 void delay500us(void) 35 { 36 unsigned char a,b; 37 for(b=99;b>0;b--) 38 for(a=1;a>0;a--); 39 } 40 41 void delay1ms(void) 42 { 43 unsigned char a,b; 44 for(b=199;b>0;b--) 45 for(a=1;a>0;a--); 46 } 47 48 void delay10ms(void) 49 { 50 unsigned char a,b,c; 51 for(c=5;c>0;c--) 52 for(b=4;b>0;b--) 53 for(a=248;a>0;a--); 54 } 55 56 void delay100ms(void) 57 { 58 unsigned char a,b,c; 59 for(c=7;c>0;c--) 60 for(b=74;b>0;b--) 61 for(a=95;a>0;a--); 62 }
3.2. 定时器0 实现上述现象
1 #include <REG51.H> 2 3 /********************************************* 4 * 使用”定时器“实现蜂鸣器发声 5 * 蜂鸣器频率是10KHz,则周期=1/1*10^4 =100us 6 * 1/2周期是50us 7 **********************************************/ 8 9 sbit buzzer = P0^0; 10 11 /********************函数声明*****************/ 12 void Timer0Init(void); 13 14 15 void main(void) 16 { 17 Timer0Init(); 18 while(1); 19 } 20 21 void Timer0Init(void) 22 { 23 TMOD = 0x01; 24 TL0 = 0xCE; 25 TH0 = 0xFF; 26 TR0 = 1; 27 ET0 = 1; 28 EA = 1; 29 } 30 31 void timer0_isr(void) interrupt 1 using 1 32 { 33 TL0 = 0xCE; 34 TH0 = 0xFF; 35 36 buzzer = ~buzzer; 37 }
4. 实现蜂鸣器发出”滴-滴-滴“声音
1 #include <REG51.H> 2 3 /********************************************* 4 * 使用”定时器“实现蜂鸣器发声 5 * 蜂鸣器频率是10KHz,则周期=1/1*10^4 =100us 6 * 1/2周期是50us 7 **********************************************/ 8 9 sbit buzzer = P0^0; 10 unsigned char N=200; 11 unsigned char flag = 0; 12 13 /********************函数声明*****************/ 14 void Timer0Init(void); 15 16 17 void main(void) 18 { 19 Timer0Init(); 20 while(1); 21 } 22 23 void Timer0Init(void) 24 { 25 TMOD = 0x01; 26 TL0 = 0x18; 27 TH0 = 0xfC; 28 TR0 = 1; 29 ET0 = 1; 30 EA = 1; 31 } 32 33 void timer0_isr(void) interrupt 1 using 1 34 { 35 TL0 = 0x18; 36 TH0 = 0xfC; 37 38 N--; 39 if(flag == 0) 40 { 41 if(N == 0) 42 { 43 flag = 1; 44 N = 200; 45 } 46 else 47 { 48 buzzer = ~buzzer; 49 } 50 } 51 else 52 { 53 buzzer = 1; 54 if(N == 0) 55 { 56 flag = 0; 57 N = 200; 58 } 59 } 60 }
浙公网安备 33010602011771号