基于51控制的人体感应灯

article/2025/10/15 15:25:27

文章目录

  • 前言
  • 1 背景
  • 2 可实现功能
  • 3 制作材料
  • 4 设计电路
  • 5 设计原理
    • 5.1 原理一(人体感应)
    • 5.2 原理二(距离感应)
    • 5.3 原理三(灯的亮度调节)
  • 6 程序设计
  • 7 成品模型展示
  • 总结

前言

首先我先说说为什么要做这个东西,这个是由于前几天一个朋友突然找我说要交一个作业但又不知道要做什么,我听了作业要求后要求后给出的解决方法,做一个人体感应灯,并答应她帮她做。

1 背景

为什么要做这个灯呢?由于现在大部分楼道灯仍采用声光控制,这就导致晚上时你必须弄出点声响才可以点亮楼道灯,但晚上声音必然会造成扰民,所以这个设计一点也不人性化。因此提出一款基于51开发的人体感应贴心灯,本作品是基于STC89C52单片机开发的人体感应贴心灯。当有人靠近时贴心灯会自动点亮,当人与感应开关距离越来越接近时,灯的亮度也会随之增强。本作品可以用于楼道灯、学生智能台灯、以及人行道的路灯的控制,以优化用户的体验,达到贴心的效果。

2 可实现功能

当人体靠近灯时,灯会自动点亮,此时单片机通过超声波来检测人距离灯的位置,来控制灯的亮度,当人距离灯越近时灯越亮。当附近无人时8秒后灯会自动熄灭。

3 制作材料

在这里插入图片描述

4 设计电路

这里设计电路就不多讲了,我主要说说我的51的I/O口分配,电路可以自己设计去焊接。
其实整个作品对初学者来说也是不算难的

led正极
P1.1
led负极
P1.2
超声波trig
P0.0
超声波echo
P0.1
感应开关
P2.0

5 设计原理

5.1 原理一(人体感应)

我们每个人都会释放红外,所以我们采用一种红外热释电模块用来检测是否有人体靠近。当有人靠近时,红外热释电模块会产生高电平,当没有人时该模块会产生低电平,基于这个原理,我们可以将这两种信号分别送入单片机以控制灯的状态。

5.2 原理二(距离感应)

距离感应我们可以采用超声波模块,超声波模块会自动产生40KHZ的方波,当方波遇到障碍物时会返回,我们只需用单片机测出从发射方波到返回方波的时间就可以求出距离。测试距离=(时间*声速(340m/s))/2。

5.3 原理三(灯的亮度调节)

方法一:灯的亮度跟灯的电压有关,我们可以才用降压法来改变灯的亮度。那么如何实现自动降压?由于51单片机的I/O口只能固定输出5V的电压,所以我准备pwm来模拟电压以实现自动调节灯的亮度。

方法二:一个大的led是由许多小的led组成的,我们可以采用分块控制来实现亮度调节,当需要最亮光强时我们将led全部点亮,当需要弱亮光强时我们点亮部分led以实现亮度调节的功能。

这个作品我才用方法一来实现。

6 程序设计

