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

📄 incorporatecap1.c

📁 基于AVR单片机+凌特公司的ltc1412cg的TEm测控程序代码
💻 C
字号:
#include <io8515v.h>
#include <incorporatecap.h>
#define  writepacketsize  2048
#define	 adstart PORTB&=~0x01
#define	 adstop	 PORTB|=0x01
#define	 frclr	 PORTD&=~0x10
#define  frset	 PORTD|=0x10
#define  cerclr	 PORTD&=~0x20
#define  cerset  PORTD|=0x20
#define	 faclr	 PORTB&=~0x04
#define	 faset	 PORTB|=0x04
#define	 semclr	 PORTB&=~0x10
#define	 semset	 PORTB|=0x10
#define	 readclr PORTB&=~0x20
#define	 readset PORTB|=0x20
#define  arrow	 PORTB&=~0x40
#define  forbid  PORTB|=0x40
#define  txdpc	 PORTB|=0x40
#define	 txdtf	 PORTB&=~0x40
#define	 w573clr PORTB&=~0x80
#define  w573set PORTB|=0x80
#define  setpreone	   PORTB|=0x10
#define  clrpreone	   PORTB&=~0x10
#define  starttimer1   TCCR1B = 0x01
#define  stoptimer1	   TCCR1B = 0x00
#define	 readint	   PIND&0x08
#define  readtb		   PINB&0x08
#define  readwa		   PINB&0x02
/*****通讯协议定义*****/
#define  op_initsys		0x80
#define  op_setall		0x81
#define  op_setfile		0x82
#define  op_poweron		0x83
#define  op_poweroff	0x84
#define  op_tranmod		0x85
#define	 op_missmod		0x86
#define  op_capfile		0x87
#define  op_delfile		0x88
#define  op_delallf		0x89
#define	 op_trafile		0x8a
#define  op_traallf		0x8b
#define  op_transys		0x8c
#define  op_havrece		0x8d
#define	 op_havsent		0x8e
#define  op_filfull		0x8f
#define  op_filenum		0x90
#define  op_currentdisp 0x91
#define  op_offtimedisp	0x92
#define  op_retransys	0x93
#define  op_savestate	0x94
#define  op_start		0x95
#define  op_stop		0x96
#define  op_busy		0x97
#define  op_nbusy		0x98
#define  op_ndata		0x99
#define  op_reset		0x9a
#define  op_capmode		0x9b
#define  op_shoot		0x9c
#define  op_hold		0x9d
#define  op_empty		0x00
#define  op_full		0x55
#define  op_plus		0x01
#define  op_nagetive	0xff


/*****系统串行通信位操作*****/
#define  bi_preset	   re_flag|=0x01
#define  bi_preclr	   re_flag&=~0x01
#define  bi_datset	   re_flag|=0x02
#define  bi_datclr	   re_flag&=~0x02
#define  bi_codset	   re_flag|=0x04
#define  bi_codclr	   re_flag&=~0x04
#define  bi_cheset	   re_flag|=0x08
#define  bi_checlr	   re_flag&=~0x08
#define  bi_endset	   re_flag|=0x10
#define  bi_endclr	   re_flag&=~0x10


#define  ref_hpre	   0x01
#define  ref_npre	   0x00
#define  ref_hdat	   0x03
#define	 ref_ndat	   0x00
#define	 ref_hcod	   0x07
#define  ref_ncod	   0x00
#define  ref_hche	   0x0f
#define  ref_nche	   0x00
#define  ref_hend	   0x1f
#define  ref_nend	   0x00
#define  ref_chan	   0x55
#define  ref_ncha	   0x00

#define  op_capprechar	0xaa		 //cap->os
#define  op_osprechar	0xbb		 //os->cap
#define  op_endchar		0xff
#define  op_ture		0x01
#define  op_fault		0xff
#define  op_havezero	0x01
#define	 op_nozero		0xff



/*****结构体定义*****/


extern unsigned int cdata[500];
extern unsigned char strings[8];
unsigned char re_num,re_temp,re_flag,re_data,re_change;
unsigned char filenumber,fileline,filenum,systemflag;
unsigned char savmode,savfreq,savssec,currentflag,offtimeflag;
extern filesys file[32];
extern filen filename[32];
//unsigned char captime;
extern unsigned char cureda[7],offtda[11];

