何涛 发表于 2012-10-10 13:50:52

太阳能充电控制器

太阳能充电控制器
原理图

第一层原理图

第二层原理图

第三层原理图
PCB版图

拼版图(PCB)

PCB打样
仿真图

        仿真图(proteus)
实物图

实物图
源程序
/*******************************************************************|
========================《太阳能充电控制器》========================|
使用芯片:ATMEGA8A
软件设计人:何涛
工程开始时间:2012.06.12
联系电话:13798974197(珠海)
QQ:562673469
====================================================================|
********************************************************************/

/****************************74HC164.C******************************/
#include "app.h"

void Show_164(unsigned char _ShowValue)
{
                 unsigned char Count0;
                  for(Count0=0;Count0<=7;Count0++)
                     {          
                  
            if((_ShowValue&0x01)==0x01)
            PORTD=PORTD|0X01;       //1DATA
                else
            PORTD=PORTD&0XFE;       //0DATA
            _ShowValue>>=1;   
                       
                        PORTD=PORTD&0XFD;       //CLK 0
                        //delay(1);
            PORTD=PORTD|0X02;       //CLK 1
                        //delay(10);
          }
                  PORTD=PORTD|0X02;       //CLK 1
}
/****************************74HC164.H******************************/
void Show_164(unsigned char _ShowValue);
/****************************AD.C***********************************/
#include "app.h"


/*ƬÄÚADC³õʼ»¯*/
void ADC_Init(INT8U channel)
{/*¹¤×÷ÓÚµ¥´Îת»»Ä£Ê½ÏÂ*/
    switch(channel)//ÄÚ²¿AREFµçѹ2.56VADLARת»»½á¹ûÓÒ¶ÔÆë ÊäÈëͨµÀchannel
                {
        case 0:ADMUX=0xc0+0;break;
        case 1:ADMUX=0xc0+1;break;
        case 2:ADMUX=0xc0+2;break;
        case 3:ADMUX=0xc0+3;break;
        case 4:ADMUX=0xc0+4;break;
        case 5:ADMUX=0xc0+5;break;
        case 6:ADMUX=0xc0+6;break;
        case 7:ADMUX=0xc0+7;break;
                default:break;
                }
    ADCSRA=0x00;//Æô¶¯×ª»» µ¥´Îת»» 16•ÖƵ
}

INT16U ADC_Start(INT8U channel)
{
    INT8U Temp_L;
    INT8U Temp_H;
        INT16U AD_Data;
       
       
        switch(channel)
        {
        case 0:ADMUX=0xc0+0;break;
        case 1:ADMUX=0xc0+1;break;
        case 2:ADMUX=0xc0+2;break;
        case 3:ADMUX=0xc0+3;break;
        case 4:ADMUX=0xc0+4;break;
        case 5:ADMUX=0xc0+5;break;
        case 6:ADMUX=0xc0+6;break;
        case 7:ADMUX=0xc0+7;break;
        default:break;
        }
    ADCSRA |=0xC0;//Æô¶¯ADת»» µ¥´Îת»»
    Temp_L=ADCL;
    Temp_H=ADCH;
        AD_Data=Temp_H*256+Temp_L;       
       
        ADCSRA=0x80;//¹Ø±ÕADת»» µ¥´Îת»»
       
        switch(channel)
        {
        case 0:ADMUX=0xc0+0;break;
        case 1:ADMUX=0xc0+1;break;
        case 2:ADMUX=0xc0+2;break;
        case 3:ADMUX=0xc0+3;break;
        case 4:ADMUX=0xc0+4;break;
        case 5:ADMUX=0xc0+5;break;
        case 6:ADMUX=0xc0+6;break;
        case 7:ADMUX=0xc0+7;break;
        default:break;
        }
    ADCSRA |=0xC0;//Æô¶¯ADת»» µ¥´Îת»»
    Temp_L=ADCL;
    Temp_H=ADCH;       
    AD_Data=Temp_H*256+Temp_L;
       
        ADCSRA=0x80;//¹Ø±ÕADת»» µ¥´Îת»»
       
        return(AD_Data);
}