#include<reg52.h> 
#include<intrins.h>  //包涵了_nop_()函数声明
typedef unsigned int unint;
typedef unsigned char unchar;
//TRIG 为控制端
sbit TRIG = P0^0; //超声波的 TRIG端  插在了P1.6口
//ECHO 为接收端
sbit ECHO = P0^1; //超声波的 ECHO端  插在了P1.7口
/*还有vcc,gnd 就直接插在了单片机 vcc 和gnd 端口了
*也可以将其插在I/O引脚中 将插 vcc的引脚置高电平,gnd置低电平*/
sbit  IN1=P1^1;      
sbit  IN2=P1^2;  
sbit  key=P2^0; 
unsigned int DGH,DGL,DDH,DDL,c; 
unchar flag = 0; //标志定时器是否溢出
void delay_20us(); // 延时20ms
void init_time();  //初始化定时器的函数
/*********中断程序2****用于控制led亮度*********/ 
void timer2() interrupt 3 using 3       //中断3  T1溢出中断,使用工作组3
{ IN1=!IN1;if(IN1==0)   // {IN1=0;TH1=DDH;TL1=DDL;}else{IN1=1;TH1=DGH;TL1=DGL;}           
} 
void off(void)               //   关灯
{   TR1=0;IN1=0;
}
void play(void)               //   
{   c=700;DGH=(65535-c)/256;DGL=(65535-c)%256;DDH=(65535-(2000-c))/256;DDL=(65535-(2000-c))%256; TR1=1;
}
void play1(void)               //   
{   c=500;DGH=(65535-c)/256;DGL=(65535-c)%256;DDH=(65535-(2000-c))/256;DDL=(65535-(2000-c))%256; TR1=1;
}
void play2(void)               //   
{   c=300;DGH=(65535-c)/256;DGL=(65535-c)%256;DDH=(65535-(2000-c))/256;DDL=(65535-(2000-c))%256; TR1=1;
}
void play3(void)               //
{   c=100;DGH=(65535-c)/256;DGL=(65535-c)%256;DDH=(65535-(2000-c))/256;DDL=(65535-(2000-c))%256; TR1=1;
}
void init() // 初始化函数
{                           TMOD=0x11; // 设置T1,T2定时器工作方式             ET0=1;ET1=1;              EA=1;  // 打开总开关             TR0=0; // 关闭T0计时器IN2=0;TR1=1; // 打开T1定时器c=500;  
}
/*************程序主函数**********************/
void main()
{unint time_data,out_TH0,out_TL0;init();TRIG = 0; // 先给控制端初始化为0while(1){if (key==1){init_time(); //初始化定时器flag = 0;    //置溢出标志位为0//控制口发一个10US 以上的高电平TRIG = 1;    delay_20us();TRIG = 0;//等待接收端出现高电平while(!ECHO);TR0 = 1; //启动计时器 开始计时while(ECHO); //等待高电平结束TR0 = 0; //关闭低电平out_TH0 = TH0; //取定时器的值out_TL0 = TL0;out_TH0 <<= 8;  //右移8位 time_data = out_TH0 | out_TL0; //合并为16位的值  time_data /= 58; // 微秒/58 = 厘米/*    为什么微秒/58 = 厘米*     Y米 = (X秒 * 344) 2*     X秒 = (2 * Y米) / 344X秒 = 0.0058*Y米*     厘米 = 微秒/58     */if((time_data>=10)&&(time_data<=40)){play();}else if((time_data>=41)&&(time_data<=60)){play1();}else if((time_data>=61)&&(time_data<=80)){play2();}else if((time_data>=81)&&(time_data<=110)){play3();}}else  if (key==0)off();}
}
/***********以下全为控制超声波需要的函数**************/void timer0() interrupt 1 //中断函数
{flag=1; //溢出标志位置1
}
void init_time()
{TH0 = 0; //装初值0TL0 = 0;TF0 = 0; //中断溢出标志位ET0 = 1; //开定时器中断
}
void delay_20us() //延时20us
{_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}

7 成品模型展示

整体图
在这里插入图片描述
主控电路
在这里插入图片描述
灯的电路
在这里插入图片描述
点亮效果
在这里插入图片描述

无包装,原生态,由于演示视频较大,这里就不上传了。

总结

为什么要用51?其实51的电路很好设计,现在主流的控制器一般都是STM32,但32的电路包括32最小系统都不好焊接,所以选用51。周4刚好我只有一节课,整个作品从设计电路到程序编写,到成品完成只用了半天时间,所以这个作品适合初学者去DIY。小半天就好了,51其实还挺好玩的。


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

相关文章

人体感应(红外感应)

一、需求描叙 通过打开写的测试的app&#xff0c;点击测试的按钮&#xff0c;循环调用控制人体感应的方法来控制人体感应仪器&#xff08;应该是红外感应&#xff09;。 二、完成测试程序涉及到的文件&#xff1a; 1.一个xxx.so文件&#xff1b; 这个文件要导入到Android系统…

Arduino 使用人体红外感应模块 HC-SR501

通过这篇文章&#xff0c;可以了解到以下内容&#xff1a; HC-SR501 传感器的基本信息及接线方法HC-SR501 跳线选择的两种时间模式HC-SR501 简单功能实验 HC-SR501 传感器的基本信息及接线方法 HC-SR501 是一款基于热释电效应的人体热释运动传感器&#xff0c;能检测到人体或…

HC-SR501人体红外感应模块程序

当感应到时&#xff0c;输出一个高电平。这里我对io口进行了配置&#xff0c;要不然读不到高电平。建议大家以后养成习惯&#xff0c;对io口进行配置&#xff0c;stm32中会用到。 在这里我额外提下&#xff0c;一般在stm32中 浮空输入 芯片内部没有接上下拉电阻。由于其输入阻…

单片机之人体感应传感器原理与实现

人体红外传感器&#xff0c;是一种新型传感器&#xff0c;能够有效的检测出周围环境的状态。 第一&#xff1a;人体红外模块工作原理 人体都有恒定的体温&#xff0c;一般在37度&#xff0c;所以会发出特定波长10UM左右的红外线&#xff0c;被动式红外探头就是靠探测人体发射的…

【电路】自用人体感应灯(HC-SR501人体感应模块)

文章目录 低成本人体感应灯需求分析器件清单参数测量HC-SR501人体感应模块LED灯板 方案设计思路简介原理图PCB设计 成品 低成本人体感应灯 需求分析 老旧小区地下室没有灯&#xff0c;找钥匙不方便&#xff0c;地理环境因素使用声音传感灯易发生误触。 需要满足的需求&#x…

HC-SR501 人体红外感应模块

