一.硬件方案
本设计主要由51单片机+最小系统+LCD1602液晶显示模块+GY-30亮度传感器模块+ESP-M1 wifi模块+LED照明灯电路++DS1302时钟电路+按键模块;如图:
二.设计功能
(1)本设计主要涉及了环境光强度的测量、显示,对LED亮度的PWM控制以及通过WIFI实现APP软件开关控制。
(2)本设计带有日期及时间的显示,可通过按键调整当前的时间及日期,带有纽扣电池,掉电后重新上电不需要重新调整时间;
(3)主要分为自动和手动两种控制模式,自动模式下可根据对比当前的环境亮度与设定的亮度值,通过PWM来调整当前的LED灯光强;
(4)本设计共有5个按键,独立的按键为复位按键;并排的四个按键,一为手动/自动模式切换键,二为设置键,三为加一键(手动模式下为LED亮度增大键),四为减一键(手动模式下为LED亮度减小键);
(5)本系统可以通过wifi,实现app软件远程查看当前系统的状态及控制系统的工作;
三.设计原理图
原理图主要采用AD软件进行设计,如图:
四.软件设计
主程序源码
void main()
{
u8 t = 0; //用于判断秒数
u8 cnt = 0; //计数秒的闪烁
u16 send_cnt = 0; //串口打印间隔
u16 def = 0;
u8 pwm;
delay_ms(500);
lcd_init(); //LCD1602初始化
Initial_DS1302();
display_init(); //显示初始化
UartInit();
time_init(); //初始化定时器
my_set_time(&initail_time);
DS1302_GetTime(¤t_time);
LED=1;
while(1)
{
key_scan(); //按键扫描 时间设置
delay_ms(10);
if(set==0) //不是时间设置模式,显示时间
{
if(t!=current_time.Second)
{
t = current_time.Second;
cnt++;
GetBH1750();
}
DS1302_GetTime(¤t_time);
setting_time.Year = current_time.Year; //显示当前年份
setting_time.Month = current_time.Month; //显示当前月份
setting_time.Day = current_time.Day; //显示当前日期
setting_time.Hour = current_time.Hour; //显示当前小时
setting_time.Minute = current_time.Minute; //显示当前分钟
setting_time.Second = current_time.Second; //显示当前秒钟
if(set==0)
Time_display(); //时间刷新
}
if(handMode==1) //是否为自动模式
{
if(setLight>curLight)
{
def= setLight/8;
duty=(setLight-curLight)/def;
if((setLight-curLight)%def>0)
duty=duty+1;
}
else
duty=0;
}
if(t_2ms>=800)
{
t_2ms=0;
if(light_refresh==1) //APP刷新当前数据
{
GetBH1750();
Send_string("The current light intensity is: "); //APP刷新当前设置光强度
Send_string(light);
Send_string(" xL\r\n");
Send_string("The Setting light is: ");
Send_Data(settingLight[0]+0x30);
Send_Data(settingLight[1]+0x30);
Send_Data(settingLight[2]+0x30);
Send_Data(settingLight[3]+0x30);
Send_Data(settingLight[4]+0x30);
Send_string(" xL\r\n");
Send_string("PWM Duty is: "); //APP刷新当前PWM占空比
pwm=((u8)duty*12.5);
Send_Data(pwm/100+0x30);
Send_Data(pwm%100/10+0x30);
Send_Data(pwm%10+0x30);
Send_string("%\r\n");
Send_string("Control Mode is: ");
if(handMode==0)
Send_string("Manual Mode\r\n");
else
Send_string("AUTO Mode\r\n");
Send_string("%\r\n");
}
}
//串口接收信息
if(revFlag == 1)
{
switch(Rx_Data)
{
case 'A': //APP自动刷新状态使能
light_refresh^=1;
if(light_refresh==0)
Send_string("Stop refresh!\r\n");
break;
case 'B': //手/自动模式切换
{
handMode ^=1;
if(handMode==0)
Send_string("Manual Mode\r\n");
else
Send_string("AUTO Mode\r\n");
}
break;
case 'C': //提高当前LED光强度
{
if(handMode==0)
{
duty++;
if(duty>=8)
duty=8;
Send_string("PWM Duty is: ");
pwm=((u8)duty*12.5);
Send_Data(pwm/100+0x30);
Send_Data(pwm%100/10+0x30);
Send_Data(pwm%10+0x30);
Send_string("%\r\n");
}
else
Send_string("Please operate in manual mode!!\r\n");
}
break;
case 'D': //降低当前LED光强度
if(handMode==0)
{
if(duty<=0)
duty=0;
else
duty--;
Send_string("PWM Duty is: ");
pwm=((u8)duty*12.5);
Send_Data(pwm/100+0x30);
Send_Data(pwm%100/10+0x30);
Send_Data(pwm%10+0x30);
Send_string("%\r\n");
}
else
Send_string("Please operate in manual mode!!\r\n");
break;
case 'E': //获取设置值
{
// auto_Flag ^= 1;
// if(auto_Flag == 1)
// {
// Uart_SendString("Now is AutoMode!\r\n");
// write_1602com(0xc0);
// write_1602dat('A');
// }
// else
// {
// Uart_SendString("Now is TimeMode!\r\n");
// write_1602com(0xc0);
// write_1602dat('T');
// }
}
break;
default:
revFlag = 0;
break;
}
revFlag = 0;
}
//
}
}