汪老师分享 -基于51单片机控制的太阳能光伏双轴自动追光系统设计

本文详细介绍了基于51单片机的太阳能光伏双轴自动追光系统的设计,涉及硬件设计中的单片机、光电转换、步进电机、时钟和按键模块,以及软件设计中的整体流程和控制部分,旨在帮助学生顺利完成毕业设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


🔥 毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是:基于51单片机控制的太阳能光伏双轴自动追光系统设计

1 系统的硬件设计

1.1 51单片机模块

单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路。

图1-1 单片机最小系统

1.2 光电转换、步进电机模块

电路板上安装有4个不同方位的光敏电阻,光敏电阻的电阻值在强度不相同的环境太阳光照射下会不断发生相应的变化,电压同样也会随着光敏电阻值的变化而产生变化。光敏电阻值越大,光敏电阻的外电压越大。通过pcf8591模数转换芯片将模拟信号转换成数字信号。然后单片机通过不同的电压值来判断光敏电阻接收到的不同光照强度,从而控制步进电机转到一个合适的位置。

ULN2803是一个8输入8输出的驱动芯片,这里用的是五线四相步进电机,其实质是单片机控制IO口循环驱动。

U4RL210KAINOVDDAtNIAOUTAFN2VREFATN3AGNDRLOIOK

1-2 光电转换模块电路图

P27I

