各位老铁们好,相信很多人对单片机蜂鸣器控制程序及驱动电路图都不是特别的了解,因此呢,今天就来为大家分享下关于单片机蜂鸣器控制程序及驱动电路图以及的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
图1 蜂鸣器电路原理图
我们看一下图1的电路,蜂鸣器电流还是比较大的,所以需要用晶体管来驱动,并加了一个100欧的电阻作为限流电阻。另外还增加了一个D4二极管,称为续流二极管。我们的蜂鸣器是一种感应装置。当晶体管导通为蜂鸣器供电时,会有导电电流流过蜂鸣器。而我们知道,电感的特性之一就是电流不能突变。开启后,电流逐渐增大。这没有问题。然而,当它关闭时,“电源-晶体管-蜂鸣器-地”的电路将被切断,没有电流可以流过。那么存储的电流去哪儿了?通过D4环路和蜂鸣器本身消耗掉,从而避免了关断时电感电流造成的反向冲击。关断时继续电流,这就是续流二极管名称的由来。
蜂鸣器通常用于在计算机、打印机和万用表等设备上发出蜂鸣声。蜂鸣声一般很简单,发出声音即可。我们用一个程序简单的发出4KHZ频率的声音和1KHZ频率的声音。方案,学生可以自己研究方案,对比实际效果。
包括
sbit BUZZ=P1^6; //蜂鸣器控制引脚
无符号字符T0RH=0; //T0重载值高字节
无符号字符T0RL=0; //T0重载值低字节
无效OpenBuzz(无符号整数频率);
无效StopBuzz();
无效主(){
无符号整型i;
TMOD=0x01; //配置T0工作在模式1,但还不启动它
EA=1;
while (1){ //启用全局中断
开放嗡嗡声(4000); //启动蜂鸣器,频率为4KHz
对于(i=0;i40000;i++);
停止嗡嗡声(); //停止蜂鸣器
对于(i=0;i40000;i++);
打开嗡嗡声(1000); //以1KHz的频率启动蜂鸣器
对于(i=0;i40000;i++);
停止嗡嗡声(); //停止蜂鸣器
对于(i=0;i40000;i++);
}
}
/* 蜂鸣器启动函数,frequ-工作频率*/
无效OpenBuzz(无符号整数频率){
unsigned int reload;//计算需要的定时器重载值
重新加载=65536 – (11059200/12)/(频率*2); //根据给定频率计算定时器重载值
T0RH=(无符号字符)(重新加载8); //16位重载值分解为高低字节
T0RL=(无符号字符)重新加载;
TH0=0xFF; //设置一个接近溢出的初始值,以便定时器可以立即开始工作
TL0=0xFE;
ET0=1; //使能T0中断
TR0=1; //开始T0
}
/* 蜂鸣器停止函数*/
无效StopBuzz(){
ET0=0; //禁用T0中断
TR0=0; //停止T0
}
/* T0中断服务函数,用于控制蜂鸣器声音*/
void InterruptTimer0() 中断1{
TH0=T0RH; //重新加载重载值
TL0=T0RL;
嗡嗡声=~嗡嗡声; //反转蜂鸣器控制电平
}
另外,用蜂鸣器输出音乐只是为了好玩,应用很少。里面有音阶、乐谱相关的内容,程序有点复杂,就不详细解释了。只有一个程序可以播放《两只老虎》。您可以将其下载到开发板上并玩一下,以满足您的好奇心。
包括
sbit BUZZ=P1^6; //蜂鸣器控制引脚
unsigned int code NoteFrequ[]={ //中频1-7和高音1-7对应的频率列表
523, 587, 659, 698, 784, 880, 988, //中音1-7
1047, 1175, 1319, 1397, 1568, 1760, 1976 //高音1-7
};
unsigned int code NoteReload[]={ //定时器重载对应中音1-7和高音1-7的值
65536 – (11059200/12)/(523*2), //中音1
65536 – (11059200/12)/(587*2), //2
65536 – (11059200/12)/(659*2), //3
65536 – (11059200/12)/(698*2), //4
65536 – (11059200/12)/(784*2), //5
65536 – (11059200/12)/(880*2), //6
65536 – (11059200/12)/(988*2), //7
65536 – (11059200/12)/(1047*2), //高音1
65536 – (11059200/12)/(1175*2), //2
65536 – (11059200/12)/(1319*2), //3
65536 – (11059200/12)/(1397*2), //4
65536 – (11059200/12)/(1568*2), //5
65536 – (11059200/12)/(1760*2), //6
65536 – (11059200/12)/(1976*2), //7
};
位使能=1; //蜂鸣器声音使能标志
位tmrflag=0; //定时器中断完成标志
无符号字符T0RH=0xFF; //T0重载值高字节
无符号字符T0RL=0x00; //T0重载值低字节
无效PlayTwoTiger();
无效主(){
无符号整型i;
EA=1; //使能全局中断
TMOD=0x01; //配置T0工作在模式1
TH0=T0RH;
TL0=T0RL;
ET0=1; //使能T0中断
TR0=1; //开始T0
而(1){
PlayTwoTiger(); //播放音乐–两只老虎
对于(i=0;i40000;i++); //暂停一段时间
}
}
/* 两只老虎音乐播放函数*/
无效PlayTwoTiger(){
无符号字符节拍; //当前节拍索引
无符号字符注释; //当前节拍对应的音符
无符号整型时间=0; //当前节拍时间
无符号整数beatTime=0; //当前节拍的总时间
无符号整型声音时间=0; //当前节拍所需的发声时间
//二虎注表
无符号字符代码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表示1/4拍,8表示2拍
无符号字符代码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,
};
//使用节拍索引作为循环变量
对于(节拍=0;节拍
而(!tmrflag); //每次定时器中断完成后,检测并处理节拍
tmrflag=0;
if (time==0){ //当前节拍播放完后开始新的节拍
note=TwoTigerNote[beat] – 1;
T0RH=NoteReload[注] 8;
T0RL=NoteReload[注释];
//计算总节拍时间。右移2 位相当于除以4。用移位代替除法可以加快执行速度。
beatTime=(TwoTigerBeat[beat] * NoteFreq[note]) 2;
//计算发声时间,为总时间的0.75。换档原理同上。
声音时间=节拍时间- (节拍时间2);
启用=1; //指示蜂鸣器开始发声
时间++;
}else{ //如果当前节拍尚未播放完,则处理当前节拍
//当当前持续时间达到节拍的总时间时重置为零,
//并增加节拍索引以准备开始新的节拍
如果(时间=节拍时间){
时间=0;
击败++;
}else{ //当当前时长未达到总时间时,
时间++; //累计时间计数
//到达发声时间后,指示关闭蜂鸣器。
//插入0.25*总时间的静音间隔,
if (时间==声音时间){
启用=0; //用于区分两个连续的节拍
}
}
}
}
}
/* T0中断服务函数,用于控制蜂鸣器声音*/
void InterruptTimer0() 中断1{
TH0=T0RH; //重新加载重载值
TL0=T0RL;
tmrflag=1;
if (enable){ //启用时反转蜂鸣器控制电平
嗡嗡声=~嗡嗡声;
}else{ //未启用时关闭蜂鸣器
嗡嗡声=1;
}
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/177834.html
用户评论
不相忘
终于找到了!我正忙着做一个小型自动提醒装置,偏偏就卡在这块控制蜂鸣器的代码和电路设计上。看到这些分享真是太感激了,赶紧下载下来试试!
有20位网友表示赞同!
一纸愁肠。
这蜂鸣器控制程序看着有点复杂啊,我是刚入门单片机的小白,感觉有点难理解… 希望能有人能详细解释一下每个模块的功能啊
有10位网友表示赞同!
冷月花魂
这个驱动电路图很简洁易懂,我以前没见过这种设计,可以学习参考下。希望作者再多分享一些基于这个电路的应用案例啊!
有16位网友表示赞同!
拽年很骚
单片机控制蜂鸣器,这太基础了嘛!我已经用各种不同的方式实现了,甚至还能连接到音响芯片调幅播放音乐… 各位大佬是不是也尝试过更高级的操作?
有16位网友表示赞同!
ゞ香草可樂ゞ草莓布丁
这个电路图的元件选择看起来很合理,但个人觉得PCB板的设计可以再优化一下,增加一些抗干扰的能力!
有12位网友表示赞同!
可儿
看了下程序注释,发现作者用到了定时器的概念,理解了它的原理之后感觉控制蜂鸣器的声音频率就变得轻松很多!不过还是希望作者能提供一些更精细的调音方法!
有7位网友表示赞同!
玩味
学习单片机主要是为了解决实际问题,我正在搞一个小型的报警装置,这篇博文刚好可以参考一下。希望能看到更多关于单片机应用案例的分享!
有12位网友表示赞同!
仅有的余温
代码里面没有处理蜂鸣器损坏情况,这不太理想啊,如果遇到这种情况,程序会一直循环导致烧坏主控芯片… 建议添加断环检测的功能!
有20位网友表示赞同!
(り。薆情海
对小白来说这博文写的有点深了,我希望看到更多基础知识的讲解,比如单片机工作原理、接口定义等等。希望能有更详细的入门教程!
有6位网友表示赞同!
花菲
我之前也做过类似项目,用STM32来控制蜂鸣器实现语音提示功能,作者提供的驱动电路图和程序可以参考一下。
有19位网友表示赞同!
白恍
这个单片机蜂鸣器的控制程序挺棒的,尤其是在控制声音频率上的精准度令人印象深刻。感觉可以用在这方面的其他应用中!
有17位网友表示赞同!
念初
作者的博文很扎实,分享内容实用,电路图设计清晰明了。对于学习单片机的伙伴来说是个很好的参考,我很推荐收藏起来!
有7位网友表示赞同!
青袂婉约
感觉这个控制程序可以应用到各种场合,比如机器人、智能家居等等。我们可以发挥自己的创意,实现更多有趣的项目!
有7位网友表示赞同!
夏以乔木
作者的经验分享很宝贵,感谢您的认真讲解!学习单片机需要大量的实践,我会努力把你的知识运用到实际项目中去!
有18位网友表示赞同!
矜暮
这个程序控制的声音确实很干净,但是,我发现蜂鸣器工作久了会产生一定的热量,需要考虑散热的措施。建议作者在电路设计中加入过热保护的功能!
有15位网友表示赞同!
凉笙墨染
我对单片机的原理还不是很了解,这个博文让我对控制蜂鸣器的思路有了初步认知。 希望以后能看到更多关于单片机编程的教程分享!
有14位网友表示赞同!
清羽墨安
我一直在寻找更有效地控制蜂鸣器的方法,感觉这个作者的方案很不错!我会把它应用到我的项目中,并尝试改进和优化它。
有12位网友表示赞同!