📄 incorporatecap1.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 + -