基于51单片机太阳能锂电池充电电压电流检测液晶显示设计
1、系统功能介绍
-
系统构成:
- 本设计由STC89C52单片机+LCD1602液晶显示电路+A/D转换芯片PCF8591电路+电压检测电路+电流检测电路ACS712-5A+继电器控制电路+电源电路设计而成。
-
系统功能:
- 1、通过太阳能电池板给锂电池充电,通过单片机检测太阳能给电池的充电电压和充电电流,并在1602液晶上显示出来!
- 2、通过继电器,有过压保护,当锂电池充电电压超过了4.5V或者充电电流超过1A,继电器断开,充电停止。
-
可根据本篇文章完成毕业设计的开题报告、任务书、设计等
2、资料下载
- 资料下载链接:https://download.csdn.net/download/qq_39020934/89810137
- 更多设计视频:https://space.bilibili.com/3537120073353692
3、系统电路介绍
3.1、STC89C52单片机核心系统电路设计
- STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
STC89C52主要特性如下:
- (1)8K字节程序存储空间;
- (2)512字节数据存储空间;
- (3)内带4K字节EEPROM存储空间;
- (4)可直接使用串口下载
单片机最小系统电路图如下图所示
实物图:
3.2、PCF8591 A/D采样电路设计
- 本系统选择PCF8591作为A/D采样芯片。PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。
- PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
芯片特性:
- (1)单独供电
- (2)PCF8591的操作电压范围2.5V-6V
- (3)低待机电流
- (4)通过I2C总线串行输入/输出
- (5)PCF8591通过3个硬件地址引脚寻址
- (6)PCF8591的采样率由I2C总线速率决定
- (7)个模拟输入可编程为单端型或差分输入
- (8)自动增量频道选择
- (9)PCF8591的模拟电压范围从VSS到VDD
- (10)PCF8591内置跟踪保持电路
- (11)8-bit逐次逼近A/D转换器
电路原理图:
实物图:
3.3、LCD1602液晶显示模块电路设计
- LCD显示器分为字段显示和字符显示两种。其中字段显示与LED显示相似,只要送对应的信号到相应的管脚就能显示。字符显示是根据需要显示基本字符。本设计采用的是字符型显示。系统中采用LCD1602作为显示器件输出信息。与传统的LED数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路,现在液晶显示模块已经是单片机应用设计中最常用的显示器件了。LCD1602可以显示2行16个汉字。
LCD1602主要技术参数如下
- (1)显示容量为16×2个字符;
- (2)芯片工作电压为4.5~5.5V;
- (3)工作电流为2.0mA(5.0V);
- (4)模块最佳工作电压为5.0V;
- (5)字符尺寸为2.95×4.35(W×H)mm。
电路原理图:
实物图:
3.4、5V继电器控制电路设计
- 继电器是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。继电器是具有隔离功能的自动开关元件,广泛应用于遥控、遥测、通讯、自动控制、机电一体化及电力电子设备中
- 在本系统中,通过三极管驱动继电器,当单片机的控制引脚为低电平时,三极管导通,此时继电器供电闭合
电路原理图
实物图
3.5、ACS712电流检测传感器模块电路设计
- 该传感器使用芯片为ACS712-05A,能够检测5A范围内的直流电流。ACS712芯片专们用于电流检测芯片, 高度集成的制作工艺和专业的电流检测技术可为各种交直流电流检测提供经济实惠且精确的解决方案。该器件封装便于客户轻松实施。ACS712芯片的经典应用于开关式电源设备和过电流故障保护、载荷检测和管理系统、电动机控制系统等。
- ACS712芯片,使用了精准的,低偏置的线性霍尔传感器电路,且其电流路径强敌了电流路径的阻抗,宁切路径靠近晶片的表面更增加了测量的准确度。
使用说明:
- (1)模块可以测量±5A电流。
- (2)电源电压的成比例输出,对应模拟量输出: 185mV/A。
- (3)没有检测电流通过时输出电压为VCC/2。
- (4)ACS712是基于霍尔检测原理,使用时要注意避开磁场。对此影响。
电路原理图:
实物图:
4、程序设计
4.1、系统初始化
void SYSInit()
{
Init_Timer0(); //定时器0初始化
UART_Init();
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear();
relay=0; //初始化测试继电器
DelayMs(200);
relay=1;
}
4.2、PCF8591读取电压值程序
/*------------------------------------------------
读AD转值程序
输入参数 Chl 表示需要转换的通道,范围从0-3
返回值范围0-255
------------------------------------------------*/
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Val;
Start_I2c(); //启动总线
SendByte(AddWr); //发送器件地址
if(ack==0)return(0);
SendByte(0x40|Chl); //发送器件子地址
if(ack==0)return(0);
Start_I2c();
SendByte(AddWr+1);
if(ack==0)return(0);
Val=RcvByte();
NoAck_I2c(); //发送非应位
Stop_I2c(); //结束总线
return(Val);
}
4.3、LCD1602显示数据程序
/***********************************************
函数名称:DispStr
功 能:让液晶从某个位置起连续显示一个字符串
参 数:x--位置的列坐标
y--位置的行坐标
ptr--指向字符串存放位置的指针
返回值 :无
***********************************************/
void DispStr(uchar x,uchar y,uchar *ptr)
{
uchar *temp;
uchar i,n = 0;
temp = ptr;
while(*ptr++ != '\0') n++; //计算字符串有效字符的个数
for (i=0;i<n;i++)
{
Disp1Char(x++,y,temp[i]);
if (x == 0x10)
{
break;
}
}
}
4.4、毫秒延时程序
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}