找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机如何让蜂鸣器响6次就停,下一次条件成立还继续响6次

[复制链接]
ID:900977 发表于 2021-6-10 22:55 | 显示全部楼层 |阅读模式
如何让蜂鸣器响6次就停,下一次条件成立还继续响6次??现在的问题是蜂鸣器只在第一次条件成立的时候响6次就停,第二次条件成立就不响了,我想实现的是只要条件成立就响6次就停,程序该怎么改呢?程序中shu是红外检测到的人数,是个变量,shezhishu是可以通过按键调节设置值,只要统计到的人数小于设置的值,蜂鸣器就会响6次就停,想要实现的是只要条件成立就响6次就停,而不是只有第一次条件成立响6次就停第二次条件成立就不响了。程序该怎么改???这是部分程序int b=0;
uint shezhishu=0;
int shu;


if(shu<shezhishu)                                                                                                                        //实际检测到场人数小于设置数
  {
  if(b<=5)
  {
  beer=0; //蜂鸣器响
  delay(100);
  beer=1;
  delay(100);
  b++;                                                                                                                                        //启用蜂鸣器报警
  }
  }
  else
  {
  beer=1;
  }

   if(h1==0&&h2==0&&h3==0&&h4==0)                                                //如果四个红外传感器都感应到人
   {        
   shu=4;                                                                                                        //则说明检测到4人
   }  
     if(h1==1&&h2==1&&h3==1&&h4==1)                                       
   {
   shu=0;                                                                                                                                
   }


回复

使用道具 举报

ID:936299 发表于 2021-6-11 07:54 | 显示全部楼层
一直检测,检测完调用蜂鸣器响,就行了。

void bbbb(){
if(shu<shezhishu)                                                                                                                        //实际检测到场人数小于设置数
  {
  if(b<=5)
  {
  beer=0; //蜂鸣器响
  delay(100);
  beer=1;
  delay(100);
  b++;                                                                                                                                        //启用蜂鸣器报警
  }
  }
  else
  {
  beer=1;
  }
}

while(1){
   if(h1==0&&h2==0&&h3==0&&h4==0)                                                //如果四个红外传感器都感应到人
   {        
   shu=4;                                                                                                        //则说明检测到4人
   }  
     if(h1==1&&h2==1&&h3==1&&h4==1)                                       
   {
   shu=0;                                                                                                                                
   }
bbbb();
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:213173 发表于 2021-6-11 08:00 | 显示全部楼层

#define b 20000 //根据主循环周期调整b值
bit sign=0;

void warning()//放在主循环中运行,因为没有阻滞延时,不会影响其它程序运行
{
        static unsigned int  i;
        static unsigned char j;
        if(sign==1)     //蜂鸣器报警条件
        {
                i++;
                if(i>=b)//响铃周期
                {
                        i=0;
                        j++;
                }
                if(i<b/2)//一半时间响,一半时间停
                        beer=0; //蜂鸣器响
                else beer=1;//蜂鸣器停
                if(j>=6)
                {//全部复位
                        sign=0;
                        i=0;
                        j=0;
                        beer=1;
                }
        }
}
回复

使用道具 举报

ID:900977 发表于 2021-6-11 08:55 | 显示全部楼层
wulin 发表于 2021-6-11 08:00
#define b 20000 //根据主循环周期调整b值
bit sign=0;

谢谢大哥
回复

使用道具 举报

ID:900977 发表于 2021-6-11 08:56 | 显示全部楼层
战锂 发表于 2021-6-11 07:54
一直检测,检测完调用蜂鸣器响,就行了。

void bbbb(){

谢谢大哥
回复

使用道具 举报

ID:824490 发表于 2021-6-11 09:11 | 显示全部楼层
你的代码少了一条赋值:
if(shu<shezhishu)                                                                                                                        //实际检测到场人数小于设置数
  {
  b=0;  //没有这个赋值,b在一轮过后就一直大于5了,最极限能5151*5=255)后溢出重来。
  if(b<=5)
  {
  beer=0; //蜂鸣器响
  delay(100);
  beer=1;
  delay(100);
  b++;                                                                                                                                        //启用蜂鸣器报警
  }
  }
  else
  {
  beer=1;
  }
回复

使用道具 举报

ID:123289 发表于 2021-6-11 11:07 | 显示全部楼层
本帖最后由 yzwzfyz 于 2021-6-11 17:48 编辑

1、做一个只响6次的小程序。
2、条件成立就调用它。
以下是要点,需要你下决断:
小程序运行过程序中,如何处理新出现的条件:
1、立即停止小程序,则6次就可能变成4次……;
2、不理它,新出现的条件就被放弃,但是不影响上次6次鸣叫;
3、延时处理,待6次鸣叫完成后,再叫6次,这样可能一直6次、6次地叫不停(如果新条件多次到来)。
……
只事先架构、考虑好预案,你才能如愿以偿。
回复

使用道具 举报

ID:344646 发表于 2022-12-26 12:43 | 显示全部楼层
wulin 发表于 2021-6-11 08:00
#define b 20000 //根据主循环周期调整b值
bit sign=0;

不错的思路,已借鉴。。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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