基于STM32F0实现人体红外传感器

article/2025/11/6 12:17:13

​​​​​​目的

了解人体红外传感器 HC-SR501 的驱动原理和STM32F030的中断机制,通过配置 STM32F030 芯片 GPIO 相关寄存器和外部触发中断实现人体红外传感器检测人体。

原理

中断是指当CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂停正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程就称为中断,我们把引起中断的原因,或者能够发出中断请求信号的来源统称为中断源。

NVIC,全称:Nested vectored interrupt controller,即嵌套向量中断控制器。Cortex-M0具有32个可屏蔽中断通道,4个可编程中断优先级(使用2位中断优先级),所有中断包括核心异常都由NVIC管理。中断优先级是指,假设有两个中断先后触发,已经在执行的中断优先级如果没有后触发的中断优先级高,就会先处理优先级高的中断。

外部中断线或外部事件线如下图所示:

 中断和事件的区别:由上图可以看出,从外部激励信号来看,中断和事件的产生源都可以是一样的,之所以分为两部分,是由于中断需要CPU参与,需要软件的中断服务函数才能完成中断后产生的结果;但是事件是由硬件自动完成这个事件产生的结果(比如:I/O触发产生事件,然后联动触发AD转换)。

GPIO和中断线的映射关系如下图:

从映射关系图可以看出,STM32F0供I/O口使用的中断线有16个,GPIO的管脚GPIOx.0~GPIOx.15(x = A,B,C,D,F)分别对应中断线0~15。

中断向量表分别介绍了Cortex-M0所有中断名称、说明以及中断的地址,下图中列出中断向量表一部分,本实验使用EXTI0_1外部中断,详细请参考STM32F030 参考手册(STM32F030 Series Reference Manual)P171。

HC-SR501 是基于红外线技术的自动控制模块,采用德国原装进口 LHI778 探头,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产品。

模块为全自动感应,当人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平。传感器有两种触发方式(可进行选择):第一种不可重复触发方式,即感应输出高电平后,延时一段时间结束,输出将自动从高电平变成低电平。第二种可重复触发方式,即感应输出高电平后,在延时时间段内,如果有人体在其感应范围活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)。

具有感应封锁时间(默认设置:2.5S 封锁时间):感应模块在每一次感应输出后(高电平变成低电平),可以紧跟着设置一个封锁时间段,在此时间段内感应器不接收任何感应信号。此功能可以实现“感应输出时间”和“封锁时间”两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。(此时间可设置在零点几秒—几十秒钟)。感应模块通电后有一分钟左右的初始化时间,在此期间模块会间隔地输出 0-3 次,一分钟后进入待机状态。

传感器调节方法:

注:

a)调节延时电位器顺时针旋转,感应延时加长(最大约 300S),反之,感应延时减短(最小约 0.5S)。

b)调节距离电位器顺时针旋转,感应距离增大(最大约 7 米),反之,感应距离减小(最小约 3 米)。

传感器原理图如下:

 从传感器原理图可以看出,当传感器识别到人输出高电平时,三极管Q3 S8050导通,LED灯亮,S_OUT引脚输出低电平。当传感器未识别到人输出低电平时,三极管Q3 S8050截止,LED灯灭,S_OUT引脚输出高电平。

步骤

  • 新建一个库函数工程。

  • 在工程中新建两个文件分别命名为sensor_human.c和sensor_human.h,并将sensor_human.c文件保存在该工程文件夹中,并添加sensor_human.h文件路径。

  • 在工程中添加蜂鸣器的初始化文件(具体初始化函数请参考源码)。

  •  在sensor_human.c文件中添加相应头文件
#include "sensor_human.h" 
#include "bsp_buzzer.h"
  • 在sensor_human.c文件中定义HC_SR501_Init()函数
// 引脚初始化
void HC_SR501_Init(void) 
{
}
  • 在HC_SR501_Init()函数中实现接收传感器数据引脚的配置,通过人体检测传感器硬件可以看到,传感器的输出信号口S_OUT与 STM32F030 开发板 PA0引脚对应,所以我们需要对 PA0 进行初始化和外部中断配置。

        第一步:使能GPIOA的时钟。

        第二步:定义相关结构体变量。

        第三步:初始化GPIOA。

        第四步:初始化和配置外部中断。

// 引脚初始化
void HC_SR501_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct; // 定义结构体变量EXTI_InitTypeDef EXTI_InitStruct; // 定义外部中断结构体变量NVIC_InitTypeDef NVIC_InitStruct;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // 初始化 GPIO时钟GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 设置为推挽输出GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; // 设置引脚为输入模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 引脚为 PA0GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_3; // 50MHzGPIO_Init(GPIOA, &GPIO_InitStruct);  // 初始化函数 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); // 选择用作EXTI线的GPIO引脚EXTI_InitStruct.EXTI_Line = EXTI_Line0; // 选择中断线0EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 选择中断触发EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 选择双边沿触发EXTI_InitStruct.EXTI_LineCmd = ENABLE; // 使能中断线EXTI_Init(&EXTI_InitStruct); // 初始化外部中断// 配置中断NVIC_InitStruct.NVIC_IRQChannel = EXTI0_1_IRQn; // 选择中断通道NVIC_InitStruct.NVIC_IRQChannelPriority = 2; // 选择中断优先级NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道NVIC_Init(&NVIC_InitStruct);
}
  • 配置中断服务程序用来处理读取到的传感器数据
// 配置中断服务函数
void EXTI0_1_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0)){EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志位if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)){BUZZER_OFF;	// 蜂鸣器关	}else{BUZZER_ON; //	蜂鸣器开	}}
}
  • 在sensor_human.h文件中进行函数声明
#ifndef _SENSOR_HUMAN_H_
#define _SENSOR_HUMAN_H_#include "stm32f0xx.h"void HC_SR501_Init(void);#endif
  • 在main.c文件中的main()函数中调用函数。

第一步:引用相关头文件。

第二步:在main()函数中初始化蜂鸣器和传感器:

#include "sensor_human.h"
#include "bsp_buzzer.h"int main()
{Buzzer_Init();  // 蜂鸣器初始化HC_SR501_Init(); // 传感器读取引脚初始化while(1){} 
}

现象

将程序下载到开发板中,等待传感器初始化后,当人从传感器经过时可以听到开发板上的蜂鸣器响起。

 更多交流欢迎关注作者抖音号:81849645041​​​​​​


http://chatgpt.dhexx.cn/article/WsD2v2od.shtml

相关文章

Arduino Uno 使用 人体红外传感器(HC_SR051)实现 人体感应灯

“登”,亮了., 每当我游走在图书馆书架之间就会有这样的一个情景。 这次实验使用的模块是人体红外传感器(HC_SR051),配上Arduino Uno 实现人体感应灯的实现。 先看看这模块(点击查看大图) 实验效…

HC-SR501 人体红外感应模块 单片机

https://blog.csdn.net/zy19981110/article/details/89947118?ops_request_misc%257B%2522request%255Fid%2522%253A%2522161616067916780357245177%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id161616067916780357245177&biz_id0&…

HC-SR501人体红外传感器

了解人体红外传感器HC-SR501的驱动原理,通过配置STM32F030芯片GPIO相关寄存器,让人体红外传感器识别到人体时使蜂鸣器响起的基础实验。 1、HC-SR501是基于红外线HC-SR501是基于红外线技术的自动控制模块 ,采用德国原装进口LHI778 探头设计&a…

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

