原理

人体都有恒定的体温,一般在 37 度,所以会发出特定波长 10um 左右的红外线。人体发射的 10um 左右的红外线通过菲涅尔滤光片增强后聚集到红外感应源上,这种元件在接收到人体红外辐射温度发生变化时就会失去电荷平衡,向外释放电荷,后续电路检测处理后就能产生报警信号。

实物图(正反面)

型号:HC-SR50
在这里插入图片描述

传感器特性

工作电压范围 直流电压 4.5-20V

电平输出 高 3.3 V /低 0V
触发方式 L 不可重复触发/H 重复触发
延时时间 0.5-200S(可调)
封锁时间 2.5S(默认)可制作范围零点几秒-几十秒
感应范围 3米到7米

实验

全自动感应 :人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平。
感应模块通电后有一分钟左右的初始化时间,在此期间模块会间隔地输出 0-3 次,一分钟后进入待机状态。

如果检测到红外,则LED灯亮,否则灭。
模块数据输出接到PA4

  • 中断功能
  • 配置中断向量控制器NVIC
  • 配置外部中断口
  • 实现中断函数

中断控制器

#define SR501_INT_GPIO_PORT         GPIOA
#define SR501_INT_GPIO_CLK          (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO)
#define SR501_INT_GPIO_PIN          GPIO_Pin_4

#define SR501_INT_EXTI_PORTSOURCE   GPIO_PortSourceGPIOA
#define SR501_INT_EXTI_PINSOURCE    GPIO_PinSource4
#define SR501_INT_EXTI_LINE         EXTI_Line4
#define SR501_INT_EXTI_IRQ          EXTI4_IRQn

#define SR501_IRQHandler            EXTI4_IRQHandler


//嵌套中断向量控制器
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  /* 中断控制器组*/
  NVIC_InitStructure.NVIC_IRQChannel = SR501_INT_EXTI_IRQ;//外部中断线
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  /*优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  /* 子优先级*/
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  /* 使能 */
  NVIC_Init(&NVIC_InitStructure);
}

外部中断口

//IO 为EXIT外部中断口
void EXTI_SR501_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure; 
	EXTI_InitTypeDef EXTI_InitStructure;
	
	RCC_APB2PeriphClockCmd(SR501_INT_GPIO_CLK,ENABLE);/*时钟*/											
	NVIC_Configuration();/* 配置NVIC中断*/
	
    GPIO_InitStructure.GPIO_Pin = SR501_INT_GPIO_PIN;//gpioy引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  /*输入方式 浮空 */	
    GPIO_Init(SR501_INT_GPIO_PORT, &GPIO_InitStructure);

	/* 信号源 */
    GPIO_EXTILineConfig(SR501_INT_EXTI_PORTSOURCE, SR501_INT_EXTI_PINSOURCE); 
    EXTI_InitStructure.EXTI_Line = SR501_INT_EXTI_LINE;//中断线
    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 SR501_IRQHandler(void)
{
	if(EXTI_GetITStatus(SR501_INT_EXTI_LINE) != RESET) 
	{
		LED1_TOGGLE;
		EXTI_ClearITPendingBit(SR501_INT_EXTI_LINE);     
	}  
}

LED灯配置

#define LED1_GPIO_PORT    	GPIOB			         
#define LED1_GPIO_CLK 	    RCC_APB2Periph_GPIOB	
#define LED1_GPIO_PIN		GPIO_Pin_5			

void LED_GPIO_Config(void)
{		
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd( LED1_GPIO_CLK , ENABLE);
		GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;	
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
		GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);	
		GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
}

主函数

int main(void)
{
	LED_GPIO_Config();
	EXTI_SR501_Config(); 	
	while(1)                            
	{
	}
}

参考
野火-HC-SR501人体红外感应模块热释电红外传感器.pdf