【51单片机】【protues仿真】 基于51单片机智能视力保护台灯系统

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

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(); //调用显示函数

}

}

五、实验现象

演示视频: