找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4285|回复: 16
收起左侧

写一个单片机检测人数的程序

  [复制链接]
ID:260698 发表于 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);

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

回复

使用道具 举报

ID:258566 发表于 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访问的对象被认为是小端(最低位在前)。这是sfr16类型的存储格式, 但与int,long数据类型的存储方式相反。使用sbit 访问标准数据类型中的位时必须小心。
任何符号名称都可以在sbit声明中使用。等号右边的表达式('=')指定符号名称的绝对位地址。
  • 并不是所有的SFR都是可以位寻址的。只有那些地址可以被8整除的SFR才是可以位寻址的。SFR地址的低半字节必须是0或8.例如,0xA8和0xD0的SFR是可位寻址的,而0xC7和0xEB的SFR不是。要计算SFR位地址,请将位位置添加到SFR字节地址。因此,要访问0xC8的SFR中的位6,SFR位地址将为0xCE(0xC8 + 6)。
  • 特殊功能位表示一个独立的声明类,不能与其他位声明或位域互换。
  • 所述SBIT数据类型声明可以被用来访问与声明的变量的各个位BDATA存储器类型说明符。。
  • sbit变量不能在函数内声明。它们必须在函数体外部声明

评分

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

查看全部评分

回复

使用道具 举报

ID:260698 发表于 2017-12-27 21:14 | 显示全部楼层
cccc888 发表于 2017-12-27 19:30
硬件接口定义不是这样的。

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

if(k3==0)
              {
                          while(k4!=0)
                          {
                          delay(10);
                          }
                          rs++;
                  }
这样还是不行
回复

使用道具 举报

ID:267813 发表于 2017-12-28 14:11 | 显示全部楼层
你需要认真分析一下  进出 的检测流程 ,有很多种情况你都要考虑   常规的 就是标准  进出两种,然后还有进或者出一半然后退回去了 , 两个检测位置也有关系   比如很近的时候   没人的情况就是  00   有人通过时  就会变化00--10--11--01--00   搞清楚了每个状态 检测就不会出错     不管你是用上升沿或者下降沿   或者状态   检测  能够达到你要的目的就OK,
注意避免同一个人进出  出现处理   多加 或者 多减  的情况

评分

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

查看全部评分

回复

使用道具 举报

ID:260698 发表于 2017-12-28 17:52 | 显示全部楼层
zzzxxxccc 发表于 2017-12-28 14:11
你需要认真分析一下  进出 的检测流程 ,有很多种情况你都要考虑   常规的 就是标准  进出两种,然后还有进 ...

我写的程序还是不行,传感器检测到了信号,人数就是不变
回复

使用道具 举报

ID:469417 发表于 2019-1-31 02:44 | 显示全部楼层
cccc888 发表于 2017-12-27 19:30
硬件接口定义不是这样的。

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

思路很好,同感

评分

参与人数 2黑币 +30 收起 理由
yoxi + 15 赞一个!
Sawardeakar + 15

查看全部评分

回复

使用道具 举报

ID:488460 发表于 2019-3-11 13:01 | 显示全部楼层
通过连接计数器吧,用T0和T1
回复

使用道具 举报

ID:21069 发表于 2019-3-11 14:00 | 显示全部楼层
首先要肯定的是你思路很好,再在在基础上加一把劲就很好了
回复

使用道具 举报

ID:319023 发表于 2019-3-11 14:11 | 显示全部楼层
你这个代码能编译通过吗?  位操作要加位定义指令的吧 (sbit fm=P2^3; )
回复

使用道具 举报

ID:502729 发表于 2019-5-14 15:53 | 显示全部楼层
楼主,解决问题没有,我也遇到相同的问题,求解
回复

使用道具 举报

ID:398402 发表于 2019-11-26 21:39 来自手机 | 显示全部楼层
wgb 发表于 2017-12-27 21:14
if(k3==0)
              {
                          while(k4!=0)

问题解决了吗?
回复

使用道具 举报

ID:47286 发表于 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触发 而不是用一个死延时去等
回复

使用道具 举报

ID:278179 发表于 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);
回复

使用道具 举报

ID:592807 发表于 2019-11-27 08:39 | 显示全部楼层
我感觉你第一个传感被触发后灯10ms就检测第二个有点赶鸭子上架的感觉,比如我一只脚迈进店门下然后犹豫了一下,过了10ms你怎么处理。
回复

使用道具 举报

ID:592807 发表于 2019-11-27 08:44 | 显示全部楼层
dzbj 发表于 2019-11-27 00:04
if(P2^1==0)
{
   delay(10);

要是一脚进门然后不想进就反身走了呢?建议循环2s或者3s等待。
回复

使用道具 举报

ID:650614 发表于 2019-11-27 10:41 | 显示全部楼层
这个不是这么简单的吧。两个传感器恐怕不够。
回复

使用道具 举报

ID:396245 发表于 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)                //等待人离开该传感器
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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