大家好,今天给各位分享单片机蜂鸣器控制程序及驱动电路图的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
图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/177853.html
用户评论
坠入深海i
终于找到了关于单片机蜂鸣器控制的详细教程!我一直想用蜂鸣器实现一些简单的提示音效果,现在看起来很容易就能做到。
有19位网友表示赞同!
凉月流沐@
单片机蜂鸣器的控制程序和驱动电路图都看得懂,赞!希望能有更多类似应用案例,让我在实践中学习.
有7位网友表示赞同!
你与清晨阳光
这篇文章真是太实用了!之前尝试过控制蜂鸣器的时候总是遇到各种问题,这篇文章解决了我的很多疑惑。感谢作者分享经验!
有19位网友表示赞同!
青楼买醉
感觉这个单片机蜂鸣器的驱动电路图有点复杂啊,我还在研究学习中,希望自己能完全理解.
有16位网友表示赞同!
墨染天下
文章写的太好了,讲解很清晰,连初学者也能看懂。请问作者有没有推荐一些适合控制蜂鸣器的单片机型号呢?
有17位网友表示赞同!
我就是这样一个人
我很需要这方面的知识!最近在做一个机器人项目,需要用到蜂鸣器来发出声音提示,不知道用哪个芯片比较好?有什么建议吗?
有13位网友表示赞同!
陌潇潇
想问一下在实际电路搭建过程中是否需要注意哪些细节?例如选用的蜂鸣器的规格参数等等?
有11位网友表示赞同!
拥抱
这个驱动电路图的原理我还没完全看懂,感觉还是需要再深入学习单片机控制知识才能更好地理解.
有16位网友表示赞同!
命该如此
我觉得单片机蜂鸣器控制程序比较简单易懂,但是实际操作中却容易出现问题,还是需要多多练习才行!
有5位网友表示赞同!
不离我
这个文章很不错!对学习单片机编程非常有帮助。我感觉自己已经能独立完成类似的项目了!
有11位网友表示赞同!
爱你的小笨蛋
我想知道除了控制蜂鸣器的音调外,还可以设置其他参数吗?例如蜂鸣器的闪烁频率等等?
有7位网友表示赞同!
单身i
在实际应用中,如何选择合适的驱动电路呢?不同的蜂鸣器型号需要不同的驱动方式吗?希望作者能提供一些更具体的指导.
有15位网友表示赞同!
颓废i
感觉这篇文章缺乏案例分析,希望能增加一些实际项目案例,以便更好地理解单片机蜂鸣器的控制原理和应用方法.
有19位网友表示赞同!
念旧是个瘾。
这篇博文内容丰富,受益匪浅!让我对单片机蜂鸣器有了更深入的了解。期待作者后续分享更多精彩内容!
有15位网友表示赞同!
轨迹!
想问一下如果要控制多个蜂鸣器的音调同时变化,应该如何编程?需要使用到的硬件电路有哪些?
有12位网友表示赞同!
ー半忧伤
这个程序中的代码注释非常清晰易懂,让我更容易理解每一步操作。这真是一个很棒的学习资源!
有17位网友表示赞同!
全网暗恋者
感觉单片机蜂鸣器只能实现简单的音调控制,缺乏创意和趣味性。能不能用其他方法实现更有趣的音效?
有12位网友表示赞同!