最近设计了一个项目基于单片机的太阳能电池板自动追光的系统设计,与大家分享一下:
一、基本介绍
项目编号:mcuclub-fz-030
单片机类型:STC89C52
具体功能:
1、通过DS1302获取时间,规定在早上6点到下午18点期间,允许太阳能板进行追光,可按键修正时间
2、通过四个光敏电阻,配合2个舵机,使得太阳能板朝着光照最强的方向转动
3、通过雨水检测模块检测是否下雨,当下雨后,自动将太阳板树立,风速大于设置最大值,自动将太阳能板放平
4、通过电位器配合ADC0832模拟采集太阳能板的电压,如果在允许太阳能板进行追光时检测到电压低于3V,则说明太阳能板损坏,进行蜂鸣器报警
5、通过AT24C02保存异常信息,包括时间和损坏,可通过按键查看
6、通过LCD1602显示数据(正常界面显示时间,异常界面切换显示)
二、仿真图
三、原理图
软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图
四、系统框图
本设计以AT89C51单片机为核心控制器,加上其他的模块一起组成太阳能追光的整个系统,其中包含中控部分、输入部分和输出部分。中控部分采用了AT89C51单片机,其主要作用是获取输入的部分数据,经过内部处理,控制输出部分。输入由七部分组成,第一部分是电量检测模块,将检测的电量通过模数转将电量传输到单片机;第二部分是风速检测模块检测当前环境的风速;第三部分是光照强度检测模块检测当前的光照强度;第四部分是雨量检测模块,检测当前是否下雨;第五部分是时钟模块获取当前的时间;第六部分是按键模块,通过按键模块设置阈值等;第七部分是供电模块,通过该模块可给整个系统进行供电。输出通过四部分组成;第一部分是显示模块,显示当前检测的参数;第二部分是报警模块,检测到太阳能板损坏,进行蜂鸣器报警;第三部分是存储模块,将当前的信息,时间和太阳能板损坏信息经常存储;第四部分是舵机,通过舵机控制太阳能板的旋转。
五、软件设计流程
六、部分程序展示
软件版本:keil5
逻辑程序和驱动程序分开,分布于main.c和其他.c文件
*******处理函数
*****/
void Manage_function(void)
{
if(YS==0)
{
flag_mode=1;
servo_pwm=0;
}
else if(W_Sp>50)
flag_mode=1,servo_pwm=199;
else if(time_buf[4]>0x18 || time_buf[4]<0x06)
flag_mode=1;
else
flag_mode = 0,servo_pwm=11;
// else
// flag_mode = 1;if(flag_mode == 0) //自动模式下
{
// if(time_buf[4]>18 || time_buf[4]<6)
// flag_mode =1;
//
// else
// servo_pwm=11;
//
// else
// servo_pwm=11;
if(light_1 > (light_3+10)) //上的光照强度大于下的光照强度
{
if(servo_pwm_2 > 4) //控制上下转动的舵机向上转
servo_pwm_2-=1;
}
else if(light_3 > (light_1+10)) //下的光照强度大于上的光照强度
{
if(servo_pwm_2 < 18) //控制上下转动的舵机向下转
servo_pwm_2+=1;
}
if(light_2 > (light_4+10)) //左的光照强度大于右的光照强度
{
if(servo_pwm > 4) //控制左右转动的舵机向左转
servo_pwm-=1;
}
else if(light_4 > (light_2+10)) //右的光照强度大于左的光照强度
{
if(servo_pwm < 18) //控制左右转动的舵机向右转
servo_pwm+=1;
}
if(servo_pwm <= 4)
{
servo_pwm = 18;
servo_pwm_2 = 11;
Delay_function(2000);
}
}
if(bat_value<3)
{
if(time_num % 5 == 0)
{
Beep=~Beep;
if(CH_F==0)
{
At24c02_Write(8*CH_num,time_buf,8);
// At24c02_Write(3*CH_num+1,time_buf[5]);
// At24c02_Write(3*CH_num+2,time_buf[6]);
CH_num++;
}
CH_F=1;
}
}
else
Beep=1,CH_F=0;
}