基于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

猜你喜欢

转载自blog.csdn.net/qq_43279579/article/details/111414938