51单片机使用HC-SR501人体红外感应器C语言

51单片机使用HC-SR501人体红外感应器C语言

前言

买到该产品后问客服和面向百度编程,发现在51单片机上 使用的教程不多,且不够细致,使用存在困难,烦躁了很久,为了不让后来者跟我一样,写一篇 文章,第一次写,排版和言语照顾不周,见谅

HC-SR501介绍

HC-SR501 是一款基于热释电效应的人体热释运动传感器,能检测到人体或者动物上发出的红外线。这个传感器模块可以通过两个旋钮调节检测 3 ~ 7 米的范围,5秒至5分钟的延迟时间,还可以通过跳线来选择单次触发以及重复触发模式。
下图为大概功能描述:
在这里插入图片描述
图来自(https://blog.csdn.net/weixin_41939983/article/details/106418835?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-17.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-17.nonecase)该网站还有更较详细的简介
在这里插入图片描述
(图来自http://www.51hei.com/bbs/dpj-106474-1.html)

C代码

与单片机连线为左接5V,右接GND,中间接P33(透镜朝下,引脚面向自己)
效果为:检测到人以后,p3^3输出高电平,使得灯灭,否则灯亮

#include<reg52.h>
sbit dat=P3^3;		 //	   接传感器out


	  void delayx(unsigned int x)
	   {
	   unsigned int i,j;
	   for(i=x;i>0;i--)
	   for(j=112;j>0;j--)
	   ;
	   }	   

void main() {
	//dat=0;		//51默认高电平,先置0
	 
P2=0xFF;
	while(1){
	delayx(50);//延时50ms
		
		if(dat==1)			   //1高电平,人进入范围感应器输出1 -> dat
		P2=0xFF;			 //灯全灭
		else
		P2=0x00;		//灯全亮
	}
}
	

爬过的坑

1、给的资料所描述默认是可重复触发不是真实的,我在两家淘宝店买到的默认都不是可重复触发状态,需要把跳线帽取下来装到H,具体看第一张图
2、该传感器必须在检测范围内活动才可以检测到,静止不行
3、检测不是很高效,所以用起来和想要的效果有点不够

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); }
51单片机HC-SR501人体感应模块通常用于自动控制灯光开关的应用。这个模块通过红外传感器检测人体活动,当有人接近时,模块会发送一个信号给单片机单片机会接收到这个信号并控制连接的小灯点亮或熄灭。 下面是一个简单的基于51单片机(比如8051系列的AT89S52)和HC-SR501人体感应小灯程序的大致步骤: 1. **硬件连接**: -HC-SR501模块的IN引脚接到单片机的输入口(如P3.0),VCC接到5V电源,GND接地。 - 灯泡接在单片机的输出口(如P3.1)作为LED指示灯。 2. **软件编程**: - 使用汇编语言编写程序,首先要初始化IO口,例如设置P3.0为输入模式,P3.1为输出模式。 - 写入主循环,在这里不断检查HC-SR501的输入状态(一般通过查询中断标志位IR1)。如果IR1被触发(即人体感应到),则清除中断并将灯泡置高电平(亮起);反之,灯泡置低电平(熄灭)。 - 定义中断服务函数,处理人体感应事件,包括清除中断请求。 ```assembly ; 省略头文件、数据段等部分 ; 主程序入口点 main: mov P3, #0x0F ; 初始化IO口 mov IE, #0x81 ; 开启外部中断1 sjmp $ ; 进入无限循环 ; 中断服务函数 intrsvc: in P3.0, P3 ; 读取HC-SR501的输入 jnz human_detected, turn_on_light mov P3.1, #0 ; 灯熄灭 reti ; 返回主循环 human_detected: mov P3.1, #1 ; 灯亮起 clri ; 清除中断 reti ; 其他必要的程序配置... ```
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值