基于51单片机的智能太阳能充电器带自动断开功能proteus仿真原理图PCB

功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时显示当前检测的充电电压
2.当电压超过设定阈值时,继电器断开,停止充电,同时蜂鸣器报警,提醒充电完成
3.按键可切换界面,并设置充电饱和阈值
4.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:
在这里插入图片描述
在这里插入图片描述

PCB:
在这里插入图片描述

主程序:

#include "main.h"



bit refreshFlag = 1;
bit chargeSwitch = 1; //充电开关

enum _MODE_DF_ dispMode;
float f_volt = 0.0;
float f_voltMax = 4.2;

unsigned char buzzerDelay = 0; //蜂鸣器延时

unsigned char setIndex = 0;
unsigned char i = 0;
unsigned char cnt = 0;

char dis0[16]; //定义显示区域临时存储数组

void main(void)
{

    Timer0_Init();
    LCD_Init();   //初始化液晶
    LCD_DispStr(0, 0, "    Welcome!    "); //充电
    DelayS(1); //延时有助于稳定
    LCD_Clear();  //清屏

    while (1) //主循环
    {
        
        if (refreshFlag == 1) //100ms获取数据并发送
        {
            refreshFlag = 0;

            if (cnt < 5) //累加
            {
                f_volt = f_volt + (float)ReadADC(AIN0_GND) * 5 / 255;
                cnt++;
            }
            else //求平均
            {
                cnt = 0;
                f_volt = f_volt  / 5;
				f_volt = f_volt * 2 ;
                    
                //液晶显示
                if (dispMode == NORMAL)
                {
                    DispNormal(&f_volt);
                }

                if (chargeSwitch == 1)
                {
                    RELAY = CLOSE;
                    if (f_volt > f_voltMax) //电池充满
                    {
                        chargeSwitch = 0; //切断充电
                        buzzerDelay = 10; //充满电响铃一段时间
                    }
                }
                else
                {
                    RELAY = OPEN;
                }


                if (buzzerDelay > 0) //响铃一段时间
                {
                    buzzerDelay--;
                    BUZZER = ~BUZZER;
                }
                else
                {
                    BUZZER = OFF;
                }

                f_volt = 0;
            }
            
        }

        KeyProcess();
    }
}


void DispNormal(float *volt)
{
    sprintf(dis0, "Voltage:  %3.1fV  ", *volt); //打印电压值
    LCD_DispStr(0, 0, dis0);                    

    if (chargeSwitch == 1)
    {
        LCD_DispStr(0, 1, "Status : Charge "); //充电
    }
    else
    {
        LCD_DispStr(0, 1, "Status : Idle   "); //空闲
    }

}

void DispSetVoltage(unsigned char setIndex)
{

    LCD_DispStr(0, 0, "   Set Voltage  ");
    sprintf(dis0, "    Max: %3.1fV   ", f_voltMax); //打印电压阈值
    LCD_DispStr(0, 1, dis0);
    
    switch (setIndex)
    {
        case 1: LCD_SetCursor(11, 1, 1); break;
        default:;
    } 
}

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Timer0_Init(void)
{
    TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
	TL0 = 0x00;		//设置定时初值
	TH0 = 0x4C;		//设置定时初值 50ms
    EA = 1;  //总中断打开
    ET0 = 1; //定时器中断打开
    TR0 = 1; //定时器开关打开
}

/*------------------------------------------------
                定时器中断子程序
------------------------------------------------*/
void Timer0_Interrupt(void) interrupt 1
{
    static unsigned char time50ms = 0;
    
	TL0 = 0x00;		//设置定时初值
	TH0 = 0x4C;		//设置定时初值 50ms

    time50ms++;
    if (time50ms >= 2) // 0.1s
    {
        time50ms = 0;
        refreshFlag = 1;
    }
    
}

仿真演示视频:
https://www.bilibili.com/video/BV1nS4y1z79g/

实物演示视频:
https://www.bilibili.com/video/BV12G411E7uY/

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值