目录

一、系统概述

二、TCRT5000红外反射传感器简介

2.1  基本概述

2.2  结构与工作原理

2.2.1  物理结构

2.2.2  工作流程

2.2.3  电路原理图

2.3  电气特性

2.4  模块接口说明

2.5  典型应用电路

2.6  实际应用注意事项

三、硬件设计

3.1  硬件组成

3.2  硬件连接

四、软件设计

4.1  开发环境配置

4.2  关键代码实现

4.2.1 初始化代码

4.2.2  主程序逻辑

4.3  关键优化代码

五、注意事项

六、总结


一、系统概述

        本系统采用STM32F103C8T6单片机(最小系统板)和光电反射式红外传感器模块(如TCRT5000),实现物体检测、距离测量和循迹等功能。系统通过标准外设库开发,具有响应快速、抗干扰能力强的特点,适用于智能小车、自动化设备等应用场景。

二、TCRT5000红外反射传感器简介

2.1  基本概述

        TCRT5000是一种光电反射式红外传感器,由红外发射管和光敏三极管组成,通过检测物体反射的红外光来实现非接触式物体检测。该传感器模块广泛应用于循迹、避障、物体计数等场景。

模块实物图:

2.2  结构与工作原理

2.2.1  物理结构

  • 红外发射二极管:发射波长为940nm的红外光
  • 硅光敏三极管:接收反射回来的红外光
  • 比较器电路(模块上):将模拟信号转换为数字输出
  • 灵敏度调节电位器:调节检测阈值

2.2.2  工作流程

1. 红外发射管持续发射红外光
2. 当有物体接近时,红外光被反射
3. 光敏三极管接收到反射光后导通
4. 模块输出信号变化(AO电压降低,DO可能跳变)

2.2.3  电路原理图

电路组成部分及工作原理:

(1)电源指示部分:由一个发光二极管(LED)和一个限流电阻(1KΩ)组成。当电路接上电源 VCC 时,电流通过限流电阻和 LED,使其发光,用于指示电路已通电。电容 104(0.1μF)起到电源滤波的作用,稳定电源电压,减少电源噪声对电路的影响。

(2)TCRT5000 传感器部分:TCRT5000 传感器内部包含一个红外发射二极管和一个红外接收三极管。红外发射二极管持续发射红外光,当遇到前方物体时,红外光会被反射回来,被红外接收三极管接收。接收到的红外光强度不同,会导致接收三极管的导通程度不同,从而在其输出端产生不同的电压信号。

(3)电位器 VR1 部分:电位器 VR1(10KΩ)用于设置比较器的参考电压。通过调节电位器,可以改变 LM393 运算放大器同相输入端的电压值,从而调整传感器检测的灵敏度。

(4)运算放大器 LM393 部分:

        LM393 是一个电压比较器。它将 TCRT5000 传感器输出的模拟电压信号(连接到反相输入端)与电位器设置的参考电压(连接到同相输入端)进行比较。

        当传感器输出的电压高于参考电压时,LM393 的输出端(DO)输出高电平;当传感器输出的电压低于参考电压时,DO 端输出低电平。这样,DO 端就输出了一个数字信号,可用于微控制器等设备的数字输入。

(5)模拟输出部分:传感器输出的原始模拟电压信号也通过 AO 端直接输出。这个模拟信号可以连接到具有模数转换(ADC)功能的设备,如微控制器的 ADC 引脚,以便更精确地获取传感器检测到的反射光强度信息。

(6)开关指示部分:另一个发光二极管和限流电阻(1KΩ)组成开关指示电路。当 DO 端输出高电平时,该 LED 可能会发光(具体取决于电路设计逻辑,这里假设高电平点亮),用于直观指示传感器检测到了符合条件(即反射光强度高于设定阈值)的情况。

2.3  电气特性

关键参数:

参数值/范围
工作电压3.3V-5V DC
工作电流约20mA
检测距离0.2-1.5cm
响应时间<10μs
工作温度-25℃~+85℃
输出形式AO(模拟)/DO(数字)

输出特性:
AO(模拟输出):
  - 无反射:接近VCC(如3.3V/5V)
  - 有反射:电压降低(反射越强电压越低)

DO(数字输出):
  - 无反射:高电平
  - 有反射:低电平(可调阈值)

2.4  模块接口说明

标准四线接口:

引脚功能连接说明
VCC电源正极(3.3V-5V)接MCU的3.3V/5V
GND电源负极接MCU的GND
AO模拟输出(0-VCC)接MCU的ADC输入引脚
DO数字输出(TTL电平)接MCU的IO输入引脚

灵敏度调节:
- 旋转模块上的蓝色电位器
- 顺时针:提高灵敏度(更易触发)
- 逆时针:降低灵敏度 

2.5  典型应用电路

数字模式接线:
TCRT5000 VCC → VCC
TCRT5000 GND → GND
DO  → MCU GPIO (输入)

模拟模式接线:
TCRT5000 VCC → VCC
TCRT5000 GND → GND
AO  → MCU ADC (如PA0)

2.6  实际应用注意事项

安装方式:
   - 传感器距检测表面最佳距离:4-10mm
   - 保持传感器与检测面垂直
   - 避免环境光直射

检测材料影响:
   - 白色表面:反射强,检测距离远
   - 黑色表面:反射弱,检测距离近
   - 镜面:可能产生误检测

抗干扰措施:
   - 添加遮光罩减少环境光影响
   - 在红外发射管串联限流电阻(如100Ω)
   - 软件上增加去抖处理

校准建议:
   - 在实际使用环境中校准阈值
   - 不同颜色表面需单独校准

        TCRT5000以其高性价比和双输出模式,成为入门级红外检测项目的首选传感器。合理利用其特性,可以构建稳定可靠的非接触式检测系统。

三、硬件设计

3.1  硬件组成

- STM32F103C8T6最小系统板
- TCRT5000红外反射传感器模块
- 0.96寸OLED显示屏(I2C接口)
- LED指示灯
- 蜂鸣器模块
- 杜邦线若干

STM32F103C8T6最小系统板示意图:

蜂鸣器模块示意图:

        本次使用的是有源蜂鸣器模块,高电平触发的。只要单片机的IO口输出高电平,就可以驱动蜂鸣器发出声音了。

LED模块:

        STM32F103C8T6最小系统板PCB13默认接到自带的LED灯,无需外接 。

3.2  硬件连接

STM32引脚连接模块说明
PA0传感器AOADC1通道0
PA1传感器DO数字输入
PB6OLED_SCLI2C1时钟线
PB7OLED_SDAI2C1数据线
PC13LED检测状态指示
PB8蜂鸣器报警提示
3.3V传感器VCC电源
GND传感器GND共地

四、软件设计

4.1  开发环境配置

- 开发工具:Keil MDK-ARM
- 库版本:STM32F10x标准外设库
- 调试工具:ST-Link V2

4.2  关键代码实现

4.2.1 初始化代码

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_i2c.h"
#include "oled.h"
#include "delay.h"#define DETECT_THRESHOLD 1500  // 检测阈值(根据实际调整)void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 使能GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);// 配置PA0为模拟输入(AO)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置PA1为浮空输入(DO)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置PC13为推挽输出(LED)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);// 配置PB8为推挽输出(蜂鸣器)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_Init(GPIOB, &GPIO_InitStructure);
}void ADC_Configuration(void)
{ADC_InitTypeDef ADC_InitStructure;// 使能ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);// ADC配置ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);// 配置ADC通道0(PA0)ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);// 使能ADC1ADC_Cmd(ADC1, ENABLE);// ADC校准ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));// 启动ADC转换ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}void I2C_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;I2C_InitTypeDef I2C_InitStructure;// 使能I2C和GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);// 配置I2C引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);// I2C配置I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 = 0x00;I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed = 100000; // 100kHzI2C_Init(I2C1, &I2C_InitStructure);// 使能I2CI2C_Cmd(I2C1, ENABLE);
}

GPIO配置 (GPIO_Configuration)功能:初始化传感器接口引脚。

  • PA0:接收模拟信号(AO),用于精确测量反射强度。
  • PA1:接收数字信号(DO),用于快速判断物体是否存在。

ADC配置 (ADC_Configuration)功能:配置ADC1连续采样PA0的模拟信号。

  • GPIO_Mode_AIN:模拟输入模式,用于ADC采集。
  • GPIO_Mode_IN_FLOATING:浮空输入模式,直接读取数字电平。
  • ADC_SampleTime_239Cycles5:长采样时间,提高信号稳定性。
  • ADC_ContinuousConvMode:自动连续转换,无需手动触发。