void AD_select(INT8U channel)
{
switch(channel)
{
   case 0:        LED_NUM2=ADC_Start(6)/4;break;//UXX.X ³Ë10±¶ ±ãÓÚÏÔʾ
   case 1:        LED_NUM2=ADC_Start(7)/4;break;//AXX.X
   case 2:        LED_NUM2=ADC_Start(0)/4;break;//bXX.X
   case 3:        LED_NUM2=ADC_Start(1)/4;break;//CXX.X
}
}       
/****************************AD.H***********************************/
void ADC_Init(unsigned char channel);
unsigned int ADC_Start(unsigned char channel);
void AD_select(unsigned char channel);
/***************************APP.H***********************************/
#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>
//#include "Kernel.h"
//#include "task.h"
#include "misc.h"
#include "initial.h"
#include "74HC164.h"
#include "delay.h"
#include "LED.h"
#include "AD.h"
#include "EEPROM.h"
/***************************DELAY.H*********************************/
#include "app.h"

unsigned int Min = 0;//•ÖÖÓ
unsigned int Sec = 0;//Ãë

void delay(unsigned int a)
{
       unsigned int i,j;
       for(i=0;i<a;i++)
               for(j=0;j<500;j++);
}

void SolarCount(void)//¼ÆËã¸÷λÏÔʾֵ
{
Sec++;
if (Sec>59)
{
   Sec = 0;
   Min ++;
}
}
/***************************DELAY.H*********************************/
extern unsigned int Min;//•ÖÖÓ
extern unsigned int Sec;//Ãë
extern unsigned int Count,flag_count;//¼ÆÊý

void delay(unsigned int a);
void SolarCount(void);
/***************************EEPROM.H********************************/
#include "app.h"

void EEPROM_Init(void)
{
INT8U i=0;
flag_0 =EEPROMread(1);


flag_3 =EEPROMread(4);
flag_4 =EEPROMread(5);
flag_5 =EEPROMread(6);
flag_6 =EEPROMread(7);
flag_7 =EEPROMread(8);

flag_9 =EEPROMread(10);
flag_10=EEPROMread(11);
}

void EEPROM_Start(void)
{
EEPROMwrite(1,flag_0);


EEPROMwrite(4,flag_3);
EEPROMwrite(5,flag_4);
EEPROMwrite(6,flag_5);
EEPROMwrite(7,flag_6);
EEPROMwrite(8,flag_7);//125

EEPROMwrite(10,flag_9);
EEPROMwrite(11,flag_10);
}

void EEPROM_Recover(void)
{
EEPROMwrite(1,6);


EEPROMwrite(4,50);
EEPROMwrite(5,108);
EEPROMwrite(6,144);
EEPROMwrite(7,0);
EEPROMwrite(8,125);

EEPROMwrite(10,0);
EEPROMwrite(11,0);
}
/***************************EEPROM.C********************************/
void EEPROM_Init(void);

void EEPROM_Start(void);

void EEPROM_Recover(void);
/***************************INITIAL.C*******************************/
#include "app.h"

INT16U Time1=3;
void Gpio_Init(void);
void Timer1_Init(void);
void Timer2_Init(void);
void Interrupt_Init(void);
void Battery_Init(void);

void Hardware_Init(void)
{
        ADC_Init(6);
        EEPROM_Init();
    Gpio_Init();
        Timer1_Init();
    Timer2_Init();
    Interrupt_Init();
        Battery_Init();
}

void Battery_Init(void)
{
INT16U i=4,j=5;
while(Time1)//6sµ¹¼Æʱ
{
if(flag_count==1)
{Time1--;flag_count=0;}
Display4(Time1);
}
while(i--)
{
while(j--)
Display1(windows_1,120);
PORTD=0XFF;
delay(1000);
j=8;
// delay(100);
}
}