文章目录 一、红外人体感应器的介绍二、利用红外人体感应器实现控制LED灯三、总结 一、红外人体感应器的介绍 产品参数 产品特点 ①全自动感应 当人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平。 ②光敏控制 (可选&…

人体红外线传感器

基于Arduino的人体红外线传感器 目的: 1.红外线模组与arduino结合,利用当有人进入感应范围内则输入高电平,人离开感应范围则自动关闭高电平,输出低电平的原理,采集到人身体上的红外信号,显示于 PC 串行端口监控窗口和…

人体红外传感器HC-SR501特点及使用介绍

人体红外传感器HC-SR501特点及使用介绍 前言一、人体红外传感器外观二、示意图三、相关参数讲解1.引脚2.优点3.产品特性(根据官方参考资料) 四、适用场所范围总结 前言 本文着重介绍人体红外传感器HC-SR501(基于红外线技术的自动控制模块)的原理、功能及…

【HC-SR501人体红外传感器】

HC-SR501人体红外传感器 今天分享的是HC-SR501人体红外传感器的使用,下面我会结合stm32以及正在做的合泰HT32这两个型号的芯片进行例程讲解。 HC-SR501介绍 1、HC-SR501是基于红外线HC-SR501是基于红外线技术的自动控制模块 ,采用德国原装进口LHI778 探头…

微信小程序点击数据列表,进入列表详情页面的思路

1.在index.wxml 通过 bindtap去绑定一个事件。 对于详情页的传输数据&#xff0c;点击事件可以通过 data- 去实现&#xff0c;后面相当于是键值对&#xff0c;data-id"{{item.id}}"&#xff0c;意思是把列表的id传过去。 <view class"goods"><vi…

小程序---小程序列表项拖拽排序

一、拖拽效果图展示 首先&#xff0c;上个gif图看看效果 吐血测试了一天&#xff0c;目前还未发现bug。ps(拖拽效果仅在前端实现&#xff0c;未和后端交互) 文章代码参考小程序实现列表拖拽排序 &#xff0c;参考文章还是存在一些bug和不足&#xff0c;比如&#xff0c;样式代…

微信小程序列表页

我们在做Android开发时,几乎每个app都有几个列表,在Android中列表一般是用listview&#xff0c;后来就使用recyclerview做了,不管是小程序还是Android或者ios&#xff0c;列表都是常见的一种数据展示方式,那么在小程序中怎么实现呢&#xff1f;先使用最笨的方法做, 如图&#…

小程序列表展示

小程序列表展示 wxml代码 <view class"content"><form catchsubmit"formSuos" catchreset"formReset"><view class"group"><view class"sous"><input class"text1_3" auto-focus pl…

微信小程序信息展示列表

微信小程序信息展示列表 效果展示: 代码展示: wxml <view class"head"><view class"head_item">分类</view><view class"ring"></view><view class"head_item">价格</view> </view>…

微信小程序-列表展示、条目点击。

直接贴图&#xff1a; wx:for"{{datas}}"设置数据源&#xff1b; wx:for-item"item"设置条目名称&#xff1b; data-index{{index}}设置角标。 bindtapitemClick点击事件。 {{item.item}}显示数据 datas数据源。 条目点击 itemClick: function(e) { …

【微信小程序】-- 案例 - 本地生活(列表页面)(三十)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

微信小程序删除list指定列表项

一、删除效果展示&#xff1a; // 重要代码片段async deleteListItem(e) {const sureResult await wx.showModal({title: "提示",content: "确定要删除这项吗",});if (sureResult.confirm) {const { index } e.currentTarget.dataset;setTimeout(()>{…

【小程序从0到1】小程序常用组件一览

欢迎来到我的博客 &#x1f4d4;博主是一名大学在读本科生&#xff0c;主要学习方向是前端。 &#x1f36d;目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 &#x1f6e0;目前正在学习的是&#x1f525; R e a c t / 小程序 React/小程序 React/…

微信小程序商城系列之商品列表页(一)

微信小程序商城列表页 wxml: <view classlist><block wx:for{{dataList}} wx:keylist wx:for-item"item"><view class"list_item"><navigator urldetails?id{{item.goods_id}}><view classimg><image src"{{imghr…

微信小程序——商品列表

主页面 <view class"container"><googsList goodsClassList"{{goodsClassList}}" goodsList"{{goodsList}}" bind:leftClick"leftClick" bind:toDetails"toDetails" bind:scrolltolowerGoodsClass"scroll…

微信小程序 - 商城项目 - 列表排序

sort ( ) 排序 需要实现两个排序功能&#xff0c;价格排序和好评排序&#xff0c;且都可以正反切换 数字比较 价格排序中&#xff0c;价格为数字类型&#xff0c;属于数字的比较&#xff0c;无需转换类型 // 点击价格排序的图标handlePrice(){this.setData({priceOrder:!this…

微信小程序之多列表的显示和隐藏功能【附源码】

效果图&#xff1a; 实现思路&#xff1a; 实现单个列表的显示和隐藏应该使用唯一元素让程序知道你应该显示和隐藏哪个列表项&#xff0c;可以用数据的id&#xff1b;css中定义一个hidden{display&#xff1a;none}控制显示和隐藏&#xff0c;然后通过三元运算符来判断&#x…