当前位置: 首页 > 产品大全 > 基于红外壁障传感器与单片机的计数显示系统实现

基于红外壁障传感器与单片机的计数显示系统实现

基于红外壁障传感器与单片机的计数显示系统实现

要实现红外壁障对管模块每检测到一次障碍物,数码管显示数值就自动加一的功能,需要将传感器信号采集、计数逻辑和数码管驱动三部分程序有机结合。下面以常见的51单片机(如STC89C52)和共阴极数码管为例,提供一个清晰的实现方案和代码框架。

一、系统工作原理
红外壁障对管模块一般包含一个红外发射管和一个红外接收管。当模块前方无障碍物时,发射管发出的红外线无法反射给接收管,模块输出高电平;当有障碍物时,红外线被反射,接收管接收到信号,模块输出低电平(具体电平逻辑请以实际模块说明书为准,常见为检测到障碍物输出低电平)。单片机通过检测该电平的跳变(例如下降沿)来判定一次有效的壁障事件,进而触发计数器加一,并将计数值通过数码管显示出来。

二、硬件连接示意

  1. 红外壁障模块:VCC接单片机5V,GND接GND,OUT(信号线)接单片机一个I/O口(如P3.2,即外部中断0引脚,便于高效检测)。
  2. 数码管:段选(a~g, dp)接单片机一组I/O口(如P0口,需加上拉电阻),位选(如共阴极的公共端)接另一组I/O口(如P2口低几位)控制哪个数码管亮。本例假设使用一个1位数码管显示0-9,循环计数。

三、程序编写思路与代码示例(C语言)
程序核心在于:检测传感器信号变化 -> 去抖 -> 计数 -> 显示。

`c #include // 包含51单片机寄存器定义头文件

// 定义引脚
#define IRSENSOR P32 // 红外壁障模块信号线接P3.2

sbit DUAN = P2^6; // 假设段选锁存器控制线
sbit WEI = P2^7; // 假设位选锁存器控制线
// 数码管段码表(共阴极,0~9)
unsigned char code segmentTable[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};

unsigned char count = 0; // 计数变量,记录壁障次数

// 延时函数,用于去抖和数码管动态扫描(若多位数码管)
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i=0; i for(j=0; j<123; j++);
}

// 数码管显示函数,显示传入的数值num
void displayNumber(unsigned char num) {
if(num > 9) num = 0; // 一位数码管只显示0-9,超过归零
P0 = segmentTable[num]; // 段码送P0口
DUAN = 1; DUAN = 0; // 锁存段码(具体锁存逻辑根据你的硬件电路调整)
P0 = 0x01; // 假设选中第一个数码管(位选码)
WEI = 1; WEI = 0; // 锁存位选
}

void main() {
unsigned char lastState = 1; // 上次传感器状态,初始为高(无障碍)
unsigned char currentState;
IR_SENSOR = 1; // 将传感器输入引脚设为高电平,准备读取

while(1) {
currentState = IRSENSOR; // 读取当前传感器状态
// 检测下降沿:上次为高(1)且当前为低(0),代表检测到一次障碍物
if((lastState == 1) && (currentState == 0)) {
delay
ms(10); // 延时去抖,消除信号抖动误触发
if(IRSENSOR == 0) { // 再次确认仍为低电平
count++; // 计数加1
if(count > 9) count = 0; // 0-9循环
}
}
lastState = currentState; // 更新状态
displayNumber(count); // 刷新数码管显示
// 可以加入短暂延时,控制循环速度,但不宜过长以免漏检测
delay
ms(50);
}
}
`

四、关键点说明

  1. 信号去抖:机械式接触或红外检测都可能存在信号抖动,程序中通过延时后再次检测来确认有效触发,这是提高计数准确性的关键。
  2. 检测方式:本例在主循环中通过查询I/O口电平变化实现。若对实时性要求高,可将传感器OUT线连接到单片机的外部中断引脚(如P3.2, INT0),并在中断服务程序中完成计数和去抖,这样效率更高。
  3. 数码管驱动:示例代码使用了锁存器控制数码管(如74HC573),具体锁存触发逻辑需根据实际电路调整。若直接由I/O口驱动,注意电流驱动能力不足时需加驱动电路。
  4. 计数范围:示例为一位数码管,计数0-9后归零。如需更大范围(如两位显示0-99),需修改count为整型,并编写多位数码管动态扫描显示函数。

五、优化建议

  • 使用外部中断:将传感器输出接入INT0或INT1,并设置中断为下降沿触发。在中断服务函数中计数,这样程序效率更高,不占用主循环过多资源。
  • 添加功能:可增加复位按键,将计数清零;或设置阈值报警等。

按照以上步骤连接硬件并烧录程序,即可实现红外壁障一次,数码管显示值加一的功能。务必先确认好红外模块的输出电平逻辑,必要时调整程序中状态检测的判断条件。祝你成功!

如若转载,请注明出处:http://www.bjsqmsensor.com/product/308.html

更新时间:2026-01-07 13:40:03

产品大全

Top