找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14156|回复: 17
打印 上一主题 下一主题
收起左侧

怎么只让单片机蜂鸣器响三声就停下?

  [复制链接]
跳转到指定楼层
楼主
怎么只让蜂鸣器响三声就停下,

1543653995(1).png (13.74 KB, 下载次数: 53)

我的这个不行,改delay只是改变音调

我的这个不行,改delay只是改变音调
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:431356 发表于 2018-12-1 18:41 | 只看该作者
是无源的
回复

使用道具 举报

板凳
ID:437309 发表于 2018-12-1 19:27 | 只看该作者
无源的
回复

使用道具 举报

地板
ID:412554 发表于 2018-12-1 19:29 | 只看该作者
用for循环
回复

使用道具 举报

5#
ID:421338 发表于 2018-12-1 20:00 | 只看该作者
for循环3次跳出
回复

使用道具 举报

6#
ID:431356 发表于 2018-12-1 20:09 | 只看该作者

图片的就是for循环呀,没用,请问还有其他方法吗
回复

使用道具 举报

7#
ID:357520 发表于 2018-12-1 20:18 | 只看该作者
在for循环里面加个while(1)
while(1)
{
      for(a=0;a<3;a++)
     {

     }

     while(1)


}
回复

使用道具 举报

8#
ID:130087 发表于 2018-12-1 20:38 | 只看该作者
将a定义为全程变量
回复

使用道具 举报

9#
ID:164602 发表于 2018-12-1 20:39 | 只看该作者
用这个程序就可以,虽然程序很幼稚,但你要求的功能达到了,嘿嘿嘿。
#include <reg51.h>

sbit FMQ=P1^5;

void Delay25us()                //@12.000MHz
{
        unsigned char i;

        i = 10;
        while (--i);
}

void main (void)
{
        unsigned char i;
        unsigned int j;
                for (j=0;j<5000;j++)
                {
                        FMQ=1;
                        for (i=0;i<5;i++)
                        {
                                Delay25us();
                        }
                        FMQ=0;
                        for (i=0;i<5;i++)
                        {
                                Delay25us();
                        }
                }
                for (j=0;j<5000;j++)
                {
                        FMQ=0;
                        for (i=0;i<5;i++)
                        {
                                Delay25us();
                        }
                        FMQ=0;
                        for (i=0;i<5;i++)
                        {
                                Delay25us();
                        }
                }
                for (j=0;j<5000;j++)
                {
                        FMQ=1;
                        for (i=0;i<5;i++)
                        {
                                Delay25us();
                        }
                        FMQ=0;
                        for (i=0;i<5;i++)
                        {
                                Delay25us();
                        }
                }
                for (j=0;j<5000;j++)
                {
                        FMQ=0;
                        for (i=0;i<5;i++)
                        {
                                Delay25us();
                        }
                        FMQ=0;
                        for (i=0;i<5;i++)
                        {
                                Delay25us();
                        }
                }

                for (j=0;j<5000;j++)
                {
                        FMQ=1;
                        for (i=0;i<5;i++)
                        {
                                Delay25us();
                        }
                        FMQ=0;
                        for (i=0;i<5;i++)
                        {
                                Delay25us();
                        }
                }
                for (j=0;j<5000;j++)
                {
                        FMQ=0;
                        for (i=0;i<5;i++)
                        {
                                Delay25us();
                        }
                        FMQ=0;
                        for (i=0;i<5;i++)
                        {
                                Delay25us();
                        }
                }


        while (1);
}
回复

使用道具 举报

10#
ID:130087 发表于 2018-12-1 20:51 | 只看该作者
将a定义为全程变量
回复

使用道具 举报

11#
ID:437357 发表于 2018-12-1 20:54 | 只看该作者
这个方法很多,给一个脉冲响一次,时间长度看脉冲长度,给三次就是响三下
回复

使用道具 举报

12#
ID:249013 发表于 2018-12-1 21:06 | 只看该作者
用for循环加个变量来计数
回复

使用道具 举报

13#
ID:317476 发表于 2018-12-1 21:34 | 只看该作者
while(1)死循环不要了
delay(5)太短了,500试试不明显再加倍
回复

使用道具 举报

14#
ID:317476 发表于 2018-12-1 21:45 | 只看该作者
无源的  做个符合频率的定时器,在中断处理中 if(stop==0) beep =!beep;
main函数中
stop =1;
for(i=0;i<3;i++)
{   
    stop = 0;
     delay(500);
     stop = 1;
    delay(500);  
}
回复

使用道具 举报

15#
ID:437020 发表于 2018-12-1 21:48 | 只看该作者
循环结构就行
回复

使用道具 举报

16#
ID:213173 发表于 2018-12-2 07:53 | 只看该作者
本帖最后由 wulin 于 2018-12-2 10:47 编辑

给你一个利用定时器作驱动信号的无源蜂鸣器示例,详细注释。按一次键,响3下。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit key1 = P1^4;
sbit beep = P1^5;

uchar num=0;        //响铃计数变量
uint count=0;        //中断计数变量

void Timer0Init()        //250微秒@12.000MHz
{
        TMOD |= 0x02;        //自动重载模式
        TL0 = 0x06;                //设置定时初值
        TH0 = 0x06;                //设置定时重载值
        TR0 = 1;                  //定时器0开始计时
        EA=1;                          //开总中断
        ET0=1;                  //开T0中断
}

void delay(uint z)//延时ms
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=114;y>0;y--);
}

void keyscan()//按键扫描
{
        if(!key1)
        {
                delay(10);
                if(!key1)
                        num=3;//响铃3次
                while(!key1);
        }
}

void main()
{
        Timer0Init();//初始化定时器
        while(1)
        {
                keyscan();//按键扫描
        }
}
void timer0() interrupt        1 //T0中断
{
        if(num>0)
        {
                count++;
                if(count<=1000)
                        beep=~beep;        //蜂鸣器端口取反
                if(count>1000)        //0.25秒时间到
                        beep=1;                                                        
                if(count>=2000)//0.5秒时间到        
                {
                        count=0;                //计数清0
                        num--;        
                }
        }
}
回复

使用道具 举报

17#
ID:431356 发表于 2018-12-2 10:52 | 只看该作者
zzzy 发表于 2018-12-1 21:34
while(1)死循环不要了
delay(5)太短了,500试试不明显再加倍

改变里面的延时长度只是改变蜂鸣的声音,还是一直响,不断的那种
回复

使用道具 举报

18#
ID:317476 发表于 2018-12-2 11:34 | 只看该作者
连衡_ 发表于 2018-12-2 10:52
改变里面的延时长度只是改变蜂鸣的声音,还是一直响,不断的那种

思路参考我在14楼说的就可以了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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