单片机驱动蜂鸣器(有源和无源)

单片机驱动蜂鸣器(有源和无源)有源的驱动可直接通过GPIO输出高低电平驱动:#include"reg52.h"#defineucharunsignedcharsbitbeep=P2^0;//定义蜂鸣器的引脚voidDelay_10us(unsignedintt){ while(t

大家好,欢迎来到IT知识分享网。单片机驱动蜂鸣器(有源和无源)

有源的驱动可直接通过GPIO输出高低电平驱动:

#include “reg52.h”
#define uchar unsigned char
sbit beep = P2^0; //定义蜂鸣器的引脚

void Delay_10us(unsigned int t)
{
while(t–);
}

void main()
{
while(1)
{
//————–有源———————–
beep = ~beep; //高低电平切换
Delay_10us(50000); //延时约500ms

}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
无源需要进行占空比计算输出周期性电平来对无源蜂鸣器进行驱动
占空比计算时间:占空比=输出高电平的时间/周期
而占空比通常为小数,如0.21,但是程序中时常会用整数作为占空比参数
来计算输出高电平的时间,所以通常有输出高电平时间=占空比周期=占空比程序函数参数/100周期。
所以可以设计这样的函数:

//输入参数:频数frequency,占空比duty 周期=频数*每次延时时间
void Pwm(unsigned char frequency, unsigned char duty)
{
unsigned char low = frequency * duty / 100; //低电平延时次数
unsigned char high = frequency – low; //高电平延时次数

beep = 0; //蜂鸣器IO电平置低
Delay_10us(low); //低电平延时时间

beep = 1; //蜂鸣器IO电平置高
Delay_10us(high);//高电平延时时间

}
1
2
3
4
5
6
7
8
9
10
11
12
13
由于蜂鸣器是低电平触发,所以电平对应的输出相反。

完整的程序为:

#include “reg52.h”
#define uchar unsigned char
sbit beep = P2^0; //定义蜂鸣器的引脚

void Delay_10us(unsigned int time)
{
while(time–);
}

//输入参数:频数frequency,占空比duty 周期=频数*每次延时时间
void Pwm(unsigned char frequency, unsigned char duty)
{
unsigned char low = frequency * duty / 100; //低电平延时次数
unsigned char high = frequency – low; //高电平延时次数

beep = 0; //蜂鸣器IO电平置低
Delay_10us(low); //低电平延时时间

beep = 1; //蜂鸣器IO电平置高
Delay_10us(high);//高电平延时时间
}

void main()
{
while(1)
{
//————–有源———————–
// beep = ~beep; //高低电平切换
// Delay_10us(50000); //延时约500ms

//————–无源———————–
Pwm(2000, 10); //周期100*10us,占空比50%——频率:1KHz
}
}
————————————————
版权声明:本文为CSDN博主「☆程序小黑★」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30893653/article/details/123335777

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/33294.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信