标题: 单片机如何让蜂鸣器响6次就停,下一次条件成立还继续响6次 [打印本页]

作者: 罗大韩    时间: 2021-6-10 22:55
标题: 单片机如何让蜂鸣器响6次就停,下一次条件成立还继续响6次
如何让蜂鸣器响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;                                                                                                                                
   }



作者: 战锂    时间: 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();
}

作者: wulin    时间: 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;
                }
        }
}

作者: 罗大韩    时间: 2021-6-11 08:55
wulin 发表于 2021-6-11 08:00
#define b 20000 //根据主循环周期调整b值
bit sign=0;

谢谢大哥
作者: 罗大韩    时间: 2021-6-11 08:56
战锂 发表于 2021-6-11 07:54
一直检测,检测完调用蜂鸣器响,就行了。

void bbbb(){

谢谢大哥
作者: 名字不是重点    时间: 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;
  }
作者: yzwzfyz    时间: 2021-6-11 11:07
本帖最后由 yzwzfyz 于 2021-6-11 17:48 编辑

1、做一个只响6次的小程序。
2、条件成立就调用它。
以下是要点,需要你下决断:
小程序运行过程序中,如何处理新出现的条件:
1、立即停止小程序,则6次就可能变成4次……;
2、不理它,新出现的条件就被放弃,但是不影响上次6次鸣叫;
3、延时处理,待6次鸣叫完成后,再叫6次,这样可能一直6次、6次地叫不停(如果新条件多次到来)。
……
只事先架构、考虑好预案,你才能如愿以偿。
作者: declansang    时间: 2022-12-26 12:43
wulin 发表于 2021-6-11 08:00
#define b 20000 //根据主循环周期调整b值
bit sign=0;

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





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1