//***************************************************************
void Gpio_Init(void)
{
        DDRB   = 0xDF;   //PB5×öΪ°´¼ü
        PORTB= 0x20;
        DDRC   = 0x00;
        PORTC= 0xFF;
        DDRD   = 0xFF;
        PORTD= 0xFF;
}

//TIMER1 initialize - prescale:1024
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Hz
// actual value:1.000Hz (0.0%)
void Timer1_Init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFF; //setup
TCNT1L = 0xB2;
OCR1AH = 0x00;
OCR1AL = 0x4E;
OCR1BH = 0x00;
OCR1BL = 0x4E;
ICR1H= 0x00;
ICR1L= 0x4E;
TCCR1A = 0x00;
TCCR1B = 0x05; //start Timer
TIMSK |= 0x10;//Êä³ö±È½ÏAÆ¥ÅäÖжÏʹÄÜ
}

void Timer2_Init(void)
{
TCCR2 = 0x00; //stop
ASSR= 0x00; //set async mode
TCCR2 = 0x0F; //start
TCNT2 = 0x00; //setup
OCR2= 0x4D;
TIMSK|= 0x80;
}

void Interrupt_Init(void)
{
        SREG |= 0x80;   //Enable Global Interrupt
}
/***************************INITIAL.H*******************************/
void Hardware_Init(void);
/***************************INTERPUTL.C*****************************/


#include "app.h"

unsigned int Count=0,flag_count=0;//¼ÆÊý

#pragma interrupt_handler Timer1_Interrupt:7
void Timer1_Interrupt(void)
{
        //Clear Timer2 OCIF Flag
        TIFR|= 0x10;
    TCNT2 = 0x00;
       
}

#pragma interrupt_handler Timer2_Interrupt:4
void Timer2_Interrupt(void)
{
        TIFR|= 0x80;//Clear Timer2 OCIF Flag
    TCNT2 = 0x00;
        Count++;
       
        if(Count>100)
        {
       Count=0;
       flag_count=1;//µ¹¼Æʱ1S±êÖ¾
       SolarCount();//¼Æʱ
        }
        if(flag_timestart!=1)//¼Æʱ±ê־λÇåÁã
        Min=0;//ÓôËÖÖ•½Ê½ÒÖÖƼÆʱ
}
/***************************LCD.C***********************************/
#include "app.h"
INT8U LED_NUM[]={0x28,/*0*/
                              0xEB,/*1*/
                              0x32,/*2*/
                            0xA2,/*3*/
                     0xE1,/*4*/
                     0xA4,/*5*/
                     0x24,/*6*/
                     0xEA,/*7*/
                     0x20,/*8*/
                     0xA0,/*9*/
                               0x60,/*A*/
                               0x25,/*b*/
                     0x3C,/*C*/
                     0x74,/*F*/
                     0x29,/*U*/
                               0xFF,/*È«ºÚ 15*/
                                };
//INT8U LED_NUM1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x0E,0x41}; //¹²Ñô¼«+СÊýµã
INT8U LED_NUM1[]={
                        0x08,/*0*/
                        0xCB,/*1*/
                        0x12,/*2*/
                        0x82,/*3*/
                        0xC1,/*4*/
                        0x84,/*5*/
                        0x04,/*6*/
                        0xCA,/*7*/
                        0x00,/*8*/
                        0x80,/*9*/
                        0x40,/*A*/
                        0x05,/*B*/
                        0x1C,/*C*/
                        0x54,/*F*/
                        0x09,/*U*/
                                  0xFF,/*È«ºÚ 15*/
                               };

INT8U LED_NUM2[]={0,1,2,3};
INT16U Fixed_Time[]={1,5,10,60,120,180,240,300,360,420,480,540,600,660,720};//14
void Display2(INT8U value);
void Display3(INT8U value);


void Display1(INT8U windows,INT8U value)
{
       INT8U s=value;
       if(windows==0)//½çÃæ1 UXX.XÐîµç³Øµçѹ
       {
          Show_164(LED_NUM);
          PORTD=0XD8;
          delay(10);
       }
       if(windows==1)//½çÃæ2 AXX.X B•Êä³öµçÁ÷
       {
          Show_164(LED_NUM);
          PORTD=0XD8;
          delay(10);
       }
       if(windows==2)//½çÃæ3 bXX.X A•Êä³öµçÁ÷
       {
          Show_164(LED_NUM);
          PORTD=0XD8;
          delay(10);
       }
       if(windows==3)//½çÃæ4 CXX.X ³äµçµçÁ÷
       {
          
          Show_164(LED_NUM);
          PORTD=0XD8;
          delay(10);
       }       
       
       Show_164(LED_NUM);
       PORTD=0X78;
       delay(10);
       
       
       Show_164(LED_NUM1);
       PORTD=0XB8;
       delay(10);          
       
       
       Show_164(LED_NUM);
       PORTD=0XE8;
       delay(10);              
}

void Display2(INT8U value)
{
       INT8U s=value;
       
       Show_164(LED_NUM1); //F.XXX
       PORTD=0XD8;
       delay(10);
       
       
       Show_164(LED_NUM);
       PORTD=0X78;
       delay(10);
       
       
       Show_164(LED_NUM);
       PORTD=0XB8;
       delay(10);          
       
       
       Show_164(LED_NUM);
       PORTD=0XE8;
       delay(10);              
}

void Display3(INT8U value)
{
       INT8U s=value;
       
       Show_164(LED_NUM);
       PORTD=0XD8;
       delay(10);
       
       
       Show_164(LED_NUM1);
       PORTD=0X78;
       delay(10);          
       
       
       Show_164(LED_NUM);
       PORTD=0XB8;
       delay(10);       
       
       
       Show_164(LED_NUM); //XX.XU
       PORTD=0XE8;
       delay(10);                 
}

void Display4(INT16U value)// ÏÔʾXXXX
{
       INT16U t=value;
              
       
       Show_164(LED_NUM);
       PORTD=0XD8;
       delay(10);
              
       
       Show_164(LED_NUM);
       PORTD=0X78;
       delay(10);
       
       
       Show_164(LED_NUM);
       PORTD=0XB8;
       delay(10);          
       
       
       Show_164(LED_NUM);
       PORTD=0XE8;
       delay(10);              
}

void Display5(INT16U value)
{
       INT16U t=value; //720min
              
       
       Show_164(LED_NUM);//7
       PORTD=0XD8;
       delay(10);
              
       
       Show_164(LED_NUM);//2
       PORTD=0X78;
       delay(10);
       
       
       Show_164(LED_NUM);//0
       PORTD=0XB8;
       delay(10);          
       
       
       if(Count>50)
       Show_164(0XDF);//ÏÔʾСÊýµã
       else if(Count<51)
       Show_164(0XFF);//¹Ø±ÕСÊýµã
       PORTD=0XE8;
       delay(10);              
}

void Display(void)
{
       if(!(Enter1|Enter2|Enter3)) //ËĽçÃæÇл»
       Display1(windows_1,LED_NUM2);
       
       if(Enter1)
       Display2(windows_2);//F.XXX
       
       if(Enter2)
       {
          switch(windows_2)
          {
          case 0:Display4(Fixed_Time);break;//Êä³öA¶¨Ê±Ê±¼ä
          case 1:break;//A•µçÁ÷±£»¤Öµ
          case 2:break;//B•µçÁ÷±£»¤Öµ
          case 3:Display4(flag_3);break;//¹â¿Øµã
          case 4:Display3(flag_4);break;//Ǖѹ±£»¤Öµ//XX.XU
          case 5:Display3(flag_5);break;//¹ýѹ±£»§Öµ
          case 6:Display4(flag_6);break;//¹â¿ØÊÖ¶¯Çл»
          case 7:Display3(flag_7);break;//¹ý•Åµçѹ•µ»ØÖµ       
          case 8:break;//µçѹÊÖ¶¯ÐÞÕý²¹³¥Öµ       
          case 9:Display4(flag_9);break;//ÊýÂëÏÔʾ¿ª¹Ø       
          case 10:Display4(flag_10);break;//USB_5VÊä³ö       
          case 11:Display4(flag_11);break;//»Ö¸´³ö³§ÉèÖà      
                 
          default:break;
          }
       }
       else return;
}   
/***************************LCD.H***********************************/void Display1(unsigned char windows,unsigned char value);

