项目简介:本项目通过STM32开发板作为中心控制器,利用振动传感器、继电器实现对LED灯的控制。是STM32入门的经典小实验,对于硬件环境的搭建、软件的编写都具有一定的提升功能。
项目设备:一块STM32F103开发板、一个继电器、一个震动传感器、一个LED灯。
项目实验:
目录
实验一:点亮STM32开发板本身的LED灯;
首先,通过对STM32开发板的电路图分析,进行编写代码,实现开发板上LED灯的点亮;
如下图所示,为所用的开发板的硬件电路图,开发板共有两个LED灯,其中LED1为开发板的电源指示灯,给开发板供电即可点亮,而LED2一端接高电平(3.3V),另一端接PA1口,若要点亮LED2,则要将端口PA1置于低电平(LED灯单向导通);
需要先配置一个完整的固件库模板,并且建立一个LED的.c文件以及.h文件,并且加入到固件库中的USER文件夹,配置main.c、led.c、led.h文件,实现函数的调用;在led.c中定义一个函数,void LED_Init(void);对于PA1口输出低电平分为两步,1、使能PA1口所在GPIA的闹钟;2、配置PA1端口的结构体。
- 使能PA1口的GPIA的闹钟
通过查找数据手册,GPIOA端口属于APB2的外设时钟使能寄存器, 对其进行使能处理。在外设rcc.h文件调用其使能函数,并进行配置。
2.配置PA1端口的结构体
在gpio.h文件中查找GPIOA的结构体,分别包括输出模式、输出引脚以及输出速度。
代码分享:
1、led.c文件
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{
GPIO_InitTypeDef Led_Init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
Led_Init.GPIO_Mode = GPIO_Mode_Out_PP;
Led_Init.GPIO_Pin=GPIO_Pin_1 ;
Led_Init.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&Led_Init);
}
2、main.c文件
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
int main()
LED_Init
while(1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
实验二:利用继电器点亮外接的LED灯;
继电器是一种控制元器件,利用一条回路来控制另一条回路的开与关,最典型的用途为弱电控制强电,在输入端VCC接电源正极,GND接电源负极,IN端是信号线通过高低电平来控制继电器的吸合;继电器的输出端为,NO:继电器常开接口,继电器吸合前悬空,吸合后与COM短接;COM:继电器公用接口;NC:继电器常闭接口,继电器吸合前与COM短接吸合后与COM悬空;
我们在输入端利用NO与COM端通过低电平有效来控制,继电器的VCC接单片机的3.3V,继电器的GND接单片机的GND,继电器的IN端接单片机的PA3口,继电器的NO口与COM与灯还有电源相连;
代码分享:
1、relay.c文件
#include "relay.h"
#include "stm32f10x.h"
void Relay_Init(void)
{
GPIO_InitTypeDef Relay_Init;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE );
Relay_Init.GPIO_Mode= GPIO_Mode_Out_PP;
Relay_Init.GPIO_Pin=GPIO_Pin_3;
Relay_Init.GPIO_Speed=GPIO_Speed_10MHz ;
GPIO_Init(GPIOA, & Relay_Init);
}
2、main.c文件
#include "stm32f10x.h"
#include "main.h"
#include "relay.h"
void delay(uint16_t time)
{
uint16_t i=0;
while(time--)
{
i=12000;
while(i--);
}
}
int main()
Relay_Init();
while(1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
}
实验三:利用振动传感器点亮外接的LED灯;
振动传感模块,当振动传感器SW-18010P接触到振动时,通过输出端口DO输出数字信号。VCC接单片机的3.3V电压,GND接单片机的GND口,DO端接电片机的PA2口。
当模块发生振动时,输出端输出低电平,开关信号指示灯亮;
当模块发生振动时,输出端输出高电平,开关信号指示灯灭;
实物接线图:
代码分享:
1、main.c文件
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "relay.h"
#include "shake.h"
void delay(uint16_t time)
{
uint16_t i=0;
while(time--)
{
i=12000;
while(i--);
}
}
int main()
{
LED_Init();
Relay_Init();
Shake_Init();
GPIO_SetBits(GPIOA, GPIO_Pin_3 );
while(1)
{
if( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_2)==0)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
delay(1000);
GPIO_SetBits(GPIOA, GPIO_Pin_3);
}
else
GPIO_SetBits(GPIOA, GPIO_Pin_3 );
}
}
2、shake.c文件
#include "shake.h"
#include "stm32f10x.h"
void Shake_Init(void)
{
GPIO_InitTypeDef shake_init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
shake_init.GPIO_Mode= GPIO_Mode_IPD ;
shake_init.GPIO_Pin=GPIO_Pin_2;
shake_init.GPIO_Speed= GPIO_Speed_10MHz;
GPIO_Init(GPIOA ,&shake_init);
}
3、relay.c文件
#include "relay.h"
#include "stm32f10x.h"
void Relay_Init(void)
{
GPIO_InitTypeDef Relay_Init;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE );
Relay_Init.GPIO_Mode= GPIO_Mode_Out_PP;
Relay_Init.GPIO_Pin=GPIO_Pin_3;
Relay_Init.GPIO_Speed=GPIO_Speed_10MHz ;
GPIO_Init(GPIOA, & Relay_Init);
}
实验现象:
WeChat_20230420161722