目录
一、主要功能
1、数码管液晶显示定时时间
2、自动模式和手动模式
分为自动和手动两种模式:
3、在自动模式下,台灯能根据周围环境光线的明暗与
是否检测到周围有人来判断是否开启台灯。
能够根据周围环境的光暗自动调节自身亮度,以达到最佳照明效果。
当人体太靠近台灯时,台灯感应并发出警告,提醒人们纠正坐姿,防止近视。
当人离开时则自动感应关灯。
可以自己设定时间,当工作学习的时间到了设定的时长后,
台灯发出提醒,提醒设定时间到了,适当休息一下。
4、在手动模式下,手动调节亮度。
5、设置学习时间,按下设置键后可通过加减键调节分和秒。
二、使用步骤
基于51单片机的智能视力保护台灯系统结合了多种传感器和智能控制技术。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、光敏传感器模块、人体红外传感器、红外对管模块
4、蜂鸣器模块
5、照明灯模块
6、数码管显示模块
四、软件设计
//宏定义
#define uint unsigned int
#define uchar unsigned char
#define DUAN P0
//头函数
#include <reg52.h>
#include <ADC0809.h>
unsigned char code tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff}; //数字0-9的编码//gc.debfa
unsigned char code tab_dian[]={0x80,0x9b,0x42,0x0a,0x19,0x0c,0x04,0x9a,0x00,0x08,0xdf}; //带点的数字0-9的编码//gc.debfa
uchar tt[51]; //定义空数组用于AD0809取平均值
uchar scale=20,rsd_sec; //定义占空比比例,热释电计时秒变量
char min,sec; //定义计时分秒
bit bdata flag_auto,ss,flag_bs,flag_rsd,flag_jiejin=1; //位定义自动切换的,闪烁标志,报警位标志,热释电动作标志,接近传感器标志
uchar flag_set=0; //设置变量:0 正常 1 调分 2 调秒
uint lum; //ad0809读出值
//函数声明
void delay(uchar i);
//管脚声明
sbit LED = P3^4; //灯光控制输出
sbit change= P2^3; //自动模式切换按键
sbit set = P2^2; //设置按键
sbit add = P2^1; //加按键
sbit sub = P2^0; //减按键
sbit rsd = P3^6; //热释电
sbit jiejin=P3^5; //接近开关
sbit buzz=P3^7;
sbit W0=P2^7;
sbit W1=P2^6;
sbit W2=P2^5;
sbit W3=P2^4; //数码管位端
/***********显示函数*************/
void display()
{
if(flag_set==0) //正常模式下
{
DUAN=tab[min/10]; //送入段码
W0=0; //打开位地址
delay(1); //小延时
W0=1; //关闭位地址
DUAN=tab_dian[min%10]; //下同
W1=0;
delay(1);
W1=1;
DUAN=tab[sec/10];
W2=0;
delay(1);
W2=1;
DUAN=tab[sec%10];
W3=0;
delay(1);
W3=1;
}
else if(flag_set==1) //设置模式下闪烁相应位
{
if(ss==1) //闪烁标志 ss=1 正常显示
{
DUAN=tab[min/10];
W0=0;
delay(1);
W0=1;
DUAN=tab_dian[min%10];
W1=0;
delay(1);
W1=1;
}
else //闪烁标志 ss=0 熄灭相应位 达到闪烁效果 ss在定时器里500ms取反一次
{
DUAN=tab[10];
W0=0;
delay(1);
W0=1;
DUAN=tab_dian[10];
W1=0;
delay(1);
W1=1;
}
DUAN=tab[sec/10];
W2=0;
delay(1);
W2=1;
DUAN=tab[sec%10];
W3=0;
delay(1);
W3=1;
}
else
{
DUAN=tab[min/10];
W0=0;
delay(1);
W0=1;
DUAN=tab_dian[min%10];
W1=0;
delay(1);
W1=1;
if(ss==1)
{
DUAN=tab[sec/10];
W2=0;
delay(1);
W2=1;
DUAN=tab[sec%10];
W3=0;
delay(1);
W3=1;
}
else
{
DUAN=tab[10];
W2=0;
delay(1);
W2=1;
DUAN=tab[10];
W3=0;
delay(1);
W3=1;
}
}
}
void main()
{
init(); //调用初始化函数
flag_auto=1; //初始化手动模式
delay(500); //延时500ms后开机
rsd=0;
while(1) //循环
{
KEY(); //调用按键函数
display(); //调用显示函数
}
}
五、实验现象
演示视频: