找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1711|回复: 7
收起左侧

如何将无源蜂鸣器加入单片机流水灯程序中?

[复制链接]
ID:817205 发表于 2020-9-20 09:32 | 显示全部楼层 |阅读模式
各位大佬好,这几天刚开始学习单片机。学完流水灯后,有一个蜂鸣器的学习。但是用的蜂鸣器是有源的。而我自己买的开发板的无源的,导致一开始都不会响。后来查阅资料后,才知道无源的需要一定的变化周期才行,于是,我就写了一个单独的蜂鸣器单片机程序:
#include<reg52.h>
#define u16  unsigned int        
sbit beep=P1^5;
void delay(u16);
void delay(u16 i)
{
        while(i--);
}
void main()
{
        
        while(1)
        {
        beep=~beep;
        delay(60);
        }
}
现在是会响了,但是我要如何把这个加入到我的流水灯程序中呢。下面是我流水灯的程序:

#include<reg52.h>
#include <intrins.h>
#define uint  unsigned int
#define uchar unsigned char
uchar temp;
void delay(uint);  
void main()
{
        temp=0xfe;
        P2=temp;
        while(1)
        {
        temp=_crol_(temp,1);
        delay(180);
        P2=temp;
        }
}
void delay(uint z)
{
        uint X,Y;
         for (X=200;X>0;X--)
        {         for (Y=z;Y>0;Y--)
             {
                 };
         };
}

我自己也试着加了,但是蜂鸣器要么没声音了,要么就响一下,要么就是很轻,还请各位大佬指点指点啊


回复

使用道具 举报

ID:213173 发表于 2020-9-20 14:28 | 显示全部楼层
写一个蜂鸣器函数加进去
#include<reg52.h>
#include <intrins.h>
#define uint  unsigned int
#define uchar unsigned char
sbit beep=P1^5;
uchar temp;
void delay(uint);  
void buzzer(uint);

void main()
{
        temp=0xfe;
        P2=temp;
        buzzer(1000);
        delay(760);
        while(1)
        {
                temp=_crol_(temp,1);
                P2=temp;
                buzzer(1000);//0.24s
                delay(760);  //0.76s
        }
}
void delay(uint z)
{
        uint X,Y;
        for(X=z;X>0;X--)
                for(Y=123;Y>0;Y--);
}
void buzzer(uint x)//0.24ms半周期蜂鸣器子程序
{
        uchar t;
        while(x--)
        {       
                beep=~beep;                                        //蜂鸣器谐振频率2048Hz
                for(t=0;t<28;t++);                //0.24ms半周期=2083Hz
        }                                                       
        beep=1;//高电平停止       
}
回复

使用道具 举报

ID:155507 发表于 2020-9-20 17:08 | 显示全部楼层
给你改了一下试试。

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint  unsigned int
  4. #define uchar unsigned char
  5. #define u16  unsigned int        
  6. sbit beep=P1^5;
  7. uchar temp;
  8. void delay(uint);  

  9. void main()
  10. {
  11.         uint  Count=0;
  12.         temp=0xfe;
  13.         P2=temp;
  14.         while(1)
  15.         {       
  16.                 if(Count >= 180)
  17.                 {
  18.                         Count=0;
  19.                         temp=_crol_(temp,1);
  20.                 }
  21.                 P2=temp;
  22.                 Count++;
  23.                 beep=~beep;
  24.                 delay(1);
  25.         }
  26. }
  27. void delay(uint z)
  28. {
  29.         uint X, Y;
  30.         for (X=200;X>0;X--)
  31.         {
  32.                 for (Y=z;Y>0;Y--)
  33.                 {
  34.                 };
  35.         };
  36. }
复制代码
回复

使用道具 举报

ID:817205 发表于 2020-9-21 08:33 | 显示全部楼层
wulin 发表于 2020-9-20 14:28
写一个蜂鸣器函数加进去
#include
#include

可以了,谢谢大佬。原来是有一个专门的函数呀。太谢谢了。
回复

使用道具 举报

ID:817205 发表于 2020-9-21 08:35 | 显示全部楼层
angmall 发表于 2020-9-20 17:08
给你改了一下试试。

试了,可以同时进行了。太谢谢了。
回复

使用道具 举报

ID:817205 发表于 2020-9-21 09:15 | 显示全部楼层
wulin 发表于 2020-9-20 14:28
写一个蜂鸣器函数加进去
#include
#include

大佬,能给说说这一段里的时间是通过什么确定的吗?为什么要叫0.24ms半周期。这一块还不是很懂。
void buzzer(uint x)//0.24ms半周期蜂鸣器子程序
{
        uchar t;
        while(x--)
        {      
                beep=~beep;                                        //蜂鸣器谐振频率2048Hz
                for(t=0;t<28;t++);                //0.24ms半周期=2083Hz
        }                                                      
        beep=1;//高电平停止      
}
回复

使用道具 举报

ID:213173 发表于 2020-9-21 11:50 | 显示全部楼层
51小菜鸟啊 发表于 2020-9-21 09:15
大佬,能给说说这一段里的时间是通过什么确定的吗?为什么要叫0.24ms半周期。这一块还不是很懂。
void b ...

这个程序就相当于常用的延时函数,只不过在while循环过程中把蜂鸣器端口不断翻转并延时一点时间。至于为什么取0.24ms半周期是因为常见电磁式蜂鸣器规格书的谐振频率2048Hz,在这个频率附近可以获得较佳音质和最大声压(最响)。计算方式1/2048/2=0.000244140625秒。实际应用不需要多么精确。参数x原则必须是偶数,响多长时间由参数x*0.24ms确定,为防止意外还是在最后写beep=1;//高电平停止保险些。
回复

使用道具 举报

ID:817205 发表于 2020-9-21 16:20 | 显示全部楼层
wulin 发表于 2020-9-21 11:50
这个程序就相当于常用的延时函数,只不过在while循环过程中把蜂鸣器端口不断翻转并延时一点时间。至于为 ...

恩,多谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表