基于STM32的红外人体感应器控制LED灯的状态

一、红外人体感应器的介绍

  1. 产品参数
    在这里插入图片描述
  2. 产品特点
    ①全自动感应
    当人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平。
    ②光敏控制 (可选)
    模块预留有位置,可设置光敏控制,白天或光线强时不感应。光敏控制为可选功能 ,出厂时未安装光敏电阻。如果需要,请另行购买光敏电阻自
    己安装。
    ③温度补偿 (可选择,出厂时未设 )
    在夏天当环境温度升高至 30~32℃,探测距离稍变短,温度补偿可作一定的性能补偿。
    ④两种触发方式(可跳线选择)
    a、不可重复触发方式
    感应输出高电平后,延时时间段一结束,输出将自动从高电平变成低电平。
    b、可重复触发方式
    感应输出高电平后,在延时时间段内,如果有人体在其感应范围活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次
    活动的时间为延时时间的起始点 )。
    ⑤具有感应封锁时间 (默认设置 :2.5S 封锁时间 )
    感应模块在每一次感应输出(高电平变成低电平),可以紧跟着设置一个封锁时间段,在此时间段内感应器不接受任何感应信号。此功能可以实现“感应输出时间”和“封锁时间”两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。 (此时间可设置在零点几秒—几十秒钟 )。

二、利用红外人体感应器实现控制LED灯

  1. 试验所采用的工具
    硬件:计算机 1 台;野火开发板 1 个;红外人体感应器1个;下载器ST_Link
    软件:keil
  2. 程序代码
    main函数
int main(void)
{
	/* LED 端口初始化 */
	LED_GPIO_Config();
	  	
	/* 初始化EXTI中断,按感应到人体热源会触发中断*/
	EXTI_SR501_Config(); 
	/* 等待中断,由于使用中断方式,CPU不用轮询按键 */
	while(1)                            
	{
		
	}
}

外设中断的按键实现代码

void EXTI_SR501_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure; 
	EXTI_InitTypeDef EXTI_InitStructure;

	/*开启按键GPIO口的时钟*/
	RCC_APB2PeriphClockCmd(SR501_INT_GPIO_CLK,ENABLE);
												
	/* 配置 NVIC 中断*/
	NVIC_Configuration();
	
/*--------------------------GPIO配置-----------------------------*/
	/* 选择按键用到的GPIO */	
  GPIO_InitStructure.GPIO_Pin = SR501_INT_GPIO_PIN;
  /* 配置为浮空输入 */	
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(SR501_INT_GPIO_PORT, &GPIO_InitStructure);

	/* 选择EXTI的信号源 */
  GPIO_EXTILineConfig(SR501_INT_EXTI_PORTSOURCE, SR501_INT_EXTI_PINSOURCE); 
  EXTI_InitStructure.EXTI_Line = SR501_INT_EXTI_LINE;
	
	/* EXTI为中断模式 */
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	/* 上升沿中断 */
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
  /* 使能中断 */	
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
{
  uint32_t tmp = 0x00;
  /* Check the parameters */
  assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource));
  assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  
  tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));
  AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;
  AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));
}
  1. 下载运行结果
    在这里插入图片描述
    当手接触到红外感应器的时候,可能需要等待一段时间,LED才会亮,如果一直不松手的话,LED会一直处于亮的状态,一旦松开手之后,LED就会熄灭。不过,LED可能会人没有接触感应器也会出现点亮的情况,这个产生的原因应该是感应器受到外界的影响或者是感应器比较敏感造成的。此感应模块,在会出现一些延时的情况。

补充:模块连接方式,红线连接5V电源,黑色连接GND(接地),黄色连接PA8

三、总结

本过程主要是对于该感应器的原理进行一个理解,当感应器感受到人体的时候,就会输出高电平,反之,就输出低电平。要想理解代码,还需要对外设中断有一定的了解,外设中断的详细内容可以参考网上的讲解视频。

完整代码
百度网盘分享链接:
https://pan.baidu.com/s/19hzfrZxrlRpNSEDEdTOkrg
提取码:6hf3

STM32F407IGT6单片机 HC-SR501人体红外感应模块(串口屏显示)KEIL软件工程源码, int main(void) { uint8_t state; /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /* 初始化串口并配置串口中断优先级 */ MX_DEBUG_USART_Init(); HMI_USARTx_Init(); /* 初始化LED */ LED_GPIO_Init(); HC_SR501_GPIO_Init(); /* 无限循环 */ while (1) { state=HC_SR501_StateRead(); switch(state) { case HC_SR501_LOW: HMI_string_setting("page1.t1.txt=\"无人\""); break; case HC_SR501_HIGH: HMI_string_setting("page1.t1.txt=\"有人\""); break; } } } /** * 函数功能: 向串口屏发送数据 * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */ void HMI_value_setting(const char *val_str,uint32_t value) { uint8_t tmp_str[30]={0}; uint8_t i; sprintf((char *)tmp_str,"%s=%d",val_str,value); for(i=0;i<strlen((char *)tmp_str);++i) { HMI_USARTx->DR=tmp_str[i]; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); } HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); } /** * 函数功能: 向串口屏发送浮点数据 * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */ void HMI_string_setting(const char *val_str) { uint8_t tmp_str[50]={0}; uint8_t i; sprintf((char *)tmp_str,val_str); for(i=0;i<strlen((char *)tmp_str);++i) { HMI_USARTx->DR=tmp_str[i]; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); } HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); }
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值