51单片机控制的自动感应调光、坐姿矫正智能台灯

2023-11-06

目录

一.元件清单

二.实现效果

三.主要内容

四.代码

五.总结


一.元件清单

AT89C51单片机、ADC0809、5V有源蜂鸣器、USB电源线DC电源插头、万用板、

红外接近传感器、红外遥控器、红外接收头、人体感应模块HC-SR501、三极管、LED等。

红外接近传感器
人体感应模块HC-SR501
5v有源蜂鸣器
红外接收头
​​​​
红外遥控器

  

二.实现效果

(1)手动调节台灯亮度;

(2)根据环境亮度调节亮度;

(3)人体感应调节台灯亮度;

(4)距离过近提醒坐姿不正;

(5)通过遥控进行模式选择以及控制灯的亮度;

 

三.主要内容

1.流程图:

 2.主要内容

(1)  手动调节台灯亮度

按键控制电路采用独立式接法,利用单片机I/O口读取口的电平高低来判断是否有键按下。将常开按键的一端接地,另一端接一个I/O 口,程序开始时将此I/O口置于高电平,平时无键按下时I/O口保护高电平。当有键按下时,此I/O 口与地短路迫使I/O 口为低电平。按键释放后,单片机内部的上拉电阻使I/O口仍然保持高电平。

(2)  根据环境亮度调节亮度

对于台灯亮度的感应采用了光敏电阻,光敏传感器用于检测环境明暗程度,并能对环境变化迅速反应;利用光敏电阻的阻值随着亮度的改变而改变,电阻值的改变会改变光敏电阻上的电压值。这时,通过AD转换器采集电压,转换成相应的光强数据传输给单片机由此来控制台灯亮度。

(3) 人体感应调节台灯亮度

人体感应电路采用了HC-SR501基于红外线技术的数字传感器。当传感器感应到人体时,传感器IO引脚输出高电平;当无人体时,传感器输出低电平。红外热释电传感器用于检测台灯周围是否有人员存在,当台灯所处环境较暗且周围有人时,台灯自动打开,并可根据环境明暗程度实时调节台灯亮度。

(4)  距离过近提醒坐姿不正

距离检测采用E18-D80NK数字型红外传感器,E18-D80NK是一种集发射与接收于一体的光电传感器,发射光经过调制后发出,接收头对反射光进行解调输出,有效的避免了可见光的干扰。正常状态是高电平输出检测到目标是低电平输出;此传感器的功能为检测用户坐于台灯前的距离,可通过调节传感器的检测范围设定人体距离台灯的距离,距离过近时蜂鸣器用于报警提醒,达到坐姿规范的目的

(5)  通过遥控进行模式选择以及控制灯的亮度

按键模块用于工作模式的切换,以及系统工作相关参数的设置。红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波;红外接收电路由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射雕红外光转换为相应的电信号,再送后置放大器。

四.代码

//宏定义
#define uint unsigned int
#define uchar unsigned char

uint X1=0;
uint X2;

//头函数
#include <reg52.h>
#include <ADC0809.h>


//时间计算
#define Imax 14000    //此处为晶振为11.0592时的取值, 
#define Imin 8000    //如用其它频率的晶振时,
#define Inum1 1450    //要改变相应的取值。
#define Inum2 700 
#define Inum3 3000 
//解码变量
unsigned char Im[4]={0x00,0x00,0x00,0x00};
uchar show[2]={0,0};

//全局变量
uchar f;
unsigned long m,Tc;
unsigned char IrOK;


//LED灯光强度
uchar LL=0;
uint  YK=0;

uint ZY=0,Xi=0,FZ=0;

uchar Mode=1;


//函数声明
void Init();
void delay(uchar i);


//管脚声明
sbit LED = P1^4;
sbit LEDR= P2^2;
sbit LEDG= P2^4;
sbit LEDY= P2^6;
sbit set = P1^5;
sbit add = P1^6;
sbit dec = P1^7;


