STM32F103(标准库)光敏传感器控制蜂鸣器
在智能小车、安防系统等应用中,光敏传感器常常用于环境光检测,而蜂鸣器则用于声音提示。
本文将基于 STM32F103 标准库 实现一个简单的实验:通过光敏传感器检测光线变化,控制蜂鸣器响/停。
一、实验目标
- 学习 光敏传感器 在 STM32 上的输入采集。
- 掌握 蜂鸣器 GPIO 输出 的控制方法。
- 理解 传感器输入与执行器输出联动 的设计思想。
- 编写模块化代码(传感器、蜂鸣器、延时),提升工程结构化能力。
二、硬件准备
-
核心硬件
- STM32F103C8T6 最小系统板
- 光敏传感器模块(数字量输出 DO 引脚)
- 有源蜂鸣器模块
-
接线示例
- 光敏传感器 DO → PB13(上拉输入)
- 蜂鸣器控制 → PB12(推挽输出)
- VCC 接 3.3V,GND 接地
三、软件设计
程序分为 主函数、蜂鸣器驱动、光敏传感器驱动、延时模块。
1. 主函数 main.c
根据光敏传感器的输入电平,决定蜂鸣器的开关状态。
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"int main(void)
{Buzzer_Init();LightSensor_Init();while (1){if (LightSensor_Get() == 1) // 光敏检测到高电平{Buzzer_ON(); // 蜂鸣器响}else{Buzzer_OFF(); // 蜂鸣器停}}
}
2. 蜂鸣器驱动 Buzzer
Buzzer.h
#ifndef __BUZZER_H
#define __BUZZER_Hvoid Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);
void Buzzer_Turn(void);#endif
Buzzer.c
#include "stm32f10x.h" // Device headervoid Buzzer_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_12); // 默认关闭蜂鸣器
}void Buzzer_ON(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}void Buzzer_OFF(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_12);
}void Buzzer_Turn(void)
{if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 0){GPIO_SetBits(GPIOB, GPIO_Pin_12);}else{GPIO_ResetBits(GPIOB, GPIO_Pin_12);}
}
3. 光敏传感器驱动 LightSensor
LightSensor.h
#ifndef __LIGHT_SENSOR_H
#define __LIGHT_SENSOR_Hvoid LightSensor_Init(void);
uint8_t LightSensor_Get(void);#endif
LightSensor.c
#include "stm32f10x.h" // Device headervoid LightSensor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);
}uint8_t LightSensor_Get(void)
{return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}
4. 延时模块 Delay
Delay.h
#ifndef __DELAY_H
#define __DELAY_Hvoid Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);#endif
Delay.c
#include "stm32f10x.h"void Delay_us(uint32_t xus)
{SysTick->LOAD = 72 * xus; SysTick->VAL = 0x00; SysTick->CTRL = 0x00000005; while(!(SysTick->CTRL & 0x00010000)); SysTick->CTRL = 0x00000004;
}void Delay_ms(uint32_t xms)
{while(xms--){Delay_us(1000);}
}void Delay_s(uint32_t xs)
{while(xs--){Delay_ms(1000);}
}
四、运行效果
- 上电后,系统开始运行。
- 当光敏传感器检测到 光线变化(如被遮挡时输出高电平),蜂鸣器立即 响起。
- 当光线恢复正常,蜂鸣器 停止。
- 该逻辑可以扩展用于 防盗报警、夜间感应提醒 等应用场景。
五、总结
本实验基于 STM32F103 标准库,完成了一个 光敏传感器控制蜂鸣器 的应用。
主要收获:
- 学习了 GPIO 输入(光敏传感器)与输出(蜂鸣器) 的配置方法;
- 体会了 传感器 → 控制逻辑 → 执行器 的应用链路;
- 通过模块化设计(Buzzer、LightSensor、Delay),程序结构更加清晰,方便后续扩展。
这个实验非常适合作为 传感器 + 执行器联动控制 的入门案例,为进一步开发智能系统打下了基础。