前言:
了解了前面篇章的内容,这篇内容继续写C51的第二个基础实验,蜂鸣器的发声或鸣叫。基于开发板的板载无源蜂鸣器的控制实验。
百度百科:蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
蜂鸣器分类:
(1)、压电式蜂鸣器(无源)
压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳 等组成。
多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V直流工 作电压),多谐振荡器起振,输出 1.5~5kHZ 的音频信号,阻抗匹配器推动压电 蜂鸣片发声。
(2)、电磁式蜂鸣器(有源)
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电 源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
小结:
概括它们之间的区别,想要压电式蜂鸣器发声,需提供一定频率的脉冲信号;想要电磁式蜂鸣器发声,只需提供电源即可。
蜂鸣器的发声原理由振动装置和谐振装置组成,而蜂鸣器又分为无源他激型与有源自激型。
板载蜂鸣器实物图:
蜂鸣器工作发声原理图:
无源他激型蜂鸣器的工作发声原理是:方波信号输入谐振装置转换为声音信号输出。
无源他激型蜂鸣器的工作发声原理图如图1:
有源自激型蜂鸣器的工作发声原理是:直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号。
有源自激型蜂鸣器的工作发声原理图如图2:
开发板上的蜂鸣器模块电路原理图如下图所示:
蜂鸣器控制管脚直接连接到 51 单片机的 P2.5 管脚上,图中可见并没有使用三极管进行电流放大,而是使用 ULN2003 芯片来驱动。开发板上使用的是无源蜂鸣器,它需要一定频率的脉冲(高低电平)才会发声,因此需要让 P25 脚以一定频率不断输出高低电平信号才能控制蜂鸣器发出声音。
实现的功能是:
让蜂鸣器反复发出声音,一段时间后再关闭,即让 P2.5管脚输出一定频率的脉冲信号(这里通过高低电平脉冲)控制无源蜂鸣器。
原理分析:
如果改变输出电平的高低电平占空比,则可以改变蜂鸣器的声音大小。
为了方便理解,这里引用PWM的思想结合无源蜂鸣器的特性进行分析:
PWM波形(Pulse width modulationwave),PWM就是脉冲宽度调制,也就是占空比可变的脉冲波形。
脉冲宽度调制是一种对模拟信号电平进行数字编码的方法。
解释说明:
根据上图可知,主要看前面两个周期(2T),一开始都是高电平,然后可以看到A、B、C第一周期高电平持续的长度不同,这里的长度则指的是占空比,可以转换到GPIO中理解为,给对应端口给置高电平的延迟时间。
简单的理解,也就是说,给高电平延迟的时间越长,则占空比则越大,这就是PWM思想。
可以参考如下代码理解:
while(1)
{
//假定 :T = delay_us(20000);
LED = 1;
delay_10us(10000);delay_10us(15000);
//50% //75%
LED = 0;
delay_10us(10000);delay_10us(5000);
//50% //25%
}
可以看到,这里是通过控制延迟的时间长短比例,达到一定的占空比的效果,从而实现一定的脉冲频率。
那么实现到板载蜂鸣器,这个代码也很简单,若修改变量ten_us的值可以改变蜂鸣器发声时间。上面知道了PWM的思想那么,想要改变音调可以修改延时时间,但要注意频率不能太大或者太小,具体大家可以试着调试。若要改变音量,可以修改 BEEP 输出高电平时间,举例如下:
beep = 1;
delay_10us(800);//80%
beep = 0;
delay_10us(200);//20%
最后,了解了PWM的思想,以实现高低电平脉冲信号,从而驱动无源蜂鸣器,这篇知识初步实现基础功能使其蜂鸣即可,代码如下:
#include "at89x52.h"
sbit beep = P2^5;
void delay_10us(unsigned int ten_us)
{
while(ten_us--);
}
void main()
{
unsigned int i = 2000;
while(1)
{
while(i--)
{
beep =! beep;
delay_10us(200);
}
beep = 0;
i = 0;
}
}
解释说明:
main.c 文件内代码非常少也很简单,首先将 51 单片机的头文件包含进来,然后使用 sbit 关键字来定义 P2.5 管脚,定义好后即可使用 BEEP 来替代 P2.5口的操作。主函数功能非常简单,直接进入 while 循环,在循环内再次套用了一个 while 循环,只不过这里并非死循环,而是通过变量 i 值来决定何时退出,i值初始化为 5,即该循环会执行 5 次,**此循环内不断对 BEEP 取反,然后延时一定时间,即 P2.5 间隔一定时间输出高低电平,这样就会产生脉冲信号控制蜂鸣器发出声音,当 i 值递减到 0 时则退出 while 循环,然后将 i 值清零,且将 BEEP 输出 0。**其中,值得一提的是,while(i–)循环内部,实现的是等比占空比的情况,通过反复取反和延迟相等的时长,简单的实现一个等比的脉冲信号,从而驱动蜂鸣器发声即可。
至此,整个程序就编写完成,我们编译一下,如下图所示:
从上图编译信息可以看出,我们的代码占用FLASH 大小为:code = 54 字节,所用的 SRAM 大小为:data = 9 个字节(9.0),xdata指是扩展的外部存储XSRAM所占的大小,并没有使用XSRAM所以为0。
硬件实验效果如图所示:
C51基础实验3 --- 附件
写这篇文章记录作为自己学习的笔记,有错误的地方还请多多指教,谢谢阅读。