目录
一.元件清单
二.实现效果
三.主要内容
四.代码
五.总结
一.元件清单
AT89C51单片机、ADC0809、5V有源蜂鸣器、USB电源线DC电源插头、万用板、
红外接近传感器、红外遥控器、红外接收头、人体感应模块HC-SR501、三极管、LED等。
二.实现效果
(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; //取码完成后判断读码是否正确
}
//准备读下一码
}
}
五.总结
随着人们对智能化的需求越来越高,电器的综合性越来越强,本项目设计的台灯兼容了多种功能,有效的满足了不同场景下的多种需求。可实现基本的通过按键控制,调节台灯亮度。台灯能够根据周围环境亮度自动调节自身亮度,一定程度上避免了能源浪费,使简易台灯最大程度上智能化。同时台灯具有人体感应功能,可通过感应人体控制灯的开关。为满足更多条件下的需求,项目添加了红外遥控器,可直接通过遥控器控制灯的模式及亮度,极大的方便了使用者。此外,台灯加入了坐姿矫正功能,可通过检测人与台灯的距离,提醒使用者坐姿规范。项目实现了生活基本所需的多种功能,具有极大的集成性,满足多种条件下的需要。