资料下载&#xff1a;http://pan.baidu.com/s/1bnkxeoR 完美版HC-SR501是基于红外线技术的自动控制模块&#xff0c;采用德国原装进口LHI778探头设计&#xff0c;灵敏度高&#xff0c;可靠性强&#xff0c;超低电压工作模式&#xff0c;广泛应用于各类自动感应电器设备&#x…

Arduino与人体感应模块

工具&#xff1a; 1.Arduino 开发板* 1 2.人体感应模块传感器 * 1 这个人体感应传感器有三个引脚&#xff0c;分别是VCC&#xff0c;OUT&#xff0c;GND&#xff0c;同之前的红外线传感器一样输出的是数字信号&#xff0c;所以要将OUT接入digital pwm引脚&#xff0c;这里我接…

SR505人体感应模块

实物外观 正&#xff1a; 反&#xff1a; 功能介绍 基于红外线的一个传感器&#xff0c;检测到人体的移动会输出高电平信号&#xff0c;持续8s左右&#xff0c;若人在其感应范围内长时间保持不动&#xff08;或者不在其感应范围内&#xff09;会输出低电平信号。 使用 该…

STM32与人体红外感应模块的简单使用——入门级

工作原理 人体有恒定的温度&#xff0c;可以发出10UM的红外波&#xff0c;而人体红外感应模块就可以探测出这些红外波&#xff0c;从而产生电平转换。由此人们可以使用人体红外检测模块来检测是否有人。 模块工作环境 工作电压&#xff1a;5V至20V电平输出&#xff1a;高3.3…

【传感器模块】 HC-SR501 人体红外感应模块 热释电 红外传感器

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

红外人体感应传感器SR602模块使用说明

​一&#xff0e;HC-SR602模块 红外人体感应传感器HC-SR602是基于红外线技术的自动控制模块&#xff0c;专用于感应周围人体的存在。该模块相较于HC-SR501&#xff0c;灵敏度较高&#xff0c;抗干扰能力大&#xff0c;且简单易用。 二.HC-SR602模块主要参数 工作电压&#xff1…

【单片机基础篇】 人体红外感应传感器模块

概述 红外热释电传感器是一款基于热释电效应的人体热释运动传感器&#xff0c;能检测到人体或动物身上发出的红外线&#xff0c;配合菲涅尔透镜能使传感器探测范围更远更广。可在控制器上编程应用&#xff0c;通过3P传感器连接线插接到专用传感器扩展板上使用&#xff0c;可以轻…

【单片机】人体感应模块

文章目录 前言模块介绍&#xff08;可跳过&#xff09;模块使用代码&#xff1a;h文件代码&#xff1a;c文件代码使用方法补充介绍&#xff08;可/不可重复触发&#xff09; 代码获取 前言 大家好&#xff0c;我是林白柏&#xff1b; 希望你看完之后&#xff0c;能有所收获&a…

人体红外传感模块原理分析

数字热释电传感器是将传统热释电传感器的敏感元与信号处理芯片集成化设计&#xff0c;将敏感元与 IC 芯片集成封装到传感器屏蔽罩内部&#xff0c;敏感元通过感应外界人体移动产生的红外信号&#xff0c;以差分输入的方式传送到高精度的数字智能处理芯片进行处理&#xff0c;信…

人体红外传感器HC-SR501

在学习STM32系列的芯片时&#xff0c;算是第一次和开发板打交道&#xff0c;所以很多时候不知道如何查看引脚和相关功能&#xff0c;虽然只是借助外设进行一些实验&#xff0c;但开始的时候还是感到很困难。 而且学习的过程中越来越感受到知识的积累是一个十分漫长的过程&…

HC-SR501人体感应模块介绍

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

c语言换行符不起作用,回车符与换行符问题——C语言

回车符(carriage return,’\r’)与换行符 (line feed,’\n’) 换行对应的ASCII码值是10,回车符对应的ASCII码值是13,需要注意的是用户按下回车键时,对于不同的字符输入函数,读取的字符不同,下面上代码 测试一: int main() {char ch; ch = getchar(); printf("%d\n&q…

JavaScript字符串换行符与空格符

今天遇到个逻辑 后端传过来一个对象数组 要将每一个下标下的匹配信息拼接成一个字符串 然后输出出来 但是 每个信息之间要换行 突然就蒙了 泥马 js字符串怎么换行来着&#xff1f; 后面总算是找到了 js换行是 \r 或者 \n 标签是 <br/>参考代码如下 let name 你好java\…

css 换行符,CSS秘密花园: 插入换行符

《CSS Secrets》是@Lea Verou最新著作,这本书讲解了有关于CSS中一些小秘密。是一本CSSer值得一读的一本书,经过一段时间的阅读,我、@南北和@彦子一起将在W3cplus发布一系列相关的读后感,与大家一起分享。 需要通过CSS插入换行符的情况,通常出现在list列表定义中,如下图所,…