64人参与 • 2024-08-06 • 单片机
目录
前言:蜂鸣器是一种常见的发声元器件,广泛应用于各种电子产品,用于警报或报警处理,家里的洗衣机、微波炉、闹钟、遥控车、计算器等都会用到蜂鸣器。
注意:无源蜂鸣器不能一直给他通电,你必须给他交流电让他震荡他才能发声。
前言:单片机的io接口也是不足以驱动蜂鸣器,也需要外接一些驱动电路(蜂鸣器的功率稍微大些)。
注意:
前言:通过交流电使蜂鸣器震荡进而发出声音,不同频率波形使蜂鸣器的震荡频率不同,然而物体的震动形成声音,声音的音调取决于震荡的频率,因此我们只需要给出不同频率的波形(通过定时器形成)让蜂鸣器按照不同频率震荡,那么蜂鸣器就可发出不同调子的声音。
注意:
30.8hz表示每秒钟会震动130.8次,那么震动一次需要1/130.8=0.0076452s;因为单片机的单位为微秒,所以为7645微秒;因为7645us为整个周期的值,所以还需除以2得到3822.6us(3823us为正电平或负电平持续的时间,整个周期时长7645us);因此我们只需要通过定时器输出频率为7645微秒的方波即可。
需求:我们想要蜂鸣器发出c(频率130.8hz)的调子
#include "reg51.h"
sbit sound=p2^0;
void inittimer(){
tmod=0x01; //0000 0001——工作方式2
th0=(65536-3823)/256;
tl0=(65536-3823)%256;
et0=1;
ea=1;
tr0=1;
sound=0;
}
void main()
{
inittimer();
while(1);
}
void timer_isr() interrupt 1
{
th0=(65536-3823)/256;
tl0=(65536-3823)%256;
sound=~sound;
}
注意:也可以用延时函数,每隔一段时间电平值取反,那么周期就是两倍的延时时间。
需求:使用蜂鸣器播放歌曲孤勇者。
注意:该图片为下面数组三位数的表现形式
电路图:和上面的电路图一样。
#include "reg51.h"
sbit sound=p2^0;
unsigned int timer,index=0; //定时器初值,数据表索引
unsigned char beat,num; //节拍数,21音的计数
//每个数的3个位数代表了不同的意义(音高,音长,音符)
code unsigned char gequ[]={
120,116,117,211,212,117,211,221,
211,117,211,212,117,211,221,211,212,213,212,213,212,223,
213,212,223,225,223,116,117,211,212,117,211,221,211,117,
211,212,117,211,221,211,212,213,212,213,212,223,213,212,
223,225,223,225,233,215,233,215,213,215,216,213,225,225,
233,215,233,215,213,215,216,213,225,215,215,213,212,222,
222,211,213,213,212,222,222,211,211,146,110,215,215,213,
212,222,222,211,213,213,212,222,222,211,211,146,140,0};
//频率表
code unsigned int pinlv[]={
466,523,587,659,698,784,880, //低音
923,1047,1175,1319,1568,1760, //中音
1865,2094,2351,2633,2792,3134,3517 //高音
};
//延时节拍数
void delay(unsigned char t){
unsigned int i=0,j=0;
for(i=t;i>0;i--){
for(j=23000;j>0;j--);
}
}
void play(){
while(gequ[index]){ //声音索引为0就停止播放
if(gequ[index]%10==0){ //若根据数据分离出来的音符是0表示不发声比如120
tr0=0;
}else{
num=gequ[index]%10+(gequ[index]/100-1)*7-1; //根据数据索引计算频率索引
timer=65535-(12000000/12)/(pinlv[num]*2); //根据频率计算初值
th0=timer/256;
tl0=timer%256;
tr0=1;
}
beat=gequ[index]/10%10;
delay(beat); //延时的程序让你有足够的空间在特定的频率不断震荡,同时也起节拍的作用
index++; //声音索引自动+1
}
tr0=0; //播放结束停止定时器
index=0; //播放结束声音数据索引清零
}
void main()
{
sound=0;
tmod=0x01;
ea=1;
et0=1;
while(1){
//不断播放音乐,单曲循环
play();
}
}
void timer0() interrupt 1
{
th0=timer/256;
tl0=timer%256;
sound=~sound;
}
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论