⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 define data struct.c

📁 一个充电控制器的完整单片机程序
💻 C
字号:
//***************************
//TLC1543 A/D data
//计算结果
//预设值
/****************************

每天工作数据:
	蓄电池电电压:1路(最高值和最低值)每天
	放电电流:1路(最高值和安时数的积分值)每天	
	充电电流:6路(最高值和安时数的积分值)每天
	温度:1路(最高值和最低值)每天
	每天9路数据18个值
其中安时数的积分值先计算出当前值然后积分
参考值:
	电流:0-100A(0-4V)充电,0-300A(0-4V)放电
	电压:0-300V(0-4V)
	温度:2.73V(0度)。
	设定数据:
	电流模块选择:
	充电:(25A,50A,100A,150A)
	放电:(50A,100A,200A,300A)
	系统电压:(48V,220 V,110V,300V)
	温度校正:实测值
	比例系数:20,50,100,100(48,110,220,300)
浮充工作点温度补偿:
	48V(-96mv/度)
	110V(-220mv/度)
	220V(-440mv/度)
	300V(-600mv/度)每升高1度
端口定义:
	A/D端口:1-6充电电流11,8空端口,9温度,10电压,7放电电流
	4069端口:1-6开关,8欠压报警,7启动油机

******************************/
/**/
#include <absacc.h> 
#include <stdlib.h>
#include <AT89X52.H>
#include <INTRINS.h>
#include "charger.h"
#include "lcdp.h"

//
//-----------------------------
//define data struct


//-----------------------------
//System flag,char of control;
//-----------------------------
static bit bdata boostflag=1;
static unsigned char idata switchchar=0x3f;

/*
//init_system_work_point , counter rate flow
*/

#define BENCHMARK 5
#define AMPLIFICATORY 10//predefine 0.1 proccess, amplificatory 10
#define ADMAX 1024

static unsigned char xdata  str[0x1800];
void init_system_work_point(void)
{
  unsigned char idata i;
  link xdata head;
  link xdata new;
  link xdata pointer;

  for(i=0;i<7;i++)
  {
    sys[i]=dtab[2][i];//default=2,system is 220V
  }  
  for(i=0;i<5;i++)//i=7
	{
		sys[i+7]=stab[i][2];
	}
  sys[12]=0;//tested temperature

  	init_mempool(str,0x1800);//&XBYTE[0x4000]

    head=(link)malloc(sizeof(daydata));
    if(head==0){text(0x90,"Head Null");delay(1000);return;}
		text(0x80,"malloc is ok!");
		head->next=NULL;
   	head->up=NULL;
		delay(1000);

    pointer=head;
		for(i=0;;i++)
		{
				new=(link)malloc(sizeof(daydata));
				if(new==0)break;
      	new->next=NULL;
      	new->up=NULL;
      	pointer->next=new;
      	new->up=pointer;
      	pointer=new;
    };
    pointer->next=head;
    head->up=pointer;

		WC_LCD(0x90);
		WD_LCD(i);
		delay(2000);

    //The moving header
    today.next=head;
    today.up=pointer; //is head->up;

  init_rate();

}

static void init_rate(void)
{
 unsigned int data i;
 crate.temperature=100*BENCHMARK*AMPLIFICATORY/ADMAX;
 i=sys[11];
 crate.volatage=i*BENCHMARK*AMPLIFICATORY/ADMAX;
 i=sys[8];
 crate.discharge=i*BENCHMARK*AMPLIFICATORY/ADMAX;
 i=sys[9];
 crate.charge=i*BENCHMARK*AMPLIFICATORY/ADMAX;
}

/*
//intput data from tlc1543,changed and saved
*/
void getadin(void)
{
  unsigned char data i;

  for(i=0;i<6;i++)
  {
   adin[i]=tlc1543(i)*crate.charge;
  } 
  adin[6]=tlc1543(6)*crate.discharge;
  adin[7]=tlc1543(8)*crate.temperature;
  adin[8]=tlc1543(9)*crate.volatage;//9way
}

/*
//count today working result
*/
void account(void)
{
	if(tlong%60==0)
	//count Ah, per 10s	//count max & min per 10s 
	{char i;
		for(i=0;i<9;i++)
		{
			if(i<7)
			{ //save current integral value
				today.work[i*2+1]+=(today.work[i*2+1]+adin[i])/(60*2);
			}
			else 
			{//save max & min value
				if(adin[i]>today.work[i*2+1])today.work[i*2+1]=adin[i]; 
				else if(adin[i]<today.work[2*i])today.work[i*2]=adin[i];
			}
			//only save max value
			if(adin[i]>today.work[2*i])today.work[i*2]=adin[i];
		}
	}
}

/*
//output control,switch operation
*/

#define boostvolatage    sys[0]
#define booststart       sys[1]
#define floatvolatage    sys[2]
#define floatrecover     sys[3]
#define moterstart       sys[4]
#define lowlevel         sys[5]
//alarm overload
#define overload         sys[6]
#define dischargecurrent 13

//-----------------------------

#pragma DISABLE

static void controlswitch (unsigned char i)
{
	P2_7=1;
	_nop_();
  P0=i;
	_nop_();
  P2_7=0;
	_nop_();
	_nop_();
}
//-----------------------------
static void alarm_overload()
{
}
//-----------------------------

void control(void)
{
	unsigned int data t,b;
	t=today.work[dischargecurrent];
	if(t>overload)alarm_overload();

	t=adin[8];// volatage of storage battery
	b=AMPLIFICATORY*boostvolatage;//boost charge volatage 
	if(t>b)
	{
		 switchchar=0x0;
	   controlswitch(switchchar);//all close & wcharge=0
	   boostflag=0;
	}
	else
  if(boostflag)
	{
      b=AMPLIFICATORY*booststart;//boost charge start
      if(t>b);
      else 
		 {
				switchchar=0x3f;
        controlswitch(switchchar);//6 way start
        boostflag=1;
        b=AMPLIFICATORY*moterstart;

        if(t>b);
        else 
			 {
							 switchchar=0x7f;
               controlswitch(switchchar);//6 way start and motor start
               b=AMPLIFICATORY*lowlevel;

               if(t>b);
               else {switchchar=0xff;controlswitch(switchchar);}//not enough volatage alarm,6 way start and motor start
             }
         }
	}
	else 
	{
      b=AMPLIFICATORY*floatvolatage;
      if(t>b)
	  {
		switchchar &= 0x3f;
		switchchar>>=1;
		controlswitch(switchchar);
	  }//close 1 way ,stop motor
      else 
	  {
        b=AMPLIFICATORY*floatrecover;
        if(t>b);
		else {switchchar=0x3f;controlswitch(switchchar);}
      }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -