基于STM32最小系统的超简易报警装置(图解)

需求:按下遥控A键进入警报模式,按下遥控B键解除警报模式;在警报模式下,有震动则警报响。

软件:CubeMX,Keil5

硬件:STM32F103C8T6,震动传感器,蜂鸣器,433M无线接收模块,433M无线发射模块

1.配置STM32

打开CubeMX,点击ACCESS TO MCU SELECTOR

搜索STM32F103C8T6,后双击

设置时钟

按下图操作后回车

PB9(LED2):输出,配置:GPIO mode :high

PB8(LED1):输出,配置 :GPIO mode :high

PB6:输出,配置 :GPIO mode :high

PA4:中断,配置:GPIO mode:External lnterrupt Mode with Falling edge trigger detection

PA5,PA6:中断,配置:GPIO mode:External lnterrupt Mode with Rising edge trigger detection

打开中断

最后点击GENERATE CODE,选择 open project

2.实现代码

 1.连接振动传感器,DO--PA4

 2.连接蜂鸣器,I/O--PB6

注意:VCC--3.3V

3.连接433M无线接收模块

D0--PA5,  D0对应433M无线发射模块A键

D1--PA6,  D1对应433M无线发射模块B键

4.在main.c中重写中断函数

下方代码:测试震动传感器

测试说明:有震动则LED2亮

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//重写中断函数,当检测到有中断申请时,调用此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
    //判断中断源是否来自PA4
    if(GPIO_Pin == GPIO_PIN_4){
            //若PA4为低电平,则点亮LED1
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET){
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET );
        }
        //若不为低电平,否则关闭LED1
        else{
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET );
        }
    }
    
}
/* USER CODE END 0 */

下方代码:测试433M无线接收模块,433M无线发射模块

测试说明:按下A键LED2亮1.5秒,按下B键LED1亮1秒

//重写中断函数,当检测到有中断申请时,调用此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
	switch(GPIO_Pin){
		
		case GPIO_PIN_5:{
			//若PA5被拉高,LED2亮一秒
			if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_SET){
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET );
				for(int i=0;i<10000000;i++);
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET );
			}
			break;
		}
		
		case GPIO_PIN_6:{
			//若PA6被拉高,LED1亮一秒
			if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET){
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_RESET );
				for(int i=0;i<10000000;i++);
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_SET );
			}
			break;
		}
		
		
	}
	
	/*
	//判断中断源是否来自PA4
	if(GPIO_Pin == GPIO_PIN_4){
			//若PA4为低电平,则点亮LED2
		if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET){
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET );
		}
		//若不为低电平,否则关闭LED2
		else{
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET );
		}
	}
	*/
	
}

最终代码:

//重写中断函数,当检测到有中断申请时,调用此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){

	static int mark = J_OFF;
	switch(GPIO_Pin){
		case GPIO_PIN_4:{
			//在警报模式下,如果检测到有震动,蜂鸣器一直响
			
			if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET && mark == J_ON){
				//拉低PB7
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_RESET );
			}
			break;
		}
		//如果检测到PA5被拉高(A键被按下),开启警报模式
		case GPIO_PIN_5:{
			//若PA5被拉高,LED2亮一秒,蜂鸣器响1.5秒
			if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_SET){
				mark = J_ON;
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_RESET );
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_RESET );
				HAL_Delay(1500);
				//for(int i=0;i<10000000;i++);
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET );
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_SET );
			}
			break;
		}
		
		//如果检测到PA6被拉高(B键被按下),解除警报模式
		case GPIO_PIN_6:{
			//若PA6被拉高,LED1亮一秒,蜂鸣器响1秒
			if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET){
				mark = J_OFF; 
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_RESET );
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_RESET );
				HAL_Delay(1000);
				//for(int i=0;i<5000000;i++);
				HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,GPIO_PIN_SET );
			  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_SET );
				
			}
			break;
		}
	}
}

alert_project

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值