I2C配置 (I2C_Configuration)功能:初始化I2C接口,用于驱动OLED显示屏。

  • 时钟速度设为100kHz,兼顾稳定性和速度。

  • 引脚模式为开漏输出(GPIO_Mode_AF_OD),需外接上拉电阻

4.2.2  主程序逻辑

uint16_t Get_ADC_Value(void)
{while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成return ADC_GetConversionValue(ADC1);
}void Alarm_Control(FunctionalState state)
{if(state == ENABLE){GPIO_SetBits(GPIOC, GPIO_Pin_13);  // LED亮GPIO_SetBits(GPIOB, GPIO_Pin_8);   // 蜂鸣器响}else{GPIO_ResetBits(GPIOC, GPIO_Pin_13); // LED灭GPIO_ResetBits(GPIOB, GPIO_Pin_8);  // 蜂鸣器停}
}void Display_Detection_Info(uint16_t adc_val, uint8_t digital_val)
{char buffer[16];// 显示ADC值sprintf(buffer, "ADC: %4d", adc_val);OLED_ShowString(0, 2, (uint8_t *)buffer);// 显示数字状态sprintf(buffer, "DO : %s", digital_val ? "HIGH" : "LOW ");OLED_ShowString(0, 4, (uint8_t *)buffer);// 显示检测状态if(adc_val > DETECT_THRESHOLD || digital_val == 0){OLED_ShowString(0, 6, (uint8_t *)"Status: Detected");}else{OLED_ShowString(0, 6, (uint8_t *)"Status: Normal  ");}
}int main(void)
{uint16_t adc_value = 0;uint8_t digital_state = 0;// 初始化系统时钟SystemInit();// 外设初始化GPIO_Configuration();ADC_Configuration();I2C_Configuration();OLED_Init();OLED_Clear();OLED_ShowString(0, 0, (uint8_t *)"IR Sensor Test");while(1){// 读取模拟量adc_value = Get_ADC_Value();// 读取数字量digital_state = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);// 显示检测信息Display_Detection_Info(adc_value, digital_state);// 检测逻辑if((adc_value > DETECT_THRESHOLD) || (digital_state == 0)){Alarm_Control(ENABLE);  // 触发报警}else{Alarm_Control(DISABLE); // 关闭报警}// 延时200msDelay_ms(200);}
}

ADC值读取 (Get_ADC_Value)功能:

  • 获取当前红外反射的模拟量(AO)。
  • 返回值:0(强反射)到4095(无反射),对应电压0V-3.3V。

报警控制 (Alarm_Control)逻辑:

        当检测到物体时,触发声光报警(LED和蜂鸣器)。

数据显示 (Display_Detection_Info)功能:

        在OLED上实时显示传感器数据(ADC值、数字状态和检测结果)。

主程序逻辑工作流程

  1. 持续读取传感器的模拟和数字输出。

  2. 若ADC值超过阈值  数字信号为低电平,判定为检测到物体。

  3. 通过OLED显示数据,并控制报警设备。

  4. 延时200ms避免频繁刷新。

4.3  关键优化代码

软件滤波 (Moving_Average_Filter):

uint16_t Moving_Average_Filter(void) {static uint16_t filter_buf[FILTER_SIZE] = {0};sum += filter_buf[filter_index++] = Get_ADC_Value();if(filter_index >= FILTER_SIZE) filter_index = 0;return sum / FILTER_SIZE;  // 返回5次采样的平均值
}
  • 作用:消除信号抖动,提高稳定性。

  • 实现:滑动窗口平均算法,存储最近5次采样值。

五、注意事项

安装位置:
   - 传感器应垂直于检测表面安装
   - 避免环境光直射传感器

检测距离:
   - TCRT5000有效检测距离约0.2-1.5cm
   - 可通过调节电位器改变灵敏度

抗干扰:
   - 添加深色套管减少环境光干扰
   - 软件上增加滤波算法

供电稳定:
   - 红外发射管需要稳定电流
   - 建议添加稳压电路

六、总结

        本系统实现了基于STM32F103C8T6的光电反射式红外传感器检测方案,通过标准库开发保证了代码的可靠性和可移植性,可根据需要扩展为智能车循迹、物体计数等应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87441.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87441.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87441.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新能源汽车功率级测试自动化方案:从理论到实践的革命性突破

> 在800V高压平台普及与碳化硅半导体爆发的双轮驱动下,传统测试方法正经历颠覆性变革 “当我看到工程师手动记录测试数据时,就知道这个行业需要一场革命。”——某新能源车企测试总监的深夜感慨 ## 01 新能源汽车测试的痛点与变革 当新能源汽车的**电驱系统功率密度突…

【网络编程】事件驱动 reactor 式的服务器(EPOLL机制)

文章目录业务拆解事件驱动的 reactor总流程图C 代码实现准备工作编写头文件 reactor.h准备头文件准备宏定义声明三大模块函数和基础的内存变量长度定义全局变量定义 EPOLL 实例事件处理的函数与释放资源的函数注册服务器监听套接字的函数accept_cb 模块read_cb 模块send_cb 模块…

如何做好云服务器密码管理

一、设置强密码 强密码就像是给云服务器上了一把“超级锁”。专家建议&#xff0c;一个强密码应该包含大写字母、小写字母、数字和特殊字符&#xff0c;长度至少在 12 位以上。比如说&#xff0c;“Abc12345678”就比简单的“123456”要安全得多。有数据显示&#xff0c;简单密…

《新消费模式与消费者权益保护研讨会》课题研讨会在北京顺利召开

近期&#xff0c;《新消费模式与消费者权益保护研讨会》课题研讨会在北京召开。来自市场监管、政法、宏观管理等部门专家参会&#xff0c;聚焦《消费者权益保护法》《关于以新业态新模式引领新型消费加快发展的意见》等文件精神&#xff0c;探讨激发市场主体活力、促进新型消费…

Gradio全解13——MCP协议详解(6)——MCP服务器构建、测试与示例大全

Gradio全解13——MCP协议详解&#xff08;6&#xff09;——MCP服务器构建、测试与示例大全第13章 MCP协议详解13.6 MCP服务器构建、测试与示例大全13.6.1 开发MCP天气服务器1. 天气服务器概述2. 安装Node.js并设置环境3. 构建服务器13.6.2 安装Claude for Desktop1. 安装Claud…

Windows 11 24H2 专业版/家庭版安装教程(2025年6月更新版)- U盘启动盘制作+详细步骤

准备U盘启动盘​ 下载个叫「Rufus」的免费小工具&#xff08;百度搜就行&#xff09;。插入一个至少8GB的空U盘&#xff08;U盘会被清空&#xff0c;提前备份资料&#xff01;&#xff09;。打开Rufus&#xff0c;选你的U盘&#xff0c;ISO文件选你下载的那个 zh-cn_windows_1…

mac电脑wireshark快速实现http接口抓包

wireshark介绍 Wireshark 是一款功能强大的网络协议分析工具&#xff0c;可以用来抓取网络中的数据包&#xff0c;包括 HTTP 请求和响应。 wireshark安装 安装下载官网 https://www.wireshark.org/download.html&#xff0c;根据个人电脑环境下载安装wireshark使用 1配置网卡2选…

Softhub软件下载站实战开发(十二):软件管理编辑页面实现

文章目录 Softhub软件下载站实战开发&#xff08;十二&#xff09;&#xff1a;软件管理编辑页面实现✨功能概述 &#x1f4cb;编辑页面实现 &#x1f6e0;️1. 页面结构设计2. aieEditor集成 &#x1f31f;初始化配置编辑器功能 3. 大整数处理 &#x1f522;4. 封面图片上传 &…

微服务外联Feign调用:第三方API调用的负载均衡与容灾实战

01Feign 简介 Feign 是 Spring Cloud Netflix 中的 声明式 HTTP 客户端&#xff0c;它如同一位贴心的信使&#xff0c;帮我们化繁为简&#xff0c;让服务间的调用变得轻松又高效。 Feign 的核心优势在于&#xff1a;。 • 声明式调用&#xff1a;开发者只需定义接口和注解&a…

k8s pod调度基础

目录 一&#xff1a;replication controller和replicaset 1&#xff1a;replication controller replication controller的使用示例。 2&#xff1a;标签与标签选择器 &#xff08;1&#xff09;标签 &#xff08;2&#xff09;标签选择器 &#xff08;3&#xff09;标签…

学习者的Python项目灵感

一、实用工具类 - 文件批量重命名工具 用 os 模块实现按规则&#xff08;如添加日期、序号、替换关键词&#xff09;批量重命名文件&#xff0c;适合处理大量图片/文档。 - 简易待办事项管理器&#xff08;To-Do List&#xff09; 用 tkinter 或 PyQt 做GUI界面&#xff0c;…

gRPC服务发现

基于 etcd 实现的服务发现&#xff0c;按照非规范化的 etcd key 实现&#xff0c;详细见代码注释。 package discoveryimport ("context""encoding/json""fmt""go.etcd.io/etcd/api/v3/mvccpb"clientv3 "go.etcd.io/etcd/client/…

基于Linux的Spark本地模式环境搭建实验指南

一、实验目的 掌握Spark本地模式的安装与配置方法验证Spark本地环境是否搭建成功了解Spark基本操作和运行原理 二、实验环境准备 操作系统&#xff1a;Linux&#xff08;推荐ubuntu&#xff09;Java环境&#xff1a;JDK 1.8或以上版本内存&#xff1a;至少4GB&#xff08;推…

数学建模_时间序列

什么是时间序列时间序列预测方法/模型条件&#xff1a;非白噪音平稳平稳性评估不平稳变成平稳然后用ARIMA模型确定p,qAR模型(ARMA特例)MA模型(ARMA特例)ARMA模型(普适)灰色模型神经网络/LSTM组合预测模型向量数据预测结果和为1的情况什么是时间序列 省略具体图形例子 时间序列…

linux用rpm包升级sudo包为sudo-1.9.17-2版本

rpm下载地址&#xff1a; https://www.sudo.ws/dist/packages/1.9.17p1/ 备注&#xff1a;其他压缩包下载地址&#xff1a;https://www.sudo.ws/download.html sudo-1.9.17-2.el7.x86_64.rpm 检查一下&#xff0c;本地sudo版本&#xff0c;执行&#xff1a;sudo -V 或者sudo -…

【开源项目】一款真正可修改视频MD5工具视频质量不损失

文章目录 视频MD5修改工具 🎬📋 目录✨ 功能特点💻 系统要求🏗️ 设计架构🔬 技术原理💻 核心代码1. 视频MD5修改核心逻辑2. 前端异步处理代码3. 错误处理与日志记录📥 安装方法方法一:直接下载方法二:使用本地服务器📚 使用教程基本使用步骤高级使用技巧📁…

Day05: Python 中的并发和并行(1)

理解 Python 中的线程和进程 理解线程和进程是实现在 Python 中并发和并行的基础。这种知识使你能够编写能够看似同时执行多个任务的程序&#xff0c;从而提高性能和响应能力。本课程将深入探讨线程和进程的核心概念、它们的区别&#xff0c;以及它们如何为更高级的并发技术奠…

Spring Boot 集成 MinIO 实现分布式文件存储与管理

Spring Boot 集成 MinIO 实现分布式文件存储与管理 一、MinIO 简介 MinIO 是一个高性能的分布式对象存储服务器&#xff0c;兼容 Amazon S3 API。它具有以下特点&#xff1a; 轻量级且易于部署高性能&#xff08;读写速度可达每秒数GB&#xff09;支持数据加密和访问控制提供…

从小白入门,基于Cursor开发一个前端小程序之Cursor 编程实践与案例分析

Cursor 编程实践与案例分析 Cursor 编程实践与案例分析 1. 什么是 Cursor&#xff1f; Cursor 是一款面向开发者的 AI 编程助手&#xff0c;集成于本地 IDE&#xff0c;支持自然语言与代码的无缝协作。它不仅能自动补全、重构、查找代码&#xff0c;还能理解业务上下文&#…

一、如何用MATLAB画一个三角形 代码

一、如何用MATLAB画一个三角形 代码在MATLAB中绘制三角形可以通过指定三个顶点的坐标并使用 fill 或 patch 函数实现。以下是详细代码示例&#xff1a;方法1&#xff1a;使用 fill 函数&#xff08;简单填充&#xff09;% 定义三角形的三个顶点坐标 (x, y) x [0, 1, 0.5]; % …