/*****函数定义*****/
/*****fifo复位函数*****/
void resetfifo(void)
{
frset;
delay(20);
faclr;
delay(20);
frclr;
delay(30000);
frset;
delay(10);
forbid;
//faset;
}
/*****读fifo程序*****/
unsigned int readfifo()
{
unsigned int high;
unsigned char low;
arrow;
delay(5);
high=AFIFO2;
forbid;
delay(5);
high=high<<8;
arrow;
delay(5);
low=AFIFO1;
forbid;
high=high+low;
//high^=0x0800;
return(high);

}

/*****采集系统设置*****/
void capset()
{
 fileline=saveda[0];
 filenum=saveda[1];
 savmode=saveda[2];
 savfreq=saveda[3];
 savssec=saveda[4];
 
}



/*****电流计算程序*****/
void currentcal(unsigned int cur)
{
 unsigned char temp,flag;
 unsigned int data,i,div;
 float fdata;
 flag=0;
 if(cur<0x800)
 { strings[0]='-';//'_';
   data=0x7ff-cur;
  }
 else
 {
   strings[0]=' ';
   data=cur-0x800;
   }
 fdata=data*1.2207;//1000*5/4096
 div=1000;
 data=fdata;
 for(i=0;i<4;i++)
 {
 temp=data/div;
 strings[i+1]=temp+0x30;
 data=data%div;
 div=div/10;
  }
 if(strings[1]=='0')
 strings[1]=' ';
 strings[5]=0x0d;
 strings[6]=0x0a;
 }
 
 
 
void offtimecal(unsigned int cur)
{
 unsigned int data;
 float fdata;
 fdata=cur/4;
 data=(unsigned int)fdata;
 itoa(offtda,data,10);
 }



/*****延时程序*****/
void delay(unsigned int time)
{
unsigned int i;
 for(i=0;i<time;i++)
 ;
}

/*****发送字符程序*****/
void sendchar(unsigned char c)
{
 UDR=c;
 while(!(USR&0x40));
       USR|=0x40;
	   
}
/*****发送字符到pc程序*****/
void sendstring(char *p,char num,char dot)
{
 unsigned char i;
 for(i=0;i<num;i++)
 {
  sendchar(p[i]);
  if(i==dot)
  sendchar('.');
 }

}
/*****发送字符到主控制显示程序*****/
void sendtodisp( unsigned char command)
 {
  char i,j;
  j=0;
//  txdtf;
  delay(100);
  for(i=0;i<3;i++)
  {
  delay(100);
  sendchar(op_capprechar);
  }
  for(i=0;i<10;i++)
    {
	delay(100);
    sendchar(strtom[i]);
	j+=strtom[i];
    }
  sendchar(command);
  sendchar(op_endchar);
//  txdpc; 
  }

/*****发送关断时间到主控制显示程序*****/  
unsigned int offtimecul()
{
unsigned char i;
unsigned int count;
unsigned int time[3];
for(i=0;i<3;i++)
{
 setpreone;
 timer1_init();
 while(PINB&0x02);
 while(!(PINB&0x02));
 starttimer1;
 clrpreone;
 delay(2);
 while(readint);
 stoptimer1;
 time[i]=readtimer1();
 }
 count=time[0];
 for(i=1;i<3;i++)
 {
 if(count<time[i])
 count=time[i];
 }
 return(count);
}  

unsigned int readtimer1()
{
 unsigned int count;
 unsigned char high,low;
 low=TCNT1L;
 high=TCNT1H;
 count=high;
 count=count<<8;
 count=count&0xff00;
 count|=low;
 return(count);
}


 
/*****电流采集程序*****/
void currentcap()
{
 unsigned int i,j;
 resetfifo();
 
 while(readwa);
 while(!(readwa));//    ___|--
// while(!(readtb));
// while(readtb);//    ___|--
// delay(100);
 faset;
 adstart;
 delay(100);
 faclr;
 adstop;
 readfifo();
 for(i=0;i<200;i++)
 {
 cdata[i]=readfifo();
 }
 j=0;
 for(i=0;i<8;i++)
 {
 j+=cdata[i];
  }
  j=j/8;
 if(j<0x800)
// j=cdata[1];
 for(i=1,j=0;i<8;i++)
 {
   j+=plusltctohex(cdata[i]);
 }

 else
// j=cdata[1];
 for(i=1,j=0;i<8;i++)
 {
  j+=nagetiveltctohex(cdata[i]);
  }
  j=j/7;
  currentcal(j);
  if(strings[1]=='0')
  strings[1]=' ';
  for(i=0;i<7;i++)
  {
  cureda[i]=strings[i+1];
  }
}  
unsigned int plusltctohex(unsigned int ma)
{
 unsigned int i;
 if(ma>=0x800)
 i=ma-0x800;
 else
 i=ma|0x800;
 return(i);
}
 
