stm32F103C8T6标准库反射(反射式红外)传感器触发蜂鸣器

目录

  • 1.热敏传感器模块
    • [1.1 模块介绍](#1.1 模块介绍)
    • [1.2 参数特性](#1.2 参数特性)
    • [1.3 模块说明](#1.3 模块说明)
    • [1.4 模块接口](#1.4 模块接口)
    • [1.5 程序流程](#1.5 程序流程)
  • 2.readme介绍
  • 3.接线图
  • 4.程序
    • [4.1 main.c](#4.1 main.c)
    • [4.2 反射循迹传感器](#4.2 反射循迹传感器)
      • [4.2.1 bsp_gpio_track.c](#4.2.1 bsp_gpio_track.c)
      • [4.2.2 bsp_gpio_track.h](#4.2.2 bsp_gpio_track.h)
    • [4.3 蜂鸣器](#4.3 蜂鸣器)
      • [4.3.1 bsp_gpio_beep.c](#4.3.1 bsp_gpio_beep.c)
      • [4.3.2 bsp_gpio_beep.h](#4.3.2 bsp_gpio_beep.h)
  • 5.文件配置
    • [5.1 user文件](#5.1 user文件)
    • [5.2 beep文件](#5.2 beep文件)
    • [5.3 track文件](#5.3 track文件)
  • 6.实验现象

1.热敏传感器模块

测试调试:

1.1 模块介绍

循迹模块可以旋转可调节电位器来设置阈值,循迹模块不断发射红外线,当发射出去的红外线没有被反射或者反射回来但强度达不到设定阈值时,DO 端输出高电平,当红外线被反射回来且强度超过设定阈值时,DO端输出低电平,AO端输出为ADC采集的红外接收三极管的模拟量。

1.2 参数特性

◆ 工作电压范围:推荐为 5V ,但本次实验选择的是3.3V

◆ 检测距离:最高10CM左右

◆ 可调节电位器阻值范围:阻值最大为 10KΩ,用户可以根据实际需要,调整阈值以适应不同的环境和线路条件。

1.3 模块说明

模块上有两个LED,LED1为 DO输出指示灯,当红外线被反射回来且强度到达阈值时,DO数字信号输出为低电平,发光二极管LED1导通点亮,LED2为电源灯,上电后常亮

U1 TCRT5000为红外反射传感器,内有红外发射二极管和红外接收三极管 RA2 10KΩ 可调节电位器,可以用螺丝刀旋扭电位器调节阻值大小,顺时针旋扭,接入到 1IN-的阻

值变大,假设固定好当前要识别的一个黑线识别距离,扭到刚好变化时就可以以此为阈值

U3 LM393ADR为电压比较器

VCC:电源,接5V

GND:公共地

1IN+:同相输入端,两边分别接的是电阻R6 47KΩ和红外反射传感器U1 的红外接收三极管

1IN-:反向输入端,接到可调节电位器RA2,阻值最大是10KΩ

1OUT:输出端,接了上拉电阻R9,默认高电平

由于黑色具有较强的吸收能力,当循迹模块发射的红外线照射到黑线时,红外线将会被黑线吸收

在红外线被反射回来且强度超过电位器设置的阈值时:TCRT5000的红外发射二极管不断发射红外线,红外接收三极管接收到的红外线强度足够大时,红外接收三极管饱和导通接地,随着接收红外线强度增大,分得的电压将减小,当 1IN-电压高于 1IN+的电压,即反向输入端电压高于同相输入端时,输出为低电平,将输出低电平给DO数字信号输出口,使得LED1导通点亮

在没有接收到红外线或者反射回来但强度低于电位器设置的阈值时:红外接收三极管处于关断状态, 相当于通过电阻 R6 直接接到 VCC_5V,1IN+电压高于 1IN-的电压,即同相输入端电压高于反向输入端

时,输出为高阻态,1OUT通过接了上拉电阻R9输出为高电平给DO数字信号输出口

模拟信号输出口AO会随着红外接收三极管的状态变化,采集到的电压也会变化,另外会根据输入电

压VCC大小而变化,建议5V

1.4 模块接口

1.5 程序流程

用任意单片机选取任意GPIO脚做普通输入脚,选取任意一条ADC通道做模拟输入脚

普通输入脚接到循迹模块的DO脚,来检测DO数字信号输出口的高低电平

模拟输入脚接到循迹模块的AO脚,采集循迹模块的模拟量

1.选定好GPIO脚,该脚与循迹模块DO脚相连

2.选定好ADC通道,该脚与循迹模块AO脚相连

3.初始化MCU对应的GPIO脚即DO脚,重点配置为浮空输入模式

4.初始化MCU对应的ADC脚即AO脚,重点配置为模拟输入模式

5.初始化ADC,可以采用中断读取或者DMA读取模拟量

6.通过读取DO脚的高低电平来判断是否检测到黑线或是物体

  1. 根据ADC读取到AO引脚的模拟量来计算距离大小

2.readme介绍

/*********************************************************************************************************************************************/

【 *】程序介绍

-工程名称 :反射传感器触发蜂鸣器

-实验平台 :野火 STM32FC8T6-STM开发板

【 !】功能介绍:

实现反射传感器触发蜂鸣器

【 !】实验操作:

1.核心板掉电情况下,将模块引出脚按照接线说明文件夹下的文件,接到板子对应脚上

2.确保引脚对应接上的情况下,核心板上电,将例程编译成功后,下载到核心板里

3.核心板的USB转串口通过数据线连接电脑,同时确保电脑安装了串口驱动并能识别到核心板的串口

4.电脑端使用串口调试助手,选择电脑与核心板相连的COM口,设置为115200-N-8-1并打开

5.复位核心板,即可接收核心板串口发送给电脑的数据

6.用物体遮挡,可以看到反射传感器模块上的LED1亮

注意事项

循迹模块的电源应接3.3V

调节电位器可以改变阈值

若循迹模块接收到物体或者检测到白色时候达到电位器设置的阈值 则光敏模块上的LED1灯亮起

/*********************************************************************************************************************************************/

【*】 引脚分配

热敏模块:

AO <--->不接

TRACK_DO <--->PA12 循迹传感器达不到阈值的时候,D0是高电平,达到阈值的时候,D0是低电平

VDD <--->3V3

GND <--->GND

蜂鸣器模块:

BEPP->PA6 高电平响

/*********************************************************************************************************************************************/

【*】 程序描述:

<main.c>

1.初始化蜂鸣器和光敏传感器对应的GPIO,初始化对应端口

2.检测循迹传感器反馈的信号,并对根据反馈信息来控制蜂鸣器灯状态

/*********************************************************************************************************************************************/

3.接线图



4.程序

4.1 main.c

c 复制代码
/**
  ******************************************************************************
  * @file    main.c
  * @author  作者
  * @version v1.0
  * @date    2026.4.17
  * @brief   循迹传感器触发蜂鸣器灯标准库写法
  ******************************************************************************
  * @attention
  *
  * 版权声明
  *
  ******************************************************************************
  */
#include "beep/bsp_gpio_beep.h"
#include "track/bsp_gpio_track.h"
#include "stm32f10x.h"

/**
  * @brief  主函数
  * @param  无
  * @note   无
  * @retval 无
  */
  
int main (void)
{
    BEEP_GPIO_Config();
    TRACK_GPIO_Config();
    
    while(1) 
    {
        /*检测到物体或者检测到白色*/
        if (TRACK_Scan(TRACK_GPIO_PORT, TRACK_GPIO_PIN) == Bit_RESET)
        {
            BEEP_GPIO_ON(BEEP_GPIO_PORT, BEEP_GPIO_PIN, BEEP_HIGH_TRIGGER);
        }
        else/*没有检测到物体或者检测到黑色*/
        {
            BEEP_GPIO_OFF(BEEP_GPIO_PORT, BEEP_GPIO_PIN, BEEP_HIGH_TRIGGER);
        }
        
    }
}

4.2 反射循迹传感器

4.2.1 bsp_gpio_track.c

c 复制代码
/**
  ******************************************************************************
  * @file    bsp_gpio_tack.c
  * @author  作者
  * @version v1.0
  * @date    2026.4.17
  * @brief   循迹传感器的函数接口
  ******************************************************************************
  * @attention
  *
  * 版权声明
  *
  ******************************************************************************
  */
#include "track/bsp_gpio_track.h"

/**
  * @brief  初始化控制 循迹传感器 的IO
  * @param  无
  * @retval 无
  */
  
void TRACK_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = { 0 };

/*****************************核心板载按键****************************************/

#if 1
    /*开启GPIOA 端口时钟*/
    RCC_APB2PeriphClockCmd(TRACK_GPIO_CLK_PORT, ENABLE); 
    
    /*设置PA12端口初始化高电平*/
    GPIO_SetBits(TRACK_GPIO_PORT, TRACK_GPIO_PIN);    
    
    // 配置引脚:选择GPIOA的Pin12
    GPIO_InitStruct.GPIO_Pin = TRACK_GPIO_PIN;
    // 配置输出速度:50MHz
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:浮空输入模式
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    
    GPIO_Init(TRACK_GPIO_PORT, &GPIO_InitStruct);
#endif

}
/**
  * @brief  循迹传感检测
  * @param  GPIOX : x可以是 A,B,C等
  * @param  GPIO_PIN: 待操作的PIN
  * @retval BitAction枚举类型 有两个成员Bit_SET = 1和Bit_RESET = 0
  * @retval Bit_SET(没有检测到物体)、Bit_RESET(检测到物体)
  */
BitAction TRACK_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    if (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == Bit_RESET)
    {
        return Bit_RESET;
    }
    else
    {
        return Bit_SET;
    }
}

/***************************************END OF FILE *********************************************************/

4.2.2 bsp_gpio_track.h

c 复制代码
#ifndef __BSP_GPIO_TRACK_H
#define __BSP_GPIO_TRACK_H

#include "stm32f10x.h"

/*定义连接GPIO端口,用户只需要修改下面代码即可改变控制的引脚 */

//TRACK_D0
#define TRACK_GPIO_PORT      GPIOA                       /* GPIO 端口 */
#define TRACK_GPIO_CLK_PORT  RCC_APB2Periph_GPIOA        /* GPIO 端口时钟 */
#define TRACK_GPIO_PIN       GPIO_Pin_12                 /* 对应PIN脚 */


void TRACK_GPIO_Config(void);
BitAction TRACK_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

#endif /*__BSP_GPIO_TRACK_H*/

4.3 蜂鸣器

4.3.1 bsp_gpio_beep.c

c 复制代码
/**
  ******************************************************************************
  * @file    bsp_gpio_beep.c
  * @author  作者
  * @version v1.0
  * @date    2026.4.17
  * @brief   蜂鸣器的函数接口
  ******************************************************************************
  * @attention
  *
  * 版权声明
  *
  ******************************************************************************
  */
#include "beep/bsp_gpio_beep.h"

/**
  * @brief  初始化控制 蜂鸣器 的IO
  * @param  无
  * @retval 无
  */
  
void BEEP_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = { 0 };
    
/*****************************用户自定义beep*******************************/
#if 1
    
    RCC_APB2PeriphClockCmd(BEEP_GPIO_CLK_PORT, ENABLE); 
    
    GPIO_ResetBits(BEEP_GPIO_PORT, BEEP_GPIO_PIN);    
    
    // 配置引脚:选择GPIOA的Pin6
    GPIO_InitStruct.GPIO_Pin = BEEP_GPIO_PIN;
    // 配置输出速度:50MHz
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    // 配置工作模式:推挽输出
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(BEEP_GPIO_PORT, &GPIO_InitStruct);
#endif



}

/**
  * @brief  开启蜂鸣器
  * @param  GPIOX : x可以是 A,B,C等
  * @param  GPIO_PIN: 待操作的PIN
  * @param  beep_soundsstatuss 蜂鸣器响时的状态
  * @retval 无
  */
void BEEP_GPIO_ON(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BEEP_TriggerLever beep_soundsstatus)
{
    if (beep_soundsstatus == BEEP_LOW_TRIGGER)
    {
        GPIO_ResetBits(GPIOx, GPIO_Pin);
    }
    else
    {
        GPIO_SetBits(GPIOx, GPIO_Pin);
    }
}

/**
  * @brief  关闭蜂鸣器
  * @param  GPIOX : x可以是 A,B,C等
  * @param  GPIO_PIN: 待操作的PIN
* * @param  beep_soundsstatuss 蜂鸣器不响时的状态
  * @retval 无
  */
void BEEP_GPIO_OFF(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BEEP_TriggerLever beep_soundsstatus)
{
    if (beep_soundsstatus == BEEP_LOW_TRIGGER)
    {
        GPIO_SetBits(GPIOx, GPIO_Pin);
    }
    else
    {
        GPIO_ResetBits(GPIOx, GPIO_Pin);
    }
}

/**
  * @brief  翻转对应 蜂鸣器
  * @param  GPIOX : x可以是 A,B,C等
  * @param  GPIO_PIN: 待操作的PIN
  * @retval 无
  */
void BEEP_TOGGLE(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    GPIOx->ODR ^= GPIO_Pin;
}
/***************************************END OF FILE *********************************************************/

4.3.2 bsp_gpio_beep.h

c 复制代码
#ifndef __BSP_GPIO_BEEP_H
#define __BSP_GPIO_BEEP_H

#include "stm32f10x.h"

/*定义连接GPIO端口,用户只需要修改下面代码即可改变控制的LED引脚 */

//beep
#define BEEP_GPIO_PORT      GPIOA                       /* GPIO 端口 */
#define BEEP_GPIO_CLK_PORT  RCC_APB2Periph_GPIOA        /* GPIO 端口时钟 */
#define BEEP_GPIO_PIN       GPIO_Pin_6                  /* 对应PIN脚 */

                          
/* 蜂鸣器的IO电平 */
typedef enum {
    BEEP_LOW_TRIGGER = 0,
    BEEP_HIGH_TRIGGER = 1,
}BEEP_TriggerLever;

void BEEP_GPIO_Config(void);
void BEEP_GPIO_ON(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BEEP_TriggerLever beep_soundsstatus);
void BEEP_GPIO_OFF(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BEEP_TriggerLever beep_soundsstatus);
void BEEP_TOGGLE(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

#endif /*__bsp_gpio_beep_H*/

5.文件配置

5.1 user文件

5.2 beep文件

5.3 track文件

6.实验现象

反射传感器触发蜂鸣器

相关推荐
编程之升级打怪2 小时前
Arduino嵌入式笔记
嵌入式硬件
华清远见IT开放实验室2 小时前
STM32+Linux双体系,零基础玩转嵌入式
linux·stm32·嵌入式硬件
LCG元2 小时前
STM32实战:基于FreeRTOS的智能小车多任务调度(循迹+避障+通信)
stm32·单片机·嵌入式硬件
俊基科技3 小时前
FT‑02 全双工语音通话消回音测试底座:设计原理、性能特性与应用场景
嵌入式硬件·音频测试·语音处理模块·全双工通话·声学回声消除
zmj3203243 小时前
I2C总线协议详细介绍
单片机·嵌入式硬件·i2c·总线协议
SDAU20053 小时前
Arduino编程CH552
c语言·开发语言·单片机
快乐的划水a3 小时前
单片机仿Linux驱动开发(一)
linux·驱动开发·单片机
实在太懒于是不想取名4 小时前
STM32N6的开发日记(5):数字摄像头接口像素流水线DCMIPP让MCU拥有高性能摄像头资源
stm32·单片机·嵌入式硬件
天涯铭4 小时前
深入浅出:单片机I/O模式与上拉电阻
单片机·上拉电阻·gpio输出