标题: 写一个单片机检测人数的程序 [打印本页]
作者: 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访问的对象被认为是小端(最低位在前)。这是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变量不能在函数内声明。它们必须在函数体外部声明。
作者: wgb 时间: 2017-12-27 21:14
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
我写的程序还是不行,传感器检测到了信号,人数就是不变
作者: 刀刀见红 时间: 2019-1-31 02:44
思路很好,同感
作者: 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
要是一脚进门然后不想进就反身走了呢?建议循环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 |