📄 adandkeyau.c
字号:
}*/
back_count=0;
}
}
ES=1;
}
//***********************读取参数滤波函数***********************
//功能描述:数据存储的数组从小到大排序
// 去掉最大值和最小值, 然后返回平均值
uint Compositor(uint *x)
{
uchar i, j;
uint value=0;
ulong add_sum=0;
for(i=0; i<10; i++) //数组中数据排序
{
for(j=i+1; j<11; j++)
{
if(x[i]>x[j])
{
value=x[i];
x[i]=x[j];
x[j]=value;
}
}
}
for(i=1; i<10; i++) //除掉最大值,最小值求和
{
add_sum=add_sum+x[i];
}
value=add_sum/9;
return value; //取平均,返回参数
}
//***********************读取电源电压函数***********************
uint GatherValue(uint pama)
{
ulong Fy;
uint y;
Fy = (ulong)pama;
R_buf_G=Compositor(a);
b[(Rec4Buf_G[2])-1]=R_buf_G;
Fy = (ulong)(R_buf_G*Fy);
if(((Fy/1000)%10)<5) { y = (uint)(Fy/10000); }
else
{
if(((Fy/1000)%10)>5) y = (uint)((Fy/10000)+1);
else
{
y = (uint)((Fy/10000)+1);
}
}
return y;
}
//***********************电源电压还原函数***********************
uint GatherValue_back(uint pama,uint R_buf_G)
{
ulong Fy;
uint y;
Fy = (ulong)pama;
Fy = (ulong)(R_buf_G*Fy);
if(((Fy/1000)%10)<5) { y = (uint)(Fy/10000); }
else
{
if(((Fy/1000)%10)>5) y = (uint)((Fy/10000)+1);
else
{
y = (uint)((Fy/10000)+1);
}
}
return y;
}
//***********************读取电源电流函数***********************
uint Gathercurrent(uint pama)
{
ulong Fy;
uint y;
Fy = (ulong)pama;
R_buf_G=Compositor(c);
if((Rec4Buf_G[2]==1)||(Rec4Buf_G[2]==2))
{if(R_buf_G<=800)
R_buf_G=0;
}
if(Rec4Buf_G[2]==3)
{if(R_buf_G<=493)
R_buf_G=0;
}
if(Rec4Buf_G[2]==4)
{if(R_buf_G<=293)
R_buf_G=0;
}
if(Rec4Buf_G[2]==5)
{if(R_buf_G<=100)
R_buf_G=0;
}
if(Rec4Buf_G[2]==6)
{if(R_buf_G<=800)
R_buf_G=0;
}
Fy = (ulong)(R_buf_G*Fy);
if(((Fy/1000)%10)<5) { y = (uint)(Fy/10000); } //*****
else
{
if(((Fy/1000)%10)>5) y = (uint)((Fy/10000)+1);
else
{
y = (uint)((Fy/10000)+1);
}
}
return y;
}
//***********************串口接收中断函数***********************
void SerialFunc(void) interrupt 4 // using 1
{
uchar temp;
//uint t;
//===========================输出中断
if(_testbit_(TI)) //输出中断
{
TI=0;
TransCtr_G++; //输出缓冲区指针加1
if(TransState==1)
{
if(TransCtr_G < TransSize_G) //数据是否输出完毕
{
SBUF = TransBuf_G[TransCtr_G];//输出当前字节
}
else
{
TransState=0;
TransCtr_G=0;
RecvState_G=0;
}
}
}
//============================接收中断
if(_testbit_(RI))//接收中断
{
RI=0;
temp = SBUF;
switch(RecvState_G)
{
case FSA_INIT :
if(temp==0x8a)
{
PAMA_OK1=1;
//Init3100(); //向电源控制部件发送控制信息
//Send3100(0x80,0x00);Send3100(0x80,0x00); Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x80,0x00);
//Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x80,0x00);
//Send3100(0x80,0x00);
EX1=0;
TH0=0x7f;
TL0=0x00; //定时计数器50ms;
TR0=1; //启动定时计数器0;
ET0=1;
RecvCtr_G=0; //数据长度复位
RecvBuf_G[RecvCtr_G++]=temp;
RecvState_G=FSA_COMMAND;//设置状态位
Recv_flag_G=0; //设置接收位,0为未接收完
Rec2_flag_G=0;
}
break;
case FSA_COMMAND :
if(RecvCtr_G<12) //判断接收数据是否完毕,长度12
{
RecvBuf_G[RecvCtr_G++]=temp;
}
else
{
RecvCtr_G=0; //数据长度复位
RecvState_G=FSA_INIT; //设置状态位
Recv_flag_G=1; //设置接收位,1为接收完
Rec2_flag_G=1;
}
break;
}
}
}
//***********************定时中断响应函数***********************
void timer0(void) interrupt 1 //using 1
{
TR0=0;
if(RecvState_G==FSA_INIT && Recv_flag_G==1)//接收完毕
{
RecvChksum_G=RecvBuf_G[5]+RecvBuf_G[6]+RecvBuf_G[7]+RecvBuf_G[8]+RecvBuf_G[9]+RecvBuf_G[10];//求取校验和
if(RecvChksum_G==RecvBuf_G[11])
{
if(RecvBuf_G[3] == 1 || RecvBuf_G[3] == 3) //判断是否为控制帧命令
{
Res_flag_G=1; //置自动控制模式标志位
wait_back=1;
EX1=1;
Init3100();
Send3100(0x80,0x5a);Send3100(0x80,0x06);Send3100(0x80,RecvBuf_G[2]);Send3100(0x80,0x01);Send3100(0x80,RecvBuf_G[4]); //写数据0x80 00, RTS在Cs上升沿时置高 ,19200bps
Send3100(0x80,RecvBuf_G[5]);Send3100(0x80,RecvBuf_G[6]);Send3100(0x80,RecvBuf_G[7]);Send3100(0x80,RecvBuf_G[8]);Send3100(0x80,RecvBuf_G[9]);
Send3100(0x80,RecvBuf_G[10]);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x86,0x00);
// EX1=1;
TR2=0;
TH2=0x8f;
TL2=0x00;
TR2=1;
Delay1335(0xff);
Delay1335(0xff);
Delay1335(0xff);
if(Rec2_flag_G == 1)
{
TransBuf_G[0]=0x55;//发送接收正确标志
TransBuf_G[1]=0x55;
TransBuf_G[2]=0x55;
TransSize_G=3;
TransState=1;
SBUF=TransBuf_G[0];//启动发送
Rec2_flag_G=0;
}
}
if(RecvBuf_G[3] == 2 && Rec2_flag_G == 1) //判断是否为读取信息帧命令
{
PAMA_OK1=0;
TransBuf_G[0]=0x8a;TransBuf_G[1]=0x0c;TransBuf_G[2]=RecvBuf_G[2];TransBuf_G[3]=0x02;TransBuf_G[4]=0xaa;
TransBuf_G[5]=(b[RecvBuf_G[2]-1])%256;TransBuf_G[6]=(b[RecvBuf_G[2]-1])/256;
TransBuf_G[7]=(d[RecvBuf_G[2]-1])%256;TransBuf_G[8]=(d[RecvBuf_G[2]-1])/256;
TransBuf_G[9]=0x00;TransBuf_G[10]=0x00;TransBuf_G[11]=0x00;TransBuf_G[12]=0x00;
TransSize_G=13;
TransState=1;
SBUF=TransBuf_G[0];//启动发送
Rec2_flag_G=0;
}
}
else//校验码错误
{
if( Rec2_flag_G == 1)
{
TransBuf_G[0]=0xaa;//发送接收错误标志
TransBuf_G[1]=0xaa;
TransBuf_G[2]=0xaa;
Rec2_flag_G=0;
TransSize_G=3;
TransState=1;
SBUF=TransBuf_G[0];//启动发送
}
}
}
else //未接收完毕
{
RecvCtr_G=0;
RecvState_G=FSA_INIT;
}
EX1=1;
}
//***********************定时2中断响应函数***********************
void timer2(void) interrupt 5 //using 1
{ auto_back=auto_back+1;
TR2=0;
TH2=0x00;
TL2=0x00;
TF2=0;
RecvCtr_G1=0;
RecvState_G1=FSA_INIT;
//wait_back_count=wait_back_count+1;
//if(wait_back_count>=30)
// {wait_back_count=0;
if (wait_back==1)
{
Init3100();
Send3100(0x80,0x5a);Send3100(0x80,0x06);Send3100(0x80,RecvBuf_G[2]);Send3100(0x80,0x01);Send3100(0x80,RecvBuf_G[4]); //写数据0x80 00, RTS在Cs上升沿时置高 ,19200bps
Send3100(0x80,RecvBuf_G[5]);Send3100(0x80,RecvBuf_G[6]);Send3100(0x80,RecvBuf_G[7]);Send3100(0x80,RecvBuf_G[8]);Send3100(0x80,RecvBuf_G[9]);
Send3100(0x80,RecvBuf_G[10]);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x86,0x00);
TH2=0x8f;
TL2=0x00;
/* TransBuf_G[0]=0xbb;//发送接收错误标志
TransBuf_G[1]=0xbb;
TransBuf_G[2]=0xbb;
Rec2_flag_G=0;
TransSize_G=3;
TransState=1;
SBUF=TransBuf_G[0];//启动发送//*/
}
// }
//send_wait=1;
if(auto_back>=400)
{set_flag_G=0;
auto_back=0;
Kset_buf_G=0x29;
}
TR2=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -