打印

05_51入门知识积累_蜂鸣器

[复制链接]
710|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于各类等电子产品中作发声器件,相对于扬声器控制简单,方便使用。
台式电脑的主机开机会"滴"一声、洗衣机按下按键及洗衣完成都会有声响,以上这些声音都是通过蜂鸣器来发出的,通过这些可与用户形成一定的交互。
分为压电式蜂鸣器和电磁式蜂鸣器两种,压电式蜂鸣器通过压电材料和金属片两端施加上一个电压后,由于压电效应,蜂鸣片就会产生机械变形而发出声响。

电磁式蜂鸣器按照其内部是否集成了震荡源可分为有源蜂鸣器,和无源蜂鸣器,利用电磁线圈对蜂鸣片的作用来发声的电子响讯器。
其有源蜂鸣器由于内部集成了震荡源,在蜂鸣器上电后就会以一定的频率发出响声。而无源蜂鸣器则需要使用方波去驱动它。其有源蜂鸣器价格高于无源蜂鸣器。
但无源蜂鸣器可控声音频率,达到一定程度的音乐盒效果。
我们经常使用的为有源式蜂鸣器,蜂鸣器作为电磁感性器件,其驱动需要较大的电流,而IO的输出电流能力有限,因此需要搭配外围电路对其进行控制,常见的方式有三极管。

通过三极管的使得蜂鸣器工作,同时在蜂鸣器两端并联二极管,以保证在关断感性原件蜂鸣器时减小对电路的冲击。
无源驱动
#include <reg52.h>//此文件中定义了单片机的一些特殊功能寄存器sbit beep = P1^5;//定义蜂鸣器的引脚void Delay_10us(unsignedint time){while(time--);}void Simulate_Pwm(unsignedchar period,unsignedchar duty){unsignedchar low = period /100* duty;//低电平延时时间unsignedchar high = period - low;//高电平延时时间        beep =0;//蜂鸣器IO电平置低        Delay_10us(low);//低电平延时时间        beep =1;//蜂鸣器IO电平置高        Delay_10us(high);//高电平延时时间}void main(){while(1){//使用模拟PWM控制蜂鸣器                Simulate_Pwm(100,50);//周期100*10us,占空比50%——频率:1KHz}}
两只老虎
#include <reg52.h>sbit BUZZ = P1^5;//蜂鸣器控制引脚unsignedint code NoteFrequ[]={//中音 1-7 和高音 1-7 对应频率列表523,587,659,698,784,880,988,//中音 1-71047,1175,1319,1397,1568,1760,1976//高音 1-7};unsignedint code NoteReload[]={//中音 1-7 和高音 1-7 对应的定时器重载值65536-(11059200/12)/(523*2),//中音 165536-(11059200/12)/(587*2),//265536-(11059200/12)/(659*2),//365536-(11059200/12)/(698*2),//465536-(11059200/12)/(784*2),//565536-(11059200/12)/(880*2),//665536-(11059200/12)/(988*2),//765536-(11059200/12)/(1047*2),//高音 165536-(11059200/12)/(1175*2),//265536-(11059200/12)/(1319*2),//365536-(11059200/12)/(1397*2),//465536-(11059200/12)/(1568*2),//565536-(11059200/12)/(1760*2),//665536-(11059200/12)/(1976*2),//7};bit enable =1;//蜂鸣器发声使能标志bit tmrflag =0;//定时器中断完成标志unsignedchar T0RH =0xFF;//T0 重载值的高字节unsignedchar T0RL =0x00;//T0 重载值的低字节void PlayTwoTiger();void main(){unsignedint i;        EA =1;//使能全局中断        TMOD =0x01;//配置 T0 工作在模式 1        TH0 = T0RH;        TL0 = T0RL;        ET0 =1;//使能 T0 中断        TR0 =1;//启动 T0while(1){                PlayTwoTiger();//播放乐曲--两支老虎for(i=0; i<40000; i++);//停止一段时间}}/* 两只老虎乐曲播放函数 */void PlayTwoTiger(){unsignedchar beat;//当前节拍索引unsignedchar note;//当前节拍对应的音符unsignedint time =0;//当前节拍计时unsignedint beatTime =0;//当前节拍总时间unsignedint soundTime =0;//当前节拍需发声时间//两只老虎音符表unsignedchar code TwoTigerNote[]={1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,1,5,1,1,5,1,};//两只老虎节拍表,4 表示一拍,1 就是 1/4 拍,8 就是 2 拍unsignedchar code TwoTigerBeat[]={4,4,4,4,4,4,4,4,4,4,8,4,4,8,3,1,3,1,4,4,3,1,3,1,4,4,4,4,8,4,4,8,};for(beat=0; beat<sizeof(TwoTigerNote);)//用节拍索引作为循环变量{while(!tmrflag);//每次定时器中断完成后,检测并处理节拍                tmrflag =0;if(time ==0)//当前节拍播完则启动一个新节拍{                        note = TwoTigerNote[beat]-1;                        T0RH = NoteReload[note]>>8;                        T0RL = NoteReload[note];//计算节拍总时间,右移 2 位相当于除 4,移位代替除法可以加快执行速度                        beatTime =(TwoTigerBeat[beat]* NoteFrequ[note])>>2;//计算发声时间,为总时间的 0.75,移位原理同上                        soundTime = beatTime -(beatTime >>2);                        enable =1;//指示蜂鸣器开始发声                        time++;}else//当前节拍未播完则处理当前节拍{if(time >= beatTime)//当前持续时间到达节拍总时间时归零,{//并递增节拍索引,以准备启动新节拍                                time =0;                                beat++;}else//当前持续时间未达到总时间时,{                                time++;//累加时间计数if(time == soundTime)//到达发声时间后,指示关闭蜂鸣器,{//插入 0.25*总时间的静音间隔,                                        enable =0;//用以区分连续的两个节拍}}}}}/* T0 中断服务函数,用于控制蜂鸣器发声 */void InterruptTimer0() interrupt 1{        TH0 = T0RH;//重新加载重载值        TL0 = T0RL;        tmrflag =1;if(enable)//使能时反转蜂鸣器控制电平        BUZZ =~BUZZ;else//未使能时关闭蜂鸣器        BUZZ =1;}
//《世上只有妈妈好》数据表 code unsignedchar sszymmh[]={6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,//一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。//6, 2, 3 分别代表:6, 中音, 3个半拍;//5, 2, 1 分别代表:5, 中音, 1个半拍;//3, 2, 2 分别代表:3, 中音, 2个半拍;//5, 2, 2 分别代表:5, 中音, 2个半拍;//1, 3, 2 分别代表:1, 高音, 2个半拍;//6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0};//《烟花易冷》unsignedchar code song1[]={5,2,1,3,2,1,2,2,2,2,2,4,3,2,1,1,2,1,2,2,1,3,2,4,5,2,1,3,2,1,2,2,2,2,2,2,5,1,1,3,2,1,4,2,1,3,2,4,3,2,1,3,2,1,7,2,1,3,2,1,2,2,2,1,2,1,7,1,1,1,2,1,2,2,1,3,2,1,6,2,3,6,1,1,1,2,1,3,2,1,2,2,1,6,1,1,1,2,1,7,1,1,5,1,1,6,1,6,5,2,1,3,2,1,2,2,2,2,2,1,2,2,1,3,2,1,1,2,1,2,2,1,3,2,4,5,2,1,3,2,1,2,2,2,2,2,1,2,2,1,5,1,1,3,2,1,4,2,1,3,2,4,3,2,1,3,2,1,7,2,3,3,2,1,2,2,2,1,2,1,7,1,1,1,2,1,2,2,1,3,2,1,6,2,3,6,1,1,1,2,1,3,2,1,2,2,1,6,1,1,1,2,1,7,1,2,5,1,2,6,1,6,0,0,0};
有源的也可以试试!
元器件是电路良好运行的基本保证,找元器件现货上唯样商城,原厂授权 正品保障,品类齐全。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

40

帖子

0

粉丝