unsigned int nagetiveltctohex(unsigned int ma)
{
unsigned int i;
if(ma>=0x800)
 i=(0xfff-ma)|0x800;
else
 i=0x7ff-ma;
return(i);
} 


unsigned int hextoltc(unsigned int ma)
{
unsigned int i;
if(ma>=0x800)
i=ma&0x7ff;
else
i=0x800-ma;
return(i);
}

void getcurrent(void)
{
   strtom[0]=cureda[0];
//  if(cureda[1]=='0')
//    strtom[1]=' ';
//  else
  strtom[0]=cureda[0];
  strtom[1]=cureda[1];
  strtom[2]='.';
  strtom[3]=cureda[2];
  strtom[4]=cureda[3];
  sendtodisp(op_currentdisp);
}

void getofftime(void)
{
  char j,i=0;
  while(i<=5&&offtda[i]!=0x00)
    i++;
  if(i<=5)
  {
  for(j=0;j<5-i;j++)
  {
  strtom[j]=' ';
  }
  for(j=5-i;j<5;j++)
  strtom[j]=offtda[i+j-5];
  }
  else
  {
  strtom[0]='O';
  strtom[1]='v';
  strtom[2]='e';
  strtom[3]='r';
  strtom[4]='!';
  }
  sendtodisp(op_offtimedisp);
}
/*****电流采集保存程序*****/
void capfile(unsigned char filenum)
{
 unsigned int i,k,save;
 unsigned char flag,zero;
 zero=op_nozero;
// for(j=0;j<1;j++)
// {
 resetfifo();
 while(readwa) ;
 while(!(readwa)) ;
//delay(5);
// while(readtb) ;
// while(!(readtb)) ;
 faset;
 adstart;
 delay(6000);
 adstop;
 faclr;
 readfifo();
// readfifo();
// readfifo();
 readfifo();
 for(i=0;i<500;i++)
 {
  sdata[i]=readfifo(); 
 }
 k=0;
  for(i=0;i<5;i++)
 {
  k+=sdata[i];
 }
 k=k/5;
 sdata[0]=k;
 if(k<0x800)
 flag=op_plus;
 else 
 flag=op_nagetive;
// if(j==0x00)
// {
 if(flag==op_plus)
 {
   k=sdata[0];
   save=sdata[0];
   cdata[0]=plusltctohex(k);
 for(i=1;i<500;i++)
   {
    k=sdata[i];
	if(k<=0x002||k>=0xffd)
	zero=op_havezero;
	if(zero==op_havezero&&k>=0x0f0)
	{
	 k=0x000;
	}
	if((k-save)>0x0100&&(k-save)<0x0200)
	cdata[i]=plusltctohex(k-0x0100);
	else
    cdata[i]=plusltctohex(k);
	save=k;
   }//for(i=5;i<500;i++)
  }//if(flag==op_plus)
 else
 { 
   k=sdata[0];
   cdata[0]=nagetiveltctohex(k);
   save=k;
 for(i=1;i<500;i++)
   {
    k=sdata[i];
	if(k<=0x002||k>=0xffd)
	zero=op_havezero;
	if(zero==op_havezero&&k>=0x0f0)
	{
	 k=0x000;
	}
    if(save-k>0x0100&&save-k<0x0200)
    cdata[i]=nagetiveltctohex(k+0x0100);
    else
    cdata[i]=nagetiveltctohex(k);
    save=k;
   }//for(i=5;i<500;i++)
   }//else  if(flag==op_plus)
// }//if(j==0x00)
   for(i=0;i<500;i++)
   { 
   file[filenum].data[i]=cdata[i];
   }
}  
  
/*****文件删除程序*****/
unsigned char deletfile(unsigned char filenum)
{
 unsigned char i;
 if(filenumber>=filenum)
  {
   filename[filenum].title=op_empty;
   filenumber--;
   return(op_ture);
  }
 else
   return(op_fault); 
}

