项目一:振动传感器控制LED灯

项目简介:本项目通过STM32开发板作为中心控制器,利用振动传感器、继电器实现对LED灯的控制。是STM32入门的经典小实验,对于硬件环境的搭建、软件的编写都具有一定的提升功能。

项目设备:一块STM32F103开发板、一个继电器、一个震动传感器、一个LED灯。

项目实验:

目录

实验一:点亮STM32开发板本身的LED灯;

实验二:利用继电器点亮外接的LED灯;

实验三:利用振动传感器点亮外接的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端口的结构体。

  1. 使能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

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值