N[NNNNNN[N

rlTlT1T1rlT1T1T1rTrrrTrTrrrTrrrru-uuuuuuuooooooooGNDVCC—ULN2803GNDVCC卜1817|16|~isr14

疙盈机P35432步进电机

1-3 步进电机模块电路图

1.3 时钟、按键模块

时钟芯片的1脚、4脚是分别是VCC、GND为时钟供电,2、3脚接一个晶振,为时钟提供一个基准频率。SCLK(时钟)、IO(IO数据)、RST(使能复位)三个管脚与单片机进行通信外接一个4.7K的上拉电阻来提高通信的稳定性,还有1个VCC接备用电池,持续为时钟供电,使时钟不同停止。

按键其中一端接的是地,而另一端接的是单片机IO口,又因为单片机IO口默认是高电平,所以当按键被按下的时刻,其实相当于IO口与地进行相连接,IO口电平被强制拉低了,当按键松开时,IO口又变成低电平,所以说只要检测哪个按键接的IO口是低电平,就可以知道明确的哪一个按键是被按下的。

图1-4 时钟模块电路图

图1-5 按键模块电路图

1.4 液晶显示模块

有十六个管脚,其中有8个管脚是数据传输管脚,专门负责与单片机进行数据交互(D0-D7)的工作,还有三个管脚是模块数据命令使能端,也就是控制管脚,它们分别接单片机的P0、P11、P2管脚,有两组VCC、GND,1组是为液晶的背景进行供电,另一组是为液晶整个模块进行供电。VO管脚是对比度调节管脚,经过一个3K电阻进行接地来达到一个比较好的显示状态。LCD1602液晶显示模块

图1-2 液晶显示模块电路图

2 系统的软件设计

2.1系统整体软件设计

本系统设计整体软件程序流程图如下图所示:

图2-1 整体软件流程图

主程序如下: void main(void)

{

TMOD=0x01;//定时器初始化配置

TH0=0xf6;//定时器0赋初值

TL0=0x3b;

EA=1;//打开总中断

//打开定时器0中断//打开定时器0//AD部分初始化cls();//液晶屏初始化ET0=1;

TR0=1;

init();

LCD1602

Init_time_ds1302(16,12,14,16,5,30,3,12);//DS1302 默认时间模式化 16

年12月14日X时X分X秒星期X最后是校准值

Read_alltime_ds1302(Time); //读取 DS1302 中的所有时间数据

Read_dat_ds1302(Time+7,0xC3,4);//读取 DS1302 中的启动停止时间数据

while(1) {

if(state==0)Read_time_ds1302(Time);//如果是系统处于非设置状态则去读取当前时间数据 ShowCode();//液晶显示函数调用

ButtonCode();//按键控制函数调用

〃上光敏电阻读值〃下光敏电阻读值〃左光敏电阻读值〃右光敏电阻读值AD_Down=read_add(0x00); AD_Up=read_add(0x01);

AD_Right=read_add(0x02);

AD_Left=read_add(0x03);

AD_Down==0 | |AD_Up==255| | AD_Up==0 | ||| AD_Left==255 || AD_Left==0)if(AD_Down==255 || AD_Right==255 || AD_Right==0

{

//判断传感器是否错误SYS_ERROR=1;

}else

{

SYS_ERROR=0;

}

//调用自动控制函数ProcCode();

}

}

自动模式流程图:

自动模式下,单片机通过采光板上的四个光敏电阻,来检测采光板上下左右四个方向的光强度值,然后控制步进电机工作,使采光板正面移动到与光强度值最大的一方垂直。

控制部分程序如下:

voidinit_1()interrupt1//定时器0中断服务程序每2.5ms中断一次

{

TH0=0xf6;

TL0=0x3b;//重新赋初值

if(Up_CB)//步进电机转动控制程序部分〃上转转动标志位触发

{

P2=P2&0xf0 |FirstSet_FWD [loop];〃上转动控制

}elseif(Down_CB)〃下转转动标志位触发

{ P2=P2&0xf0|FirstSet_REV[loop];〃下转动控制

}else {

P2=P2&0xf0;〃停止转动

if(Left_CB)//左转转动标志位触发

{

P2=P2&0x0f |Secondset_FWD[loop];//左转动控制

}elseif(Right_CB)//右转转动标志位触发

{

P2=P2&0x0f |Secondset_REV[loop];//右转动控制

}else

{

P2=P2&0x0f;〃停止转动

}

loop=(loop+1)%8;//循环变量自加

if(SYS_ERROR==1)〃如果传感器错误

{

blink_ms++;

if(blink_ms>39)//如果传感器连续错误超过100ms系统错误错误指示

{

blink_ms=0;

led_1=!led_1;

led_2=led_1;

}

}

ms++;

if(ms>200)〃以1S的速度显示各个光敏电阻的数据

{

ms=0;

s1=!s1;//设置时间时以1S的闪烁数据做设置项提示

ShowDat1=AD_Up;//显示数据赋值

ShowDat2=AD_Down;

ShowDat3=AD_Left;

ShowDat4=AD_Right;

}

51单片机上通过ULN2803芯片驱动步进电机,首先需要了解ULN2803是一个8通道集成了74HC125移位寄存器和双向驱动器的集成电路。以下是基本的步骤和伪代码示例: ```c #include <reg52.h> // 包含51单片机头文件 // ULN2803驱动器配置 #define ULN2803_DDR DDRF // ULN2803的数据方向控制口 #define ULN2803_PORT PORTF // ULN2803的输出口 #define ULN2803_DIR DIRF // ULN2803的输出方向控制口 // 步进电机常量定义 #define STEP_PIN P1 // 使用P1口作为步进电机的信号线 #define ENABLE_PIN P2 // 如果有使能信号,可以连接到这个端口 void step_direction(int direction) { if (direction == 1) { // 正向 ULN2803_DDR &= ~_BV(0); // 高电平使能A相 ULN2803_DDR |= _BV(1); // 低电平使能B相 } else { // 反向 ULN2803_DDR &= ~(_BV(0)|_BV(1)); // 清除A、B相使能 } ULN2803_DIR = ULN2803_DDR; // 设置方向 } void motor_step(int steps, int delay_ms) { for (int i = 0; i < steps; i++) { STEP_PIN = 1; // 正转一步 __delay_ms(delay_ms); STEP_PIN = 0; // 逆转一步 __delay_ms(delay_ms); } } void enable_motor(int enable) { if (enable) { ENABLE_PIN = 1; // 打开电机电源 } else { ENABLE_PIN = 0; // 关闭电机电源 } } void main(void) { // 初始化电机和其他硬件 enable_motor(1); while(1) { // 指定步进方向 step_direction(1); // 示例正转 motor_step(1000, 10); // 进行1000步,每步间隔10ms // 更改方向或其他操作... } } ``` 注意,实际应用中需要将上述代码调整以适应具体的51单片机型号和引脚分配,并且可能需要根据你的步进电机的具体规格(如脉冲频率)调整`delay_ms`值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值