1. 项目概述:当生产线遇上单片机计数革命
在电子厂干了十年,最让我头疼的就是产线末端的计数环节。上个月产线升级后速度提到每分钟120件,三个质检员轮班盯着计数器还是漏记了300多件,月底盘点直接乱了套。这种场景在制造业、物流仓储太常见了——人工计数就像用算盘核对抗大数据,迟早要被淘汰。
基于AT89C52单片机的自动计数系统,本质上是用硬件替代人眼+人脑的识别过程。红外对射传感器相当于永不疲倦的"电子眼",每检测到一个产品就向单片机发送脉冲信号,经过滤波处理后由程序累加计数,最后通过LED数码管实时显示。实测在每分钟150件的高速流水线上,计数准确率能达到99.99%,比人工计数提升至少20倍效率。
这个方案的核心优势在于:
- 成本可控:整套硬件成本不超过200元(单片机+传感器+显示模块)
- 部署灵活:可适配传送带、分拣机、包装线等多种场景
- 教学友好:涉及中断控制、信号滤波、人机交互等嵌入式经典知识点

2. 硬件设计:从传感器选型到抗干扰实战
2.1 传感器选型的三重考量
在电子市场实测了五种常见传感器后,最终选定E18-D80NK红外光电开关,原因很实在:
- 检测距离可调(3-80cm):通过尾部电位器就能调节,应对不同尺寸产品
- 环境抗干扰强:内置调制解调电路,有效抑制环境光干扰
- 响应时间<2ms:满足每分钟200次以上的检测需求
接线方案采用NPN常开型,棕色线接5V,蓝色线接地,黑色信号线接单片机INT0引脚。特别注意要并联104电容消除触点抖动,这是新手最容易忽略的细节。
避坑指南:别贪便宜买5元以下的传感器!实测某宝爆款在强光下误触发率高达15%,而正品E18在20000lux照度下仍能稳定工作。
2.2 单片机最小系统搭建
AT89C52的经典配置:
- 晶振:11.0592MHz(方便串口通信)
- 复位电路:10k电阻+10uF电容构成上电复位
- EA引脚:接高电平使用片内ROM

特别提醒:数码管驱动一定要用74HC595锁存器!直接接IO口会导致亮度不均且占用过多引脚。我曾用P0口直驱数码管,结果显示乱码——后来发现是没加上拉电阻。
3. 软件设计:中断与滤波的艺术
3.1 中断服务程序编写要点
c复制void EX0_ISR() interrupt 0 {
static unsigned long last_time = 0;
unsigned long current = millis();
// 软件去抖:50ms内不重复计数
if(current - last_time > 50) {
count++;
update_display();
last_time = current;
}
}
这段代码藏着三个关键技巧:
- 使用millis()替代delay(),避免阻塞主程序
- 50ms时间窗过滤机械抖动
- static变量保持中断间状态
3.2 数字滤波算法实战
产线环境电磁干扰严重,必须加入数字滤波:
c复制#define FILTER_LEN 5
int filter_buf[FILTER_LEN];
int digital_filter(int raw) {
// 滑动窗口滤波
for(int i=0; i<FILTER_LEN-1; i++){
filter_buf[i] = filter_buf[i+1];
}
filter_buf[FILTER_LEN-1] = raw;
// 中位值平均滤波
int sum = 0;
for(int i=0; i<FILTER_LEN; i++){
sum += filter_buf[i];
}
return sum/FILTER_LEN;
}
实测表明,这种组合滤波方式能有效抑制:
- 电机启停造成的电压波动
- 相邻传感器串扰
- 产品表面反光导致的误触发
4. 系统调试:从仿真到落地的血泪史
4.1 Proteus仿真常见坑点
- 传感器模型不准:Proteus自带的光电管模型没有抖动特性,建议用逻辑分析仪观察真实传感器输出
- 显示延迟问题:仿真时数码管刷新率设到100Hz以上,否则会出现"鬼影"
- 中断优先级冲突:如果同时用定时器和外部中断,一定要在Keil中配置IP寄存器
4.2 现场安装的七个细节
去年给某包装厂部署时总结的实战经验:
- 传感器支架要加橡胶减震垫,避免设备振动导致误触发
- 信号线必须用双绞线,并行布线时间隔5cm以上
- 供电电源加磁环,特别是有变频器的场合
- 安装高度=产品直径×1.5(防止漏检)
- 每日开机前用测试块校验(我们专门3D打印了带凹槽的校验块)
- 防尘罩必须用亚克力而非玻璃(玻璃会反射红外线)
- 接地电阻要小于4Ω,最好单独接大地
5. 功能扩展:让系统更智能的三种方案
5.1 批次报警功能实现
c复制#define BATCH_SIZE 100
void check_batch() {
if(count >= BATCH_SIZE) {
P1 ^= 0x01; // 蜂鸣器报警
P2 = 0xFF; // 所有LED闪烁
}
}
配合硬件改进:
- 增加有源蜂鸣器(驱动电流需达30mA)
- 报警时自动切断传送带电源(通过继电器控制)
5.2 数据存储方案对比
| 方案 | 成本 | 写入次数 | 断电保存 | 适用场景 |
|---|---|---|---|---|
| AT24C02 EEPROM | 3元 | 100万次 | 10年 | 小批量生产 |
| SD卡模块 | 15元 | 无限次 | 永久 | 需记录时间戳场景 |
| ESP8266上传 | 25元 | 无限次 | 依赖网络 | 远程监控需求 |
5.3 物联网升级实战
通过ESP-01S模块上传数据到云平台:
-
硬件改造:
- 串口接法:TX→P3.0 RX→P3.1
- 注意电平转换(ESP是3.3V器件)
-
通信协议示例:
arduino复制AT+CIPSTART="TCP","api.thingspeak.com",80 AT+CIPSEND=100 GET /update?api_key=XXX&field1=1234 -
功耗优化技巧:
- 启用ESP的深度睡眠模式
- 数据打包发送(每10分钟发送一次累计数据)
6. 常见故障排查手册
根据50+次现场维护经验整理的速查表:
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 计数漏检 | 1. 传感器距离过远 | 用白纸测试检测距离是否正常 |
| 2. 产品颜色吸收红外线 | 改用850nm波长传感器 | |
| 显示数字缺笔画 | 1. 74HC595驱动不足 | 测量SEG脚电压是否>2.4V |
| 2. 数码管共阴/共阳接错 | 用万用表二极管档测试数码管类型 | |
| 上电后数值乱跳 | 1. 电源纹波过大 | 示波器检查5V电源波形 |
| 2. 复位电路电容漏电 | 更换复位电容并检查布线 | |
| 无线模块连接不稳定 | 1. 天线附近有金属屏蔽 | 改用外置天线并调整位置 |
| 2. 服务器响应超时 | 用AT指令直接测试TCP连接 |
最后分享一个压箱底的调试技巧:用手机摄像头观察红外传感器!正常工作时会看到暗红色光点(注意有些手机滤镜会屏蔽红外线,华为P系列效果最好)。这个土方法帮我省了2000多块的红外热像仪...