jjzjj

6、基于51单片机智能台灯坐姿定时+光线+红外感应系统设计(程序+原理图+参考论文+开题报告+任务书等)

ENGLISH_HHZ 2023-09-01 原文

摘要

社会在不断进步,人类在不断追求,市场在不断变化,高科技应用含量决定着产品发展的新趋势和前景,智能化技术在电子产品领域的应用意义深远。随着电子产品的快速发展,家用电器也越来越偏向智能化,已经应用于实际中的有智能洗衣机,智能电饭锅,智能电磁炉等,而所用的智能化家用电器都用一个共同的特点,都是利用单片机作为中央控制单元。

随着电子技术的日益发展,人们生活中的照明工具也在发生着巨大的变化。从普通电灯,白炽灯,到目前比较流行的LED灯,无不反映了人类科技的发展、社会的进步。随着环境问题的恶化,能源的减少,节能绿色环保的台灯,逐步走进了人们的生活。以前的台灯用途单一,而现在的人们需要一种多功能智能化的台灯。因此利用所学知识设计一种多功能绿色环保的台灯是一种很好的方向。

本文介绍了一种基于PWM调光的智能台灯设计。把单片机技术和PWM调光技术结合起来实现台灯光强的调节。即在不改变PWM方波周期的前提下,利用单片机控制PWM的占空比,从而来改变电压的大小实现灯光亮度的调节。

当人体在台灯的范围内且环境光线较弱时,自动感应开灯,且灯的亮度随着环境光线的改变而自动调节,一旦人离开台灯范围,即红外热释传感器检测不到有人时,1分钟后自动熄灯。本设计通过亮度的自动调节和人体检测控制台灯开关来达到绿色节能的效果。同时为了提高本设计的适用范围,还加入了手动模式的控制,在该模式下,台灯亮度由按键调节,这样使得该台灯在一些特殊情况下也能适用。

关键词:单片机;台灯 ;PWM;人体感应

一、硬件方案

硬件组成:本系统采用51单片机+液晶LCD1602显示屏+人体感应传感器+红外检测传感器+DS1302时钟+LED台灯+按键+光敏电阻设计而成。

二、设计功能

1、本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用)

2、有自动模式和手动模式两种(通过按键切换);

3、无论是自动模式还是手动模式,亮度都分为有档数;

4、手动模式下, 通过减按键和加按键来调节台灯亮度;

5、可以通过DS1302时钟来调节时间的定时

6、自动模式下,通过人体感应传感器先检测是否有人存在,有的话, 台灯亮度随着环境亮度改变而改变,环境越暗,台灯越亮;如果连续1分钟检测不到有人,就直接熄灭台灯,达到绿色节能的作用。

7、还可以红外传感器检测人的坐姿是否坐到位,如果太靠近设定的值,蜂鸣器则会报警提示。

三、成品实物图

四、原理图

 五、程序源码

 部分代码:

/*********************************************************/
// 手动控制
/*********************************************************/
void ManualControl()
{
	// 亮度减少
	if(Key2==0)					// 如果按键2被按下去
	{
		if(gIndex>0)			// 只要当前亮度不为最低才能减少亮度
		{
			gIndex--;				// 亮度降低一档
			DelayMs(300);		// 延时0.3秒
		}
	}
	
	// 亮度增加
	if(Key3==0)					// 如果按键3被按下去
	{
		if(gIndex<9)			// 只要当前亮度不为最高才能增加亮度
		{
			gIndex++;				// 亮度增加一档
			DelayMs(300);		// 延时0.3秒
		}
	}
}



/*********************************************************/
// 自动控制
/*********************************************************/
void AutoControl(uchar num)
{
	if(num<59)														// 最亮
		gIndex=9;
	else if((num>65)&&(num<81))						// 第二亮
		gIndex=8;
	else if((num>87)&&(num<103))					// 第三亮
		gIndex=7;
	else if((num>109)&&(num<125))
		gIndex=6;
	else if((num>131)&&(num<147))
		gIndex=5;
	else if((num>153)&&(num<169))
		gIndex=4;
	else if((num>175)&&(num<191))
		gIndex=3;
	else if((num>197)&&(num<213))
		gIndex=2;
	else if((num>219)&&(num<235))
		gIndex=1;
	else if(num>241)										 // 最暗
		gIndex=0;
}


uchar BUF[20];
/*********************************************************/
// 主函数
/*********************************************************/
void main()
{
	uchar ret;
	static unsigned short Cnt = 500;
	TimerInit(); 					// 定时器初始化
	
	LED=0;								// 指示灯点亮(自动模式指示灯)
	ret=Get_ADC0832();		// 获取AD采集结果(环境光照强度)
	AutoControl(ret);			// 上电先进行一次自动亮度控制	
	AutoControl(ret+7);
	L1602_init();
	L1602_string(1,1,"               ");
	L1602_string(2,1,"               ");
	
	
	while(1)
	{
		
		//if(++Cnt >= 10)
		{
			Cnt = 0;
			
			sprintf(BUF,"Light:  % 3d Lx",(unsigned short)(ret)*100/255);
			
			L1602_string(1,1,BUF);
			
			
			if(LED)
			{
				sprintf(BUF,"SD    lever:% 1d    ",(unsigned short)gIndex);
			
					
			}
			else
			{
				sprintf(BUF,"ZD    lever:% 1d    ",(unsigned short)gIndex);
				
			}
			
			L1602_string(2,1,BUF);	
		}
		/* 模式切换控制 */
		if(Key1==0)					// 如果按键1被按下去
		{
			LED=~LED;					// 切换LED灯状态
			
			if(LED)
			{
				sprintf(BUF,"SD    lever:% 1d    ",(unsigned short)gIndex);
			
					
			}
			else
			{
				sprintf(BUF,"ZD    lever:% 1d    ",(unsigned short)gIndex);
				
			}
			
			L1602_string(2,1,BUF);			
			DelayMs(10);			// 延时消除按键按下的抖动
			while(!Key1);			// 等待按键释放
			DelayMs(10);			// 延时消除按键松开的抖动
			
		}
			
		/* 亮度控制 */
		if(LED==1)							// 如果LED是灭的
		{
			ManualControl();			// 则进行手动控制
		}
		else										// 如果LED是亮的
		{
			if(gTime<60000)
			{
				ret=Get_ADC0832();		// 获取AD采集结果(环境光照强度)
				AutoControl(ret);			// 进行自动控制	
				DelayMs(200);
			}
		}
		
		/*检测是否有人*/
		if(Module==1)
		{
			gTime=0;										// 检测到有人,则把60秒计时清零
		}
		if(gTime>60000)								// 如果gTime的值超过了60000
		{
			gTime=60000;								// 则把gTime的值重新赋值为60000,避免过大溢出
			gIndex=0;										// 如果1分钟检测不到有人,则把台灯熄灭
		}
		
		if(!key_beep)
		{
			DelayMs(10);
			if(!key_beep)
			{
				Flag_beep = 1;
			}
		}
		else
		{
			Flag_beep = 0;
		}
	}
}
uchar Cnt_beep = 0;

资料包括:

需要完整的资料可以加入我的纷传圈子。

纷传 点击用微信打开即可,过程有点繁琐请见谅。

有关6、基于51单片机智能台灯坐姿定时+光线+红外感应系统设计(程序+原理图+参考论文+开题报告+任务书等)的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  5. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  8. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  9. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  10. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

随机推荐