stm32的外部中断 震动感应 控制 继电器

继电器模块

relay.c
#include "relay.h"
#include "stm32f10x.h"                  // Device header

void Relay_Init(void)
{
		GPIO_InitTypeDef Relay_init ;
		//1.使能GPIOA时钟
		RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA ,  ENABLE);
		//2.GPIOA3结构体配置
		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);

}
relay.h
#include "stm32f10x.h"

void Relay_Init(void);

震动感应模块

shake.c
#include "shake.h"
#include "stm32f10x.h"                  // Device header

void Shake_Init(void)
{
	GPIO_InitTypeDef Shake_init;
	//1.打开我们的GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//2.配置GPIOA1的配置
	Shake_init.GPIO_Mode  = GPIO_Mode_IPD;  //震动传感器初始为高电平  所以用下拉模式 拉到低电平
	Shake_init.GPIO_Pin   = GPIO_Pin_1;
	Shake_init.GPIO_Speed = GPIO_Speed_10MHz;
		
	 GPIO_Init( GPIOA, &Shake_init);

}
shake.h
#include "stm32f10x.h"

void Shake_Init(void);

中断配置

exti.c
#include "exti.h"
#include "stm32f10x.h"                  // Device header

void Exti_Init(void)
{
	//1.配置GPIO
	//这三都是结构体
	GPIO_InitTypeDef Shake_init; //gpio.h
	EXTI_InitTypeDef Exti_init;	 //exit.h
	NVIC_InitTypeDef Nvic_init;	 //misc.h
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);      //配置外部中断源
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,  GPIO_PinSource1); //gpio.h配置的外部中断源是GPIOA1  是shake震动传感器

	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //配置NVIC中断组
	
	Shake_init.GPIO_Mode  = GPIO_Mode_IPD;  //震动传感器初始为高电平  所以用下拉模式 拉到低电平
	Shake_init.GPIO_Pin   = GPIO_Pin_1;
	Shake_init.GPIO_Speed = GPIO_Speed_10MHz;
		
	 GPIO_Init( GPIOA, &Shake_init);
	//2.配置EXTI外部中断
	Exti_init.EXTI_Line    = EXTI_Line1;       
	Exti_init.EXTI_LineCmd = ENABLE;             //使能
	Exti_init.EXTI_Mode 	 = EXTI_Mode_Interrupt;
	Exti_init.EXTI_Trigger = EXTI_Trigger_Falling;
	
	EXTI_Init(&Exti_init);

	//3.配置NVIC中断控制器  在misc.h里
	Nvic_init.NVIC_IRQChannel = EXTI1_IRQn;     //= 配置在启动文件里                     //中断通道
	Nvic_init.NVIC_IRQChannelCmd = ENABLE;      //使能  找到FunctionalState字眼 右键goto
	Nvic_init.NVIC_IRQChannelPreemptionPriority = 1;   //因为只配置了一个中断  不考虑优先级 所以只有1个
	Nvic_init.NVIC_IRQChannelSubPriority = 1;
	
	NVIC_Init(&Nvic_init);
	
	//4.配置中断服务函数
	
}
exti.h
#include "stm32f10x.h"  

void Exti_Init(void);


主函数 

main.c
#include "stm32f10x.h"                  // Device header
#include "led.h"
#include "relay.h"
#include "shake.h"
#include "exti.h"

void delay(uint16_t time)
{
		uint16_t i = 0;
		while(time--)
		{
			i=12000;
			while(i--);
		}
}
int main(void)
{
		LED_Init();
		Relay_Init();
		Shake_Init();
		Exti_Init();
		GPIO_SetBits(GPIOA , GPIO_Pin_3); //初始化继电器为关闭状态
		while(1)
		{
//				if(GPIO_ReadInputDataBit( GPIOA,  GPIO_Pin_1) == 0) //如果发生震动
//				{
//						GPIO_ResetBits(GPIOA , GPIO_Pin_3);  //开灯
//						delay(1000);												 //持续一秒
//						GPIO_SetBits(GPIOA , GPIO_Pin_3);		 //关灯
//				}else{
//						GPIO_SetBits(GPIOA , GPIO_Pin_3);
//				}

			
//			 GPIO_ResetBits( GPIOA,  GPIO_Pin_3);
			
//				delay(1000);
//			GPIO_SetBits(GPIOA , GPIO_Pin_3);

			
			
//			  GPIO_ResetBits(GPIOC , GPIO_Pin_13); //void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//				delay(1000); //1s
//				GPIO_SetBits(GPIOC , GPIO_Pin_13);
//				delay(1000);
		}
}
//4.中断服务函数
void EXTI1_IRQHandler(void)//在启动文件
{
	if (EXTI_GetITStatus( EXTI_Line1 )  != RESET) //判断是否发生了中断  右键 EXTI_GetITStatus goto  //在exit.h
	{
		GPIO_ResetBits(GPIOA , GPIO_Pin_3);  //打开继电器,开灯
		delay(1000);
		GPIO_SetBits(GPIOA , GPIO_Pin_3);		 //关闭继电器,关灯
	}
		EXTI_ClearFlag( EXTI_Line1);
			
}

猜你喜欢

转载自blog.csdn.net/weixin_46016743/article/details/114417161