/*****文件传输程序*****/  
void transmitfile(unsigned char filenum)
{ 
  unsigned int i;
  for(i=0;i<500;i++)
  {
  currentcal(file[filenum].data[i]);
  sendstring(strings,7,2);
  }
}  
/*****主控cpu文件系统初始化程序*****/
void transystem()
{
unsigned char i;
//   while(re_change==ref_ncha||saveda[10]!=op_transys);
//   re_change=ref_ncha;
//   saveda[10]=0x00;
 sendtodisp(op_retransys);
for(i=0;i<32;i++)
 {
   while(re_change==ref_ncha||saveda[10]!=op_transys);
   re_change=ref_ncha;
   saveda[10]=0x00;
  strtom[0]=filename[i].line;
  strtom[1]=filename[i].num;
  strtom[2]=filename[i].title;
  sendtodisp(op_retransys);

 }
 while(re_change==ref_ncha||saveda[10]!=op_transys);
 re_change=ref_ncha;
 saveda[10]=0x00;
 strtom[0]=filenumber;
 strtom[1]=fileline;
 strtom[2]=filenum;
 strtom[3]=savmode;
 strtom[4]=savfreq;
 strtom[5]=savssec;
 sendtodisp(op_filenum);
 re_change=ref_ncha;
 saveda[10]=0x00;
 }

unsigned char checkempty()
{
 unsigned char i=0;
 if(filenumber<32)
  {
   i=0;
   while(filename[i].title==op_full)
     {
     i++;
     }
  return(i); 
  }
  else
  return(op_fault);
}
  
/*****主程序*****/
void main(void)
{
 unsigned char a,b,c,maintemp;
 unsigned int i,current,sendtime=0;
  port_init();
  init_devices();
//  for(a=0;a<20;a++)
//  {
//  delay(0xffff);
//  delay(0xffff);
//  }
  forbid;
  semclr;
  cerset;
  adstop;
  re_num=0;
  re_temp=0;
  re_flag=0;
  re_data=0;
  re_change=0;
  offtimeflag=ref_ncha;
  systemflag=ref_ncha;
  saveda[10]=0x00;
//  while(re_change=ref_ncha&&saveda[10]!=op_transys);
//  re_change=ref_ncha;
//  saveda[10]=0x00;
//  transystem();
mainagin:
  if(re_change==ref_chan)
  {
  re_change=ref_ncha;
  maintemp=saveda[10];
  switch(maintemp)
  {
  case op_savestate:
                  capset();
				  break;
  case op_setfile:
                  fileline=saveda[0];
 				  filenum=saveda[1];
				  break;
  case op_start:
				  systemflag=ref_chan;
				  offtimeflag=ref_chan;
				  break;
  case op_stop:
				  systemflag=ref_ncha;
				  break;				  
  case op_delfile:
  	   			  deletfile(saveda[2]);
  	   			  break;
  case op_capfile:
  	   			  a=checkempty();
				  if(a==op_fault)
				  break;
  	              capfile(a);
				  filename[a].line=saveda[0];
				  filename[a].num=saveda[1];
				  fileline=saveda[0];
 				  filenum=saveda[1];
				  filename[a].title=op_full;
				  filenumber++;
  				  sendtodisp(op_capfile);
				  break;
  case op_delallf:
  	   			  for(a=0;a<32;a++)
				   {
				    filename[a].title=op_empty;;
				   }
				   filenumber=0x00;
				   break;
  case op_trafile:
                  transmitfile(saveda[2]);
				  delay(1000);
				  sendtodisp(op_trafile);
				  break;
				  
  case op_transys:
                 re_change=ref_ncha;
                 saveda[10]=0x00;
                 transystem();
				 break; 
  case op_currentdisp:
                 
                 getcurrent();
				 break; 
  case op_offtimedisp:
                 
                 getofftime();
				 break; 	 
				 
  default:
               ;             
		  
  }
  
  }//串口发送命令处理程序
  if(offtimeflag==ref_chan)
  {
  currentcap();
  current=offtimecul();
 if(current<=0x03b)
 {
 current=0x00;
 offtda[0]=' ';
 offtda[1]=' ';
 offtda[2]='0';
 offtda[3]='.';
 offtda[4]='0';
 offtda[5]=0x00;
 goto endmain;
 }
 if(current<=0xffff)
 {
 current=current-0x3b;
 offtimecal(current);
 goto endmain;
 }
 else
 {
 offtda[0]='O';
 offtda[1]='v';
 offtda[2]='e';
 offtda[3]='r';
 offtda[4]='!';
 offtda[5]=0x00;
 }
// 

}
endmain:
sendtime++;
if(sendtime%20==1&&offtimeflag==ref_chan)
{ 
getofftime();
delay(2000);
getcurrent();
}
if(sendtime>=200)
sendtime=0;
goto mainagin;
 
 }

⌨️ 快捷键说明

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