1. 项目背景与核心需求
最近在整理工作室的电子元件时,翻出了几块闲置的STC89C52RC单片机,突然想到可以做个实用的小项目。考虑到当前公共场所的防疫需求,决定开发一套低成本的人流量统计系统。这个系统的核心功能是通过红外对管检测人员进出,实时统计场所内的人数,并在LCD屏上显示当前人数和预警状态。
在实际场景中,像社区服务站、小型超市这类场所,往往需要控制室内人数但又负担不起商业级的人脸识别系统。我们这套方案硬件成本可以控制在50元以内,非常适合预算有限的小型场所使用。系统具备以下核心功能:
- 双向人数统计(进入+离开)
- 超限声光报警
- 数据存储与查询
- 阈值可配置
2. 硬件设计与元件选型
2.1 主控芯片选择
选用STC89C52RC主要基于三点考虑:
- 内置4KB Flash存储器,足够存储一周的客流数据
- 支持串口烧录,开发调试方便
- 40引脚封装,IO口资源充足
注意:虽然STM32性能更强,但对于这种简单计数应用,51单片机完全够用,而且开发门槛更低,适合初学者上手。
2.2 传感器方案对比
测试了三种常见的人体检测方案:
| 传感器类型 | 成本 | 安装复杂度 | 抗干扰性 | 适用场景 |
|---|---|---|---|---|
| 红外对管 | 5元 | 低 | 中 | 门宽<1m |
| 热释电红外 | 15元 | 中 | 高 | 无方向限制 |
| 超声波模块 | 20元 | 高 | 低 | 需精确测距 |
最终选择E18-D80NK红外光电开关,其特点包括:
- 检测距离3-80cm可调
- NPN常开输出
- 响应时间<2ms
- 工作电压5V(与单片机兼容)
2.3 其他外围器件
- 显示模块:LCD1602(兼容性好,驱动简单)
- 存储芯片:AT24C02(I2C接口,2KB容量)
- 报警模块:有源蜂鸣器+LED灯组
- 电源方案:AMS1117稳压芯片(5V输出)
3. 系统架构与电路设计
3.1 硬件连接示意图
code复制[红外对管1] -- P3.2(INT0)
[红外对管2] -- P3.3(INT1)
[LCD1602] -- P0口(数据)+P2.0-P2.2(控制)
[AT24C02] -- P1.0(SCL)+P1.1(SDA)
[蜂鸣器] -- P2.3
[LED] -- P2.4-P2.7
[按键] -- P1.2-P1.5(设置/加减)
3.2 防误判设计
实际测试中发现,人员快速通过时可能出现误判。解决方案:
- 双光束检测:安装两对红外管,间距10cm
- 状态机判断:
- 先遮挡A再遮挡B → 进入
- 先遮挡B再遮挡A → 离开
- 软件消抖:连续检测到3次相同状态才确认
3.3 电源优化
现场测试时发现,使用USB供电偶尔会出现复位现象。改进措施:
- 增加1000μF滤波电容
- 红外对管单独供电
- 加入电源指示灯
4. 软件实现关键代码解析
4.1 中断服务程序
c复制void exint0() interrupt 0 {
static uchar count = 0;
if(++count >= 3){ // 消抖处理
if(!IN_A && !IN_B) flag = 1; // 触发判断
count = 0;
}
}
4.2 人数统计算法
c复制void count_people(){
if(flag){
delay_ms(10); // 等待状态稳定
if(!IN_A && IN_B) enter_cnt++;
else if(IN_A && !IN_B) exit_cnt++;
current_num = enter_cnt - exit_cnt;
flag = 0;
if(current_num > limit) alarm_on();
save_to_eeprom(); // 每变化一次就保存
}
}
4.3 EEPROM存储方案
采用环形缓冲区存储,每天记录一条数据:
c复制struct {
uchar date[3]; // 年-月-日
u16 enter;
u16 exit;
} record[7];
void save_to_eeprom(){
uchar addr = current_day % 7 * sizeof(record[0]);
AT24C02_Write(addr, (uchar*)&record[current_day], sizeof(record[0]));
}
5. 现场调试经验分享
5.1 安装注意事项
- 红外对管高度建议1.2-1.5米(成人腰部位置)
- 两对传感器间距保持8-12cm
- 避免阳光直射传感器接收端
- LCD显示屏需避开强光反射
5.2 常见问题排查
遇到计数不准时,按以下步骤检查:
- 用遮挡物测试单个传感器是否正常触发
- 检查消抖参数是否需要调整
- 测量电源电压是否稳定(≥4.8V)
- 确认EEPROM写入/读取函数正常工作
5.3 功耗优化技巧
系统待机时实测电流约25mA,可通过以下方式降低功耗:
- 关闭LCD背光(降至15mA)
- 使用睡眠模式(降至5mA)
- 改用STC15系列低功耗芯片(可降至1mA以下)
6. 功能扩展方向
当前系统已经稳定运行三个月,后续计划增加:
- WiFi模块上传数据(ESP8266)
- 添加RFID身份识别
- 体温检测功能扩展
- 语音提示功能
实际部署时发现,在菜市场等嘈杂环境中,蜂鸣器报警效果不佳,后来我们改用震动马达+闪光灯的组合方案,效果提升明显。这也提醒我们,硬件设计一定要考虑实际使用环境。