标题: 写一个单片机检测人数的程序 [打印本页]

作者: wgb    时间: 2017-12-27 18:25
标题: 写一个单片机检测人数的程序
利用两个光电传感器,信号线接到单片机的p2.0和p2.1,人数初始值为rs=0,当2.0检测到信号,然后2.1检测到信号,此时人数加一,反之人数减一。        if(P2^0==0)
              {
                  delay(10);
                  if(P2^1==0)
                  {         rs++;         }
                  }

      if(P2^1==0)
              {
                  delay(10);
                  if(P2^0==0)
                  {         rs--; }
                  }
                  Write_LCD_command(0x80);
                  Write_LCD_command(0x80);
                  Write_LCD_data('r');
                  Write_LCD_data('s');
                  Write_LCD_data('=');
                  display(0x83,rs);

这是我自己写的,但是光电传感器检测到信号后,人数并没有改变,请教大佬,我是小白。


作者: cccc888    时间: 2017-12-27 19:30
硬件接口定义不是这样的。

参见SBIT类型定义了一个特殊功能寄存器(SFR)内的位。它以下列方式之一使用:sbit name = sfr-name ^ bit-position ;sbit name = sfr-address ^ bit-position ;sbit name = sbit-address ;

name是位的名称。
SFR name是以前定义的SFR的名称。
位位置是SFR内位的位置。
SFR地址是SFR的地址。
SBIT地址是SFR位的地址。

任何符号名称都可以在sbit声明中使用。等号右边的表达式('=')指定符号名称的绝对位地址。

作者: wgb    时间: 2017-12-27 21:14
cccc888 发表于 2017-12-27 19:30
硬件接口定义不是这样的。

参见SBIT类型定义了一个特殊功能寄存器(SFR)内的位。它以下列方式之一使用 ...

if(k3==0)
              {
                          while(k4!=0)
                          {
                          delay(10);
                          }
                          rs++;
                  }
这样还是不行
作者: zzzxxxccc    时间: 2017-12-28 14:11
你需要认真分析一下  进出 的检测流程 ,有很多种情况你都要考虑   常规的 就是标准  进出两种,然后还有进或者出一半然后退回去了 , 两个检测位置也有关系   比如很近的时候   没人的情况就是  00   有人通过时  就会变化00--10--11--01--00   搞清楚了每个状态 检测就不会出错     不管你是用上升沿或者下降沿   或者状态   检测  能够达到你要的目的就OK,
注意避免同一个人进出  出现处理   多加 或者 多减  的情况

作者: wgb    时间: 2017-12-28 17:52
zzzxxxccc 发表于 2017-12-28 14:11
你需要认真分析一下  进出 的检测流程 ,有很多种情况你都要考虑   常规的 就是标准  进出两种,然后还有进 ...

我写的程序还是不行,传感器检测到了信号,人数就是不变
作者: 刀刀见红    时间: 2019-1-31 02:44
cccc888 发表于 2017-12-27 19:30
硬件接口定义不是这样的。

参见SBIT类型定义了一个特殊功能寄存器(SFR)内的位。它以下列方式之一使用 ...

思路很好,同感
作者: 1114581577    时间: 2019-3-11 13:01
通过连接计数器吧,用T0和T1
作者: jinsheng7533967    时间: 2019-3-11 14:00
首先要肯定的是你思路很好,再在在基础上加一把劲就很好了
作者: 随风飘远    时间: 2019-3-11 14:11
你这个代码能编译通过吗?  位操作要加位定义指令的吧 (sbit fm=P2^3; )
作者: wooklam    时间: 2019-5-14 15:53
楼主,解决问题没有,我也遇到相同的问题,求解

作者: ydhnhx521    时间: 2019-11-26 21:39
wgb 发表于 2017-12-27 21:14
if(k3==0)
              {
                          while(k4!=0)

问题解决了吗?
作者: dzbj    时间: 2019-11-27 00:04
if(P2^1==0)
{
   delay(10);
   if(P2^0==0)
   {         rs--; }
}

你这段的意思是 P2.1触发后 等待10ms 如果p2.0也触发 则人数-1 问题是 你怎么知道10ms后p2.0会断开 如果11ms呢 你的程序已经出去了 rs不会减 不管你这个delay(10)是多少 理论上都不行吧 人又不是机器 移动哪有那么准确

较为妥善的做法是p2.1触发后标记一下 只要p2.1状态不变就一直等p2.0触发 而不是用一个死延时去等
作者: huwqly    时间: 2019-11-27 04:13
12楼正解,修改如下:
另外提示一个不严谨的地方(人数初始值为rs=0,当2.0检测到信号,然后2.1检测到信号,此时人数加一,反之人数减一),初始值为rs=0,此时如果人数减一,你该如何处理?
bit BP20,BP21;

if(P2^0==0)BP20=1;
if(BP20==1)
              {
                  if(P2^1==0)
                  {  BP20=0;       rs++;         }
                  }

      if(P2^1==0)BP21=1;
if(BP21==1)
              {
                  if(P2^0==0)
                  {  BP21=0;       rs--; }
                  }
                  Write_LCD_command(0x80);
                  Write_LCD_command(0x80);
                  Write_LCD_data('r');
                  Write_LCD_data('s');
                  Write_LCD_data('=');
                  display(0x83,rs);
作者: 黄youhui    时间: 2019-11-27 08:39
我感觉你第一个传感被触发后灯10ms就检测第二个有点赶鸭子上架的感觉,比如我一只脚迈进店门下然后犹豫了一下,过了10ms你怎么处理。

作者: 黄youhui    时间: 2019-11-27 08:44
dzbj 发表于 2019-11-27 00:04
if(P2^1==0)
{
   delay(10);

要是一脚进门然后不想进就反身走了呢?建议循环2s或者3s等待。
作者: yanfazhongxin    时间: 2019-11-27 10:41
这个不是这么简单的吧。两个传感器恐怕不够。
作者: SroneBridge    时间: 2019-11-27 18:22
给你写了进入的,退出的自己改一下,原理一样的。
你的思路是对的,但是忽略了一些细节。按你的程序,如果两个传感器都被挡住了,你思考一下你的程序如何将如何运行就能理解了。

if(P2^0==0)
{
        while(P2^0==0 && P2^1==1);        //等待退出该传感器或人进入下一个传感器
        if(P2^1==0)                        //人进入了下一个传感器?
        {
                //不考虑进入第二个传感器又退回去的情况
                rs++;                        //进入下一个传感器,计数加1
                while(P2^1==0)                //等待人离开该传感器
        }
}





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