打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
51单片机驱动无源蜂鸣器
在学习过程中遇到如下例题:8个发光管由上至下间隔1s流动,其中每个管亮500ms,500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。
流水灯的程序相对我个人来说比较简单,但是蜂鸣器有些难度,正常给I/0口一个信号,蜂鸣器既然不响,后经查证是无源蜂鸣器;

无源的蜂鸣器,就要通过IO口输出振荡信号来驱动蜂鸣器
 

蜂鸣器简介:蜂鸣器根据结构不同分为压电式蜂鸣器和电磁式蜂鸣器;而两种蜂鸣器又分为有源蜂鸣器和无源蜂鸣器,这里的源特指振荡源;有源蜂鸣器直接加电就可以响起,无源蜂鸣器需要我们给提供振荡源。理想的振荡源为一定频率的方波。
 
由于系统采用了无源蜂鸣器,所以需要我们通过编程来控制I/0口的翻转来产生一定频率的方波信号。本文采用默认频率0.5KHZ的标准方波。可以算出周期T = 2ms 脉宽t = 1ms,因此我们可以通过简单的延时函数延时1ms。然后控制P3.7口的电平高低产生0.5KHZ的方波信号;
本程序只是通过简单延时达到驱动蜂鸣器的效果。
#include <reg52.h>
sbit buzzer = P1^5;
void delayms(unsigned int xms)   //延时函数 ,延时xms
{
      unsigned int i , j;
          for(i = 0; i < xms; i++)
              for(j = 0; j < 110; j++);
}
void fengming()    //蜂鸣函数,脉宽t = 1ms 周期T = 2ms 频率f = 0.5khz 实际发现延时1ms的时候效果最好
{
        buzzer = 0; //
P1.5口送低电平
        delayms(1);   //
延时1ms
        buzzer = 1;   //
P1.5口送高电平
        delayms(1);   //
延时1ms
}

 
如果去掉delay(1);那么你的蜂鸣器控制端状态大约在2us左右翻转一次(晶振12M,12T单片机),这个时间对于驱动电路和蜂鸣器来讲都是很短的,可以通俗的理解成他们没反应过来,还没到最响的时候就被关掉了,加上延时之后显然可以让它到达峰值,所以就能听到更响。
void main()
{
       while(1)
      {
            fengming();
       }
}



 

#include<reg52.h>
#define uint unsigned int 
#define uchar unsigned char 
sbit buzzer=P1^5;
sbit D1=P1^0;
void delay(uint z)//延时1ms
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<114;y++)
{
}
}
}
fasheng() //发声子程序
unsigned int a,x;
for (a=0;a<456;a++) 
buzzer=!buzzer; 
for (x=0;x<45;x++); //45为蜂鸣器发声频率
}
}
void main()
{
while (1)
D1=0; 
fasheng(); 
D1=1; 
delay(200); 
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
有源与无源蜂鸣器
嘛叫单片机最小系统?瞅瞅俺做的|我爱单片机
蜂鸣器驱动软件包,轻松实现各种间隔长短的发声
单片机C语言设计实例——第1篇基础程序设计
EX99用VB实现单片机和计算机的串口通信
PWM直流电机无极调速单片机程序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服