小白向单片机笔记二:蜂鸣器
- 前言
- 一、蜂鸣器原理
- 二、蜂鸣器原理图
- 1.蜂鸣器代码
- 2.代码解释
- 1. 为什么蜂鸣器响,和LED6闪烁中有两个delay()函数?
- 2. 为什么BEEP=1是关闭LED6, 而i=0是关闭蜂鸣器?
- 总结
前言
蜂鸣器原理及代码
一、蜂鸣器原理
知识拓展: 根据蜂鸣器发声方式不同,主要分为压电式和电磁式。同时根据蜂鸣器结构,分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器自带震荡电路,接通电源即可发声。
振荡器电路的作用:产生脉冲信号。
无源蜂鸣器 需要提供一定频率的脉冲信号才能发声,频率一般在 1.5-5KHZ。
通过调节脉冲频率可改变音调,通过改变高低电平占空比可以调节音量。
二、蜂鸣器原理图
蜂鸣器正常工作需要约30mA电流,C51芯片是用来控制,如果用C51芯片驱动蜂鸣器,无法保证其他器件正常工作。所以使用时要放大电流来驱动蜂鸣器(使用三级管或下图的ULN2003D)。
ULN2003D 其中一个功能就是放大电流。
通过C51芯片的P2^5引脚持续输出脉冲信号(即高低电平交替),经过ULN2003D芯片放大电流从BEEP引脚输出到蜂鸣器即可发声。
注意P2^5引脚同时控制着LED6,当脉冲信号在一定频率时,可以观察到LED6的闪烁,这就是为什么在LED实验中会有滴答滴答的声音。
1.蜂鸣器代码
#include ""
typedef unsigned int uint ;
typedef unsigned char uchar ;
sbit BEEP = P2^5 ;
void delay(uint i){
while(i--){
}
}
void main(){
uint i=100;//调整脉冲频率
while(1){
while(i--){//当i减为0即蜂鸣器关闭,因无脉冲电流
/*//蜂鸣器响,和LED6闪烁
delay(1000);
BEEP = !BEEP;
delay(1000);
*/
/*调整空占比,从而调整音量,空占比:高电平占一个周期的比例*/
BEEP=1;
delay(100);
BEEP=0;
delay(10);
}
BEEP=1; //关闭第六个LED
//i=0;//关闭蜂鸣器
}
}
2.代码解释
1. 为什么蜂鸣器响,和LED6闪烁中有两个delay()函数?
因为在实验过程中可以顺便同时观察LED6的闪烁,如果不考虑LED6的情况,可以只使用一个delay()函数。
2. 为什么BEEP=1是关闭LED6, 而i=0是关闭蜂鸣器?
因为BEEP是由P2^5引脚控制,P2^5同时控制LED6,对于蜂鸣器BEEP为高电平还是低电平都没有关系,因为只有脉冲信号才能使无源蜂鸣器工作。将BEEP设置为高电平,是因为P2^5默认输出的就是高电平。
i=0是因为不执行内循环,从而不产生脉冲信号,从而使得蜂鸣器关闭。单片机配套的开发攻略这部分代码注释有点问题。
总结
如果要自己做些小玩意,数模电很重要,可惜学不会。