void Display4(unsigned int value);

void Display5(unsigned int value);

void Display(void);       
/***************************MAIN.H**********************************/
#include "app.h"
unsigned int i=0;
void main(void)
{
        Hardware_Init();
       
        while(1)
        {
       AD_select(i);
       if(i++>4)i=0;               
       Key_Manage();
       if(flag_timestart!=1)//•Ç¶¨Ê±Ä£Ê½
       Display();
       else if(flag_timestart==1)//¶¨Ê±Ä£Ê½
       Display5(Fixed_Time-Min);           
       judgement();
       performance();
       LED_Control();

        }

}
/***************************MISC.C**********************************/
#include "app.h"

//******************************************************************************
/*****²ÎÊý±äÁ¿*******/
INT8S flag_0=6;//10.8
INT8U flag_4=108;//10.8
INT8U flag_5=144;//14.4
INT8U flag_7=125;//12.5
INT8U flag_3=20;
INT8S flag_6=0;
INT8U flag_9=0;
INT8U flag_10=0;
INT8U flag_11=0;
INT8U flag_timestart=0;//¿ªÆô¼Æʱ±ê־λ ¡°1 ¡±ÓÐЧ
INT8U flag_light=0; //¹â¿Ø±ê־λ
INT8U flag_wait=0; //´ý»ú
/**********************/
INT8U Enter1=0;
INT8U Enter2=0;
INT8U Enter3=0;
/**********************/
INT8U windows_1=0;//ËÄÖÖ½çÃæÇл»
INT8S windows_2=0;//²ÎÊýºÅ½çÃ棨11ÖÖ£©
/**********************/
INT8U flag_undervoltage=0;//Ǖѹ±ê־λ
INT8U flag_overvoltage =0;//¹ý³äµç±ê־λ
/**********************/
INT16U Time=4;//µ¹¼Æʱ
/**********************/
INT8U OUT_A=0,OUT_B=0,CHA=0,CHB=0;
//local function(s) declaration
INT16U swGet_Key1(void);
INT16U swGet_Key2(void);
INT16U swGet_Key3(void);
INT16U swGet_Key4(void);

//******************************************************************************
INT16U swGet_Key1(void)
{
        static INT16U wKeyStatus = 1;
        if(wKeyStatus == 1)
        {
                if((PINB & (1 << Key_R)) == 0) //Key Pressed
                {
                        wKeyStatus = 0;
                }
        }
        else if(wKeyStatus == 0)
        {
                if(PINB & (1 << Key_R))       //Key Released
                {
                        wKeyStatus = 1;
                        return(true);
                }
        }
        return(false);
}

//******************************************************************************
INT16U swGet_Key2(void)
{
        static INT16U wKeyStatus = 1;
        if(wKeyStatus == 1)
        {
                if((PINC & (1 << Key_S)) == 0) //Key Pressed
                {
                        wKeyStatus = 0;
                }
        }
        else if(wKeyStatus == 0)
        {
                if(PINC & (1 << Key_S))       //Key Released
                {
                        wKeyStatus = 1;
                        return(true);
                }
        }
        return(false);
}

//******************************************************************************
INT16U swGet_Key3(void)
{
        static INT16U wKeyStatus = 1;
        if(wKeyStatus == 1)
        {
                if((PINC & (1 << Key_A)) == 0) //Key Pressed
                {
                        wKeyStatus = 0;
                }
        }
        else if(wKeyStatus == 0)
        {
                if(PINC & (1 << Key_A))       //Key Released
                {
                        wKeyStatus = 1;
                        return(true);
                }
        }
        return(false);
}

//******************************************************************************
INT16U swGet_Key4(void)
{
        static INT16U wKeyStatus = 1;
        if(wKeyStatus == 1)
        {
                if((PINC & (1 << Key_B)) == 0) //Key Pressed
                {
                        wKeyStatus = 0;
                }
        }
        else if(wKeyStatus == 0)
        {
                if(PINC & (1 << Key_B))       //Key Released
                {
                        wKeyStatus = 1;
                        return(true);
                }
        }
        return(false);
}

//******************************************************************************
INT8U Key_Detection(void)
{
        if(swGet_Key1() == true)
        {
                return 3;
        }
       
        if(swGet_Key2() == true)
        {
                return 4;
        }
       
        if(swGet_Key3() == true)
        {
                return 2;
        }
       
        if(swGet_Key4() == true)
        {
                return 1;
        }
        return 0;
}

//******************************************************************************
void Key_Manage(void)
{
switch(Key_Detection())
{
    case S:
                   if(!(Enter1|Enter2|Enter3)){Enter1=1;break;}//½øÈë¶þ²ã½çÃæ
                   if(Enter1==1){Enter2=1;Enter1=0;break;}//½øÈëÈý²ã½çÃæ
                   if(Enter2==1){Enter3=1;Enter2=0;}//È•ÈÏ£¬±£´æ
                   if(Enter3==1)
                   {
                           while(Time)
                        {
                       if(flag_count==1)
                       {Time--;flag_count=0;}
                       Display4(Time);
                        }
                        if(flag_11==0)
                        EEPROM_Start(); //±£´æÉèÖÃ
                        else if(flag_11==1)
                        {
                       EEPROM_Recover();//»Ö¸´³ö³§ÉèÖÃ
                       flag_11=0;//ÇåÁã±ê־λ
                        }
                        Time=4;Enter1=1;Enter3=0;break;}                  
                   else break;                                        
        case R:
                  {
                   if(!(Enter1|Enter2|Enter3)){windows_1++;if(windows_1==4)windows_1=0;}//Ò»²ã½çÃ棨ËÄÖÖÏÔʾ»­ÃæÇл»£©
                   if(Enter1==1){Enter1=0;}//½øÈëÒ»²ã½çÃ棨Í˳ö¶þ²ã½çÃ棩
                   if(Enter2==1){Enter2=0;Enter1=1;}
                   if(Enter3==1){Enter3=0;Enter2=1;}
                  }break;        //½øÈë¶þ²ã½çÃ棨Í˳öÈý²ã½çÃ棩
    case A:
                  {
                   if(!(Enter1|Enter2|Enter3)){OUT_A=!OUT_A;break;}
                   if(Enter1==1){windows_2++;if(windows_2>11)windows_2=0;break;}
                   if(Enter2==1)
                                                   switch(windows_2)
                                                {
                                                          case 0:{flag_0+=1;if(flag_0>14)flag_0=0;break;}//Êä³öA¶¨Ê±Ê±¼ä
                                                          case 1:break;//A•µçÁ÷±£»¤Öµ
                                                          case 2:break;//B•µçÁ÷±£»¤Öµ
                                                          case 3:{flag_3+=1;if(flag_3>100)flag_3=1;break;}//¹â¿Øµã
                                                          case 4:{flag_4+=1;if(flag_4>113)flag_4=106;break;}//Ǖѹ±£»¤Öµ
                                                          case 5:{flag_5+=1;if(flag_5>164)flag_5=136;break;}//¹ýѹ±£»§Öµ
                                                          case 6:{flag_6+=1;if(flag_6>2)flag_6=0;break;}//¹â¿ØÊÖ¶¯Çл»
                                                          case 7:{flag_7+=1;if(flag_7>130)flag_7=120;break;}//¹ý•Åµçѹ•µ»ØÖµ
                                                          case 8:break;//µçѹÊÖ¶¯ÐÞÕý²¹³¥Öµ
                                                          case 9:{flag_9=!flag_9;break;}//ÊýÂëÏÔʾ¿ª¹Ø
                                                          case 10:{flag_10=!flag_10;break;}//USB_5VÊä³ö
                                                          case 11:{flag_11=!flag_11;break;}//»Ö¸´³ö³§ÉèÖÃ
                                                          default:break;
                                               }
                        }break;                       
                               
                                     
    case B:
                  {
                   if(!(Enter1|Enter2|Enter3)){OUT_B=!OUT_B;break;}
                   if(Enter1==1){windows_2--;if(windows_2<0)windows_2=11;break;}
                   if(Enter2==1)
                                                   switch(windows_2)
                                                {
                                                          case 0:{flag_0-=1;if(flag_0<0)flag_0=14;break;}//Êä³öA¶¨Ê±Ê±¼ä
                                                          case 1:break;//A•µçÁ÷±£»¤Öµ
                                                          case 2:break;//B•µçÁ÷±£»¤Öµ
                                                          case 3:{flag_3--;if(flag_3<0)flag_3=99;break;}//¹â¿Øµã
                                                          case 4:{flag_4-=1;if(flag_4<106)flag_4=112;break;}//Ǖѹ±£»¤Öµ
                                                          case 5:{flag_5-=1;if(flag_5<136)flag_5=164;break;}//¹ýѹ±£»§Öµ
                                                          case 6:{flag_6-=1;if(flag_6<0)flag_6=2;break;}//¹â¿ØÊÖ¶¯Çл»
                                                          case 7:{flag_7-=1;if(flag_7<120)flag_7=130;break;}//¹ý•Åµçѹ•µ»ØÖµ
                                                          case 8:break;//µçѹÊÖ¶¯ÐÞÕý²¹³¥Öµ
                                                          case 9:{flag_9=!flag_9;break;}//ÊýÂëÏÔʾ¿ª¹Ø
                                                          case 10:{flag_10=!flag_10;break;}//USB_5VÊä³ö       
                                                          case 11:{flag_11=!flag_11;break;}//»Ö¸´³ö³§ÉèÖà                                                                                                                                                   
                                                          default:break;
                                               }
                  }break;
                                                                                                                                                               
        default : break;       
        }
}       

void judgement(void)
{

/*********µÚÒ»¼¶ÅжÏ********/
//¹â¿Ø
if(flag_3>=LED_NUM2&&flag_undervoltage==0&&flag_6==1)//¹â¿Ø
{
flag_light=1;
}
if(flag_3<LED_NUM2||flag_undervoltage==1||flag_6!=1)//¹Ø±Õ¹â¿Ø
{                                                                                                                          
if(flag_light==1)                                                                                                                          
{
   flag_light=2;
}
}
       
          
//¶¨Ê±
if(flag_6==2&&flag_undervoltage==0&&OUT_A==1)
{
flag_timestart=1;
}
if(flag_6!=2||flag_undervoltage==1||OUT_A==0||Min>=Fixed_Time)
{
if(flag_timestart==1)
{
   flag_timestart=2;
}
}

//Ǖѹ
if(flag_4>LED_NUM2)//Ǖѹ
{
flag_undervoltage=1;
}
if(flag_7<=LED_NUM2&&flag_undervoltage==1)//Ǖѹ»Ø¸´
{
flag_undervoltage=0;
}
//¹ýѹ
if(flag_5<LED_NUM2)//¹ýѹ
{
flag_overvoltage=1;
}
if(flag_5>=LED_NUM2)//¹ýѹ»Ø¸´
{
flag_overvoltage=0;
}
//´ý»ú
if(flag_undervoltage==0&&flag_overvoltage==0&&OUT_A==0&&OUT_B==0)
{
flag_wait=1;
}
else
{
flag_wait=0;
}
}

void performance(void)
{
//OUT_A OUT_B Ç¿ÖÆÐÔ
if(flag_undervoltage==1)
{
PORTB=PORTB&0XFD;       
PORTB=PORTB&0XF7;
}
if(flag_light==2)
{
OUT_A=0;
flag_light=0;
}
if(flag_timestart==2)
{
OUT_A=0;
flag_timestart=0;
}
if(flag_timestart==1||flag_light==1)
{
OUT_A=1;
//OUT_B=0;
}
//CHA CHB Ç¿ÖÆÐÔ
if(flag_overvoltage==1)
{
CHA=0;
CHB=0;
}
if(flag_overvoltage==0)
{
CHA=1;
CHB=1;
}
if(flag_undervoltage==0)
{
if(OUT_A)PORTB=PORTB|0X02;//A•Êä³ö
    else   PORTB=PORTB&0XFD;       
if(OUT_B)PORTB=PORTB|0X08;//B•Êä³ö
    else   PORTB=PORTB&0XF7;
if(CHA)PORTB=PORTB&0X7F;//¿ªCHA
    else   PORTB=PORTB|0X80;//¹ØCHA
if(CHB)PORTB=PORTB&0XFE;//¿ªCHB       
    else   PORTB=PORTB|0X01;//¹ØCHB               
}   
}                                                       
void LED_Control(void)
{
        if(flag_undervoltage==1)
       
       Show_164(0X7F);
       PORTD=0XF0;
       delay(10);
       PORTD=0XF8;                      
}
/***************************MISC.H**********************************/
#define INT8Uunsigned char
#define INT8S    signed char
#define INT16U unsigned int
#define INT16S   signed int
#define INT32U unsigned long
#define INT32S   signed long

#define true       1
#define false       0

#define Key_R 5
#define Key_S 4
#define Key_A 3
#define Key_B 5
/**********************/
#define R 1
#define S 2
#define A 3
#define B 4
/**********************/
extern INT8U OUT_A,OUT_B;
/*****²ÎÊý±äÁ¿*******/
extern INT8S flag_0;
extern INT8U flag_4;
extern INT8U flag_5;
extern INT8U flag_7;
extern INT8U flag_3;
extern INT8S flag_6;
extern INT8U flag_9;
extern INT8U flag_10;
extern INT8U flag_11;
extern INT8U flag_timestart;//
extern INT8U flag_light;
/**********************/
extern INT8U Enter1;
extern INT8U Enter2;
extern INT8U Enter3;
/**********************/
extern INT8U windows_1;//ËÄÖÖ½çÃæÇл»
extern INT8S windows_2;//²ÎÊýºÅ½çÃ棨11ÖÖ£©
/**********************/
extern INT8U LED_NUM2;//ËĽçÃæ²ÎÊý
extern INT16U Fixed_Time;//¶¨Ê±Ê±¼ä²ÎÕÕ±í

INT8U Key_Detection(void);
void Key_Manage(void);
void judgement(void);
void performance(void);
void LED_Control(void);
//====================END OFF ILE=============================//

imlion 发表于 2012-10-10 14:11:43

木有原理图

5IDIANZI 发表于 2012-10-11 11:13:13

程序里面的大段注释都是乱码

何涛 发表于 2012-10-11 19:50:20

太阳能充电控制器项目

何涛 发表于 2012-10-11 19:53:16

imlion 发表于 2012-10-10 14:11 static/image/common/back.gif
木有原理图

已经上传了复件

chanjay 发表于 2012-12-4 09:04:10

谢谢!楼主!!

hzpyj 发表于 2012-12-4 09:25:01

PDF文件里面基本没有标示,全丢了

h1j2j_2013 发表于 2013-3-28 09:57:59

看看,谢谢楼主

lunhuiliudao 发表于 2013-4-1 19:44:45

没有图,代码看的不是很懂!!!!!

peter_yu 发表于 2013-5-11 12:38:49

谢谢楼主分享

hkfx 发表于 2014-1-19 20:21:31

{:smile:},来学些一下太阳能控制器

gwuyu 发表于 2014-1-19 20:57:03

谢谢楼主分享

HJJ2008 发表于 2014-1-19 21:05:05

发一张收人卡;

hnqylgq 发表于 2014-1-20 19:21:51

不错,谢谢开源共享

洪荒一鼎 发表于 2014-1-22 11:17:43

感谢楼主开源{:lol:}

jlian168 发表于 2014-1-22 16:32:17

What compiler it is?
页: [1]
查看完整版本: 太阳能充电控制器