一、项目功能
本项目基于 STM32F103 实现:震动传感器检测 + LED 闪烁提示
- 震动传感器(震动开关)接在 PA0
- 检测到震动时:LED 自动闪烁 1 秒
- 无震动时:LED 保持熄灭
- 模块化编程
二、硬件连接
- 震动传感器 OUT → PA0
- 震动传感器 VCC → 3.3V / 5V
- 震动传感器 GND → GND
- LED 灯 → PA1(低电平点亮)
三、完整代码
main.c
// STM32 标准库头文件
#include "stm32f10x.h"
// 工程主头文件
#include "main.h"
// LED 驱动头文件
#include "led.h"
// 震动传感器初始化头文件
#include "shake.h"
/**
* 函数功能:简单毫秒级延时函数
* 输入:time 延时时间(约1ms)
*/
void delay(uint16_t time)
{
uint16_t i = 0;
while(time--)
{
i = 12000;
while(i--);
}
}
/**
* 函数功能:主函数,程序入口
*/
int main()
{
// 初始化 LED 引脚 PA1
LED_Init();
// 初始化震动传感器引脚 PA0
Shake_Init();
// 死循环,不断检测震动信号
while(1)
{
// 判断:如果 PA0 检测到震动(低电平触发)
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)
{
// 亮灯
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
delay(1000);
// 灭灯
GPIO_SetBits(GPIOA, GPIO_Pin_1);
delay(1000);
}
// 没有震动时
else
{
// LED 保持熄灭
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
}
}
千万注意一定要加led的函数和头文件
shake.c(震动传感器驱动)
// 震动传感器头文件
#include "shake.h"
// STM32 标准库
#include "stm32f10x.h"
/**
* 函数功能:震动传感器初始化
* 配置 PA0 为上拉输入模式
* 震动传感器输出低电平表示触发
*/
void Shake_Init(void)
{
// 定义 GPIO 结构体
GPIO_InitTypeDef GPIO_Initstruct;
// 开启 GPIOA 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置 PA0 引脚
GPIO_Initstruct.GPIO_Pin = GPIO_Pin_0;
// 上拉输入模式(震动传感器常用模式)
GPIO_Initstruct.GPIO_Mode = GPIO_Mode_IPU;
// 初始化 PA0
GPIO_Init(GPIOA, &GPIO_Initstruct);
}
shake.h
#ifndef SHAKE_H_
#define SHAKE_H_
// 震动传感器初始化函数声明
void Shake_Init(void);
#endif
四、工作原理
- 震动传感器未震动时:输出高电平
- 震动传感器震动时:输出低电平
- 单片机检测到低电平 → 触发 LED 闪烁
五、代码结构
- main.c:主逻辑,检测震动 + 控制 LED
- shake.c/shake.h:震动传感器初始化驱动
- led.c/led.h:LED 控制驱动
六、实验现象
- 无震动:LED 熄灭
- 震动传感器被触发:LED 闪烁 1 秒