目录
摘要
社会在不断进步,人类在不断追求,市场在不断变化,高科技应用含量决定着产品发展的新趋势和前景,智能化技术在电子产品领域的应用意义深远。随着电子产品的快速发展,家用电器也越来越偏向智能化,已经应用于实际中的有智能洗衣机,智能电饭锅,智能电磁炉等,而所用的智能化家用电器都用一个共同的特点,都是利用单片机作为中央控制单元。
随着电子技术的日益发展,人们生活中的照明工具也在发生着巨大的变化。从普通电灯,白炽灯,到目前比较流行的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;
资料包括:
需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。