继电器模块
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);
}