//主函数
void main()
{
	//定时器初始化100HZ
	Init();
	 m=0;
	 f=0;
	//模式1
	LEDR=1;
	LEDY=1;
	LEDG=1;
	delay(3);
	LEDR=0;
	LEDY=1;
	LEDG=1;
	//循环
	while(1)
	{
		//读取亮度AD值
		LL=ADC0809();

		//
		//亮度控制
		//光敏控制
		if(Mode==2)
		{
			if(LL>50)
			{
				X1=0;
			}
			else
			{
				if(LL-1>0xf0)
					LL=1;
				X1=1020-LL*20;
			}
		}
		//遥控器ok
		else if(Mode==1)
		{
			X1=YK;
					ZY++;
				else
					ZY--;
			}
			if(ZY==400)
			{
				FZ=1;		
			}
			if(ZY==0)
			{
		{
			X1--;
		}	
		LED=1;
		X2=1000-X1;
		while(X2!=0)
		{
			X2--;
		}
		///
		if(set==0)
		{
			delay(20);
			if(set==0)
			{
				Mode++;
				if(Mode==1)
				{
					LEDR=1;
					LEDY=1;
					LEDG=1;
					delay(100);
					LEDR=0;
					LEDY=1;
					LEDG=1;
				}
				if(Mode==2)
				{
					LEDR=1;
					LEDY=1;
					LEDG=1;
					delay(100);
					LEDR=1;
					LEDY=1;
					LEDG=0;
				}
				if(Mode==3)
				{
					LEDR=1;
					LEDY=1;
					LEDG=1;
					delay(3);
					LEDR=1;
					LEDY=0;
					LEDG=1;
				}
				if(Mode==4)
				{
					Mode=1;
					LEDR=1;
					LEDY=1;
					LEDG=1;
					delay(100);
					LEDR=0;
					LEDY=1;
					LEDG=1;
				}
				while(set==0);	
			}
		}
		if(add==0)
		{
			delay(20);
			if(add==0)
			{
				YK=YK+100;
				if(YK>1000)
				{
					YK=0;
				}
				while(add==0);	
			}
		}
		if(dec==0)
		{
			delay(20);
			if(dec==0)
			{
				YK=YK-100;
				if(YK>1000)
				{
					YK=0;
				}
				while(dec==0);	
			}
		}
		if(IrOK==1) 
		{
			//1键
			if(Im[2]==0x0c)
			{
				LEDR=1;
		 		LEDY=1;
				LEDG=1;
				delay(100);
				LEDR=0;
				LEDY=1;
				LEDG=1;
				Mode=1;
			}
			//2键
			else if(Im[2]==0x18)
			{
				LEDR=1;
				LEDY=1;
				LEDG=1;
				delay(100);
				LEDR=1;
				LEDY=1;
				LEDG=0;
				Mode=2;
			}
			//3键
			else if(Im[2]==0x5e)
			{
				LEDR=1;
				LEDY=1;
				LEDG=1;
				delay(3);
				LEDR=1;
				LEDY=0;
				LEDG=1;
				Mode=3;
			}
			//+
			else if(Im[2]==0x40)
			{
				YK=YK+100;
				if(YK>1000)
				{
					YK=0;
				}
			}
			//-
			else if(Im[2]==0x19)
			{
				YK=YK-100;
				if(YK>1000)
				{
					YK=0;
				}
			}
		   IrOK=0;	  
		}
	}
}


//定时器初始化
void Init(void)
{

 EA=1;//开启总中断
 
 IT1=1;//下降沿有效
 EX1=1;//外部中断1开
 
 TMOD=0x11;//定时器初始化  
 TH0=0;//T0赋初值
 TL0=0;
 TR0=0;//t0开始计时
}
//延时
void delay(uchar i)
{
  uchar j,k; 
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}
//外部中断解码程序_外部中断0
void intersvr1(void) interrupt 2 using 1
{
 LED=1;
 TR0=1;
 Tc=TH0*256+TL0;//提取中断时间间隔时长
 TH0=0; 
 TL0=0;         //定时中断重新置零
 if((Tc>Imin)&&(Tc<Imax))
if(f==1)
 {
    if(Tc>Inum1&&Tc<Inum3) 
    {
   	Im[m/8]=Im[m/8]>>1|0x80; m++; 
    }
    if(Tc>Inum2&&Tc<Inum1) 
    {
      Im[m/8]=Im[m/8]>>1; m++; //取码
  	 }
  	 if(m==32) 
    {
      m=0;  
      f=0;
      if(Im[2]==~Im[3]) 
      {
           IrOK=1;
			  TR0=0; 
   	}
      else IrOK=0;   //取码完成后判断读码是否正确
    }
               //准备读下一码
 }
}

五.总结

        随着人们对智能化的需求越来越高,电器的综合性越来越强,本项目设计的台灯兼容了多种功能,有效的满足了不同场景下的多种需求。可实现基本的通过按键控制,调节台灯亮度。台灯能够根据周围环境亮度自动调节自身亮度,一定程度上避免了能源浪费,使简易台灯最大程度上智能化。同时台灯具有人体感应功能,可通过感应人体控制灯的开关。为满足更多条件下的需求,项目添加了红外遥控器,可直接通过遥控器控制灯的模式及亮度,极大的方便了使用者。此外,台灯加入了坐姿矫正功能,可通过检测人与台灯的距离,提醒使用者坐姿规范。项目实现了生活基本所需的多种功能,具有极大的集成性,满足多种条件下的需要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机控制的自动感应调光、坐姿矫正智能台灯 的相关文章

  • CaffeineCache基本使用 & SpringBoot集成缓存

    文章目录 一 常用API 1 get 2 getAll 3 refresh 二 缓存回收 清除 1 显式回收 2 隐式回收 2 1 基于容量 2 2 基于时间 2 3 基于引用 2 4 基于权重 三 刷新缓存 reload 四 监听器 五
  • 机房建设--服务器机柜尺寸参考

    自建或托管机房中常用的机柜规格为19英寸机柜 宽度 48 26cm 42U高度 1Unit 4 445cm 1 75英寸 选购需注意服务器机柜的进深通常为800mm 19英寸机柜尺度参考 称号 类型 规范尺度 mm 高 宽 深 备注 标准机
  • pktgen网络测试工具介绍

    pktgen是一款网络测试工具 可以用于压力测试 性能测试 负载均衡测试等方面 它使用Lua脚本来生成和发送数据包 并且支持多线程处理 pktgen可以在Linux系统上运行 支持多种协议和数据包类型 如TCP UDP ICMP ARP等
  • 砕月~イノチ~ - 小森きり

    From 我爱二次元 虾米电台 http www xiami com u 5627589 spm a1z1s 6626017 1561534497 3 3qsa0i Vocal 小森 Arranger 妄想放出所 haru 山野 原曲 砕月

随机推荐

  • 硬链接和软链接的区别和作用

    首先说说目录的本质和节点的概念 在linux系统下一切皆文件 目录它也是一个文件 只不过在它里面存储的是 一张表的文件 而节点就类似我们c语言中学过的数组的下标 我们可以把每个文件都看成是 数组中的元素 而知道了节点号 就可以找到实质的文件
  • office文档转pdf服务 本地或远程 OpenOffcie、LibreOffcie

    网上说 转的主流是 jacod和 aspose aspose是商用软件 跨平台 不需要第三方软件 jacod依赖 windows环境 在linux下需要安装openOffice 结果走了弯路 以为破解版的aspose好使 windows下好
  • 创业之初一般是怎么死的?写的非常好。。。。。

    转自 http xueyuan cyzone cn gushi ganwu 239865 html 我自己年轻的时候也创过业 条件很好 最后也失败了 后来做投资 看到的创业者就更多 最后发现自己有了丰富的创业失败经验 于是就比较适合写这篇创
  • Springcloud nacos install配置文件没有在target的classes里生成

    这是最近接手的一个springcloud的项目 在install编译的时候 target里面没有对应的nacos的配置文件 导致项目启动不起来 刚开始我也和大家一个都会搜索idea maven编译的时候install后target里面没有生
  • 数据结构——平衡树【2-3查找树、红黑树】

    查找树 查找树的定义 一棵标准的二叉查找树中的结点称为2 结点 含有一个键和两条链 而现在我们引入 3 结点 含有两个键和三条链 2 结点 含有一个键 及其对应的值 和两条链 左链接指向 2 3 树中的键都小于该结点 右链接指向的 2 3
  • ES 模糊查询 实现像Mysql like %%那样的模糊查询

    BoolQueryBuilder boolQueryBuilder QueryBuilders boolQuery WildcardQueryBuilder wildcardQueryBuilder QueryBuilders wildca
  • Javaweb基础-Servlet前后端交互

    eclipse创建好html文件和servlet之后得到如下页面 前端html 1 首先在html中引入Jquery 把下面的代码插入到head标签下 2 之后编写我们的前端html内容 在body标签内编写一下内容 用户名
  • http九大内置对象和四大作用域

    九大对象 application ServletContext 服务器启动后就产生了这个对象 所有客户共享这个内置的application 重中之中 request HttpServletRequest ServletResponse 封装
  • 寻找重复数

    lettCode 287 寻找重复数 给定一个包含 n 1 个整数的数组 nums 其数字都在 1 到 n 之间 包括 1 和 n 可知至少存在一个重复的整数 假设只有一个重复的整数 找出这个重复的数 示例 1 输入 1 3 4 2 2 输
  • Stata对cgss2017数据实证分析,希望有经验能帮忙的小伙伴多多指导。

    Stata是一款统计软件 用于数据分析和统计建模 如果您需要对cgss2017数据进行实证分析 可以使用Stata中的各种工具 如回归分析 t检验和统计图表等 在分析之前 需要先导入cgss2017数据到Stata中 然后就可以使用不同的命
  • addr2line输出问号怎么办

    前言 使用backtrace等工具将程序异常运行的堆栈打印出来 然后再结合使用addr2line将堆栈地址转为文件行 将对于定位故障非常有帮助 但有时使用addr2line却输出为 0 从addr2line的man手册中看确实没有分C和C
  • JDK8-lambda常用汇总

    来源 juejin im post 5ce66801e51d455d850d3a4a 一 引言 java8 最大的特性就是引入 Lambda 表达式 即函数式编程 可以将行为进行传递 总结就是 使用不可变值与函数 函数对不可变值进行处理 映
  • idea代码检测工具sonar和alibaba插件

    下面介绍两种代码检测插件的安装和使用 SonarLint和aibaba 使用起来主要有以下区别 Alibaba代码规范插件主要检测代码规范 SonarLint主要检测代码是否正确 存在的问题 安全漏洞等 安装方法 file settings
  • 【笔试题】素数天购买设备

    题目描述 题解 自己尝试解了一下 不知道对不对 import java util public class Main public static Map
  • Modulo Summation——UPC

    题目描述 You are given N positive integers a1 a2 aN For a non negative integer m let f m m mod a1 m mod a2 m mod aN Here X m
  • 使用QT环境Mingw64编译Boost库(GCC)

    1 首先得拿到QT creator Boost 下载链接 qt opensource windows x86 5 13 0 exe http download qt io archive qt 5 13 5 13 0 qt opensour
  • 【Zotero】学习笔记|只需简单几步为Zotero设置深色模式!

    具体可参考GitHub中教程 作者作为一个简单的汉化介绍 Rosmaninho Zotero Dark Theme Step1 转到用户配置文件文件夹 Windows users C Users User name AppData Roam
  • C++多态的方式:重写和重载

    引用 windows程序员面试指南 重写和重载 C 多态的实现方式包括重载和重写 重写 重写是动态的多态 通过C 的虚函数实现 重载 重载是静态的多态 在同一个作用域内 具有相同函数名 不同的形参个数或者形参类型实现重载 和返回值类型无关
  • Unity 初识Mesh绘制面(一)

    Unity中渲染出的3D物体组成内容 首先我们先在Unity3D中创建一个Cube 在Inspector可以看到其中含有MeshFilter MeshRenderer组件 由此可见如果你想要展示一个3D游戏物体 它必须拥有两个组件 Mesh
  • 51单片机控制的自动感应调光、坐姿矫正智能台灯

    目录 一 元件清单 二 实现效果 三 主要内容 四 代码 五 总结 一 元件清单 AT89C51单片机 ADC0809 5V有源蜂鸣器 USB电源线DC电源插头 万用板 红外接近传感器 红外遥控器 红外接收头 人体感应模块HC SR501