小弟跪求大神帮助

2019-03-25 19:05发布


由于本人在单片机数菜鸟级别,下面这程序已经调试半个来月,搞得寝食难安,现已经筋疲力尽,在这发出求助 还请大神们伸出援助之手 帮帮小弟,小弟将万分感激。本程序为电池保护程序 ,过放切断负载 过充切断 充电太阳能板

//     PIC16F616头文件

//************************************************************************

#include <pic.h>

#include <pic16f616.h>

//************************************************************************

//     PIC16F616配置

//************************************************************************

__CONFIG(0x3F04);

//************************************************************************

//    宏定义

#define uint  unsigned int

#define uchar unsigned char   

#define Solar_SW   RA2

#define Load_SW    RA4   

#define led        RA5

#define LOW_V         224   //2.8V

#define LOW_renew     253   //3.1V

#define HIGH_V        341   //4.25V

#define HIGH_renew    327   //4.08V

#define Solar_V       200   //2.5V

//=======================================================================

void  delay1(uint x)      //延时程序 1ms

{

uint a,b;            

for(a=x;a>0;a--)

      for(b=110;b>0;b--);        

}

//================================================================

//************************************************************************

//     全局变量

//************************************************************************

uint  DC_vbat,DC_vbat1;

void  initialIO()           

{   

    TRISA=0x01;

    TRISC=0x01;

    TRISA3=1;

        PORTA=0xfe;

    ANSEL=0x11;

    delay1(10);

}

//========================================================================

//   AD初始化

//***********************************************************************

void ad_init(uchar channel)

{

        while(GO_nDONE);

        switch(channel)       

   {

        case 0:TRISA0=1;ANS0=1; break;

        case 1:TRISA1=1;ANS1=1; break;

        case 2:TRISA2=1;ANS2=1; break;

        case 3:TRISA4=1;ANS3=1; break;

        case 4:TRISC0=1;ANS4=1; break;

        case 5:TRISC1=1;ANS5=1; break;

        case 6:TRISC2=1;ANS6=1; break;

        case 7:TRISC3=1;ANS7=1; break;

        }

     ADCON0=0xc1;

     ADCON1=0x04;

     delay1(10);

}

//***********************************************************************

//  AD读电压

//************************************************************************

uint ad_read(uchar channel)

{

        uint adval;

        while(GO_nDONE);

        ADON=1;

    switch(channel)

     {

        case 0: {CHS2=0;CHS1=0;CHS0=0;}break;

        case 1: {CHS2=0;CHS1=0;CHS0=1;}break;

        case 2: {CHS2=0;CHS1=1;CHS0=0;}break;

        case 3: {CHS2=0;CHS1=1;CHS0=1;}break;

        case 4: {CHS2=1;CHS1=0;CHS0=0;}break;

                case 5: {CHS2=1;CHS1=0;CHS0=1;}break;

                case 6: {CHS2=1;CHS1=1;CHS0=0;}break;

                case 7: {CHS2=1;CHS1=1;CHS0=1;}break;

        default:break;

     }

        delay1(10);

        GO_nDONE=1;

        while(GO_nDONE);

        adval=ADRESH;

        adval=adval<<8|ADRESL;

        return(adval);

}

//************************************************************************

void chargingled()

{

                DC_vbat1=ad_read(4);

                        if(DC_vbat1<=Solar_V)

                        {

                                led=1;

                                delay1(600);

                                led=0;

                                delay1(600);

                                DC_vbat1=ad_read(4);

                        }       

      else  

              led=1;       

}



//=======================================================================

//    主函数

//************************************************************************

void Dischang()

{

        delay1(10);

     DC_vbat=ad_read(0);

     if(DC_vbat<=LOW_V)         //低压保护     

                {

                        Solar_SW=0;

                        Load_SW=1;

                        DC_vbat1=ad_read(4);

                        chargingled();

                        delay1(10);

                        do{

                DC_vbat=ad_read(0);

                                delay1(10);

                                Solar_SW=0;

                                delay1(20);       

                                chargingled();

                                Load_SW=1;

                                delay1(50);                                                                     

              }

            while(DC_vbat<=LOW_renew);//2.5~2.9低压恢复;

                        //Load_SW=1;

        }

     else if((DC_vbat>LOW_V)&&(DC_vbat< HIGH_V))  //充电放电

            {

                            Load_SW=0;

                delay1(10);

                    Solar_SW=0;

                                delay1(10);

                                chargingled();

                delay1(10);

                        }

          else if (DC_vbat>=HIGH_V)  //高压保护

                {

                                        Solar_SW=1;   

                   do{  

                        Solar_SW=1;

                              Load_SW=0;

                                                delay1(20);                                               

                                                chargingled();

                         delay1(10);

                                        }

                     while((DC_vbat>=HIGH_renew)); //4.08~4.35高压恢复

                 }                       

       }

                      

//=======================================================================

//    主函数

//************************************************************************

void main(void)                                                                  

{   

        delay1(1000);

        initialIO();

        ad_init(0);

        ad_init(4);

    while(1)

     {

                Dischang();

         }

}  
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
11条回答
dingzy_2002
2019-03-27 10:22
1.首先,要说明你要完成功能的具体要求,如电压工作点,监视点,有无低功耗要求等, 2.另外应该提供下你的硬件原理图(对软件编写有关的部分就可以) 3.最好说明下现阶段你卡在哪里,好针对性的帮助解决问题.

一周热门 更多>