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

发布于:2025-08-30 ⋅ 阅读:(25) ⋅ 点赞:(0)

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

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

五、实验现象

演示视频:


网站公告

今日签到

点亮在社区的每一天
去签到