我用AT89S52,做个加热管控制,程序写完了,经过KEIL编译有两个错误,不知道在哪里,请大家找找。谢谢
程序很乱,请多指教。
#include <AT89s52.h>
#include <math.h>
#include <intrins.h>
#include <string.h>
#include <stdio.h>
struct PID
{ unsigned int setpoint;
unsigned int proportion;
unsigned int integral;
unsigned int derivative;
unsigned int lasterror;
unsigned int preverror;
unsigned int sumerror;
}PID;
struct PID sPID;
#define uchar unsigned char
sbit STS=P2^7;/*AD574转换状态*/
sbit OUT=P2^6; /*PWM输出口*/
sbit OUTA=P0^0;
sbit OUTB=P0^1;
sbit OUTC=P0^2;
void Get_Data(void);/*温度采集*/
signed int Do_Data(signed int Adc_Data[18]);/*数字滤波*/
unsigned int Data_Change(unsigned int Do_Data) ;/*数据温度转换*/
void Pwmout(PWMDATA1);/*PWM输出控制*/
void Reset_Watchdog(void);/*看门狗复位*/
void PIDinit(struct PID*pp);
unsigned int Sensor(void);
unsigned int PIDcalc(struct PID *pp,unsigned int nextpoint);/*PID计算*/
uchar i;
uchar PWMDATA1,PWMDATA2;/*T0,T1记时初值*/
uchar Set_tep;/*设定温度*/
uchar De_Data;
unsigned int Tep;
signed int Adc_Data[18];
static float Trun_Data[250][10];
void main(void) /*主程序*/
{ uchar Pwmb;
unsigned int Rout;
unsigned int Rin;
TMOD=0x11;/*设置T0,T1为16位定时器*/
TH0=0x00;
TL0=0x00;
TR0=1;/*中断初始化*/
ET0=1;
EA=1;
PIDinit(&sPID);
sPID.proportion=1;
sPID.integral=0.5;
sPID.derivative=0.5;
sPID.setpoint=100;
LOOP2:
Get_Data();
Reset_Watchdog();
Do_Data(Adc_Data[18]);
Data_Change(De_Data);
if((Tep-Set_tep)==0)
Get_Data();
Reset_Watchdog();
for(;;)
{Rin=Sensor();
Rout=PIDcalc(&sPID,Rin);
if(Rout<=0)
Pwmb=0;/*加热控制标志*/
else
Pwmb=1;/*加热*/
}
Reset_Watchdog();
if(Pwmb==1)
{ PWMDATA1=(Tep-Set_tep)*1;
Pwmout(PWMDATA1);}
goto LOOP2;
}
void Get_Data(void)/*温度采集子程序*/
{uchar c;
signed int a,b;
OUTC=0;/*CS=0*/
WR=1;RD=0;/*CE=1*/
OUTA=0;/*AD转换*/
Reset_Watchdog();
LOOP1:
if(STS=0)/*转换结束*/
{for(c=0;c++;c<17)
{ OUTA=1;/*读数据*/
OUTB=0;
a=P0&0x01;/*高八位*/
OUTB=1;
b=P0;/*低四位*/
Adc_Data[c]=((a<<8)|b);
}
Reset_Watchdog();
}
else goto LOOP1;
}
signed int Do_Data(signed int A[18])/*数字滤波*/
{ signed int sum;
uchar b;
De_Data=0;b=0;sum=0;
Reset_Watchdog();
for(i=18;i--;i>0)
{ for(b=17;b--;b>0)
{ if(A[i]>=A[b])
{ De_Data=A[i];
A[i]=A[b];
A[b]=De_Data; }
}
Reset_Watchdog();
}
for(i=17;i--;i>1)
{
sum=sum+A[i];
}
sum=sum-A[0]-A[17];
return(De_Data=sum/16);
}
unsigned int Data_Change(unsigned int De_Data) /*数据温度转换*/
{ uchar a,b;
signed char c,d;
int *database;
database=Trun_Data;
Reset_Watchdog();
for(i=0;i++;i<2250)
{ for(a=250;a--;a>0)
{for(b=10;b--;b>0)
{ if(De_Data==(*(database+a)+b))
Tep=a*10+b;
else if(De_Data<(*(database+a)+b+1)&&De_Data>(*(database+a)+b-1))
c=(De_Data-(*(database+a)+b-1))/((*(database+a)+b-1)+5000);
d=(*(database+a)+b+1)/((*(database+a)+b+1)+5000)-(*(database+a)+b-1)/((*(database+a)+b-1)+5000);
return Tep=250*(a/b)-50;
}
}
}
Reset_Watchdog();
}
void PIDinit(struct PID*pp) /*PID初始化*/
{ memset ( pp,0,sizeof(struct PID));
}
unsigned int Sensor(void)
{ return 100;
}
unsigned int PIDcalc(struct PID*pp,unsigned int nextpoint)/*PID计算*/
{ unsigned int derror,error;
Reset_Watchdog();
error=pp->setpoint-nextpoint;/*偏差*/
pp->sumerror+=error;/*积分*/
derror=pp->lasterror-pp->preverror;/*当前微分*/
pp->preverror=pp->lasterror;
pp->lasterror=error;
return(pp->proportion*error/*比例项*/
+pp->integral*pp->sumerror/*积分项*/
+pp->derivative*derror);/*微分项*/
}
void pwmout(PWMDATA1) /*PWM输出控制*/
{ uchar pwmf,a,b;/*pwmf PWM输出标志位*/
Reset_Watchdog();
a=PWMDATA1*10;
for(i=a;i--;i>0)
{TH0=0x15B0&0xF0;
TL0=0x15B0&0x0F;} /*60MS*/
TR0=1;
pwmf=1;
OUT=1;
Reset_Watchdog();
if(pwmf==1)
OUT=0;
TR0=0;
PWMDATA2=(250-PWMDATA1)*10;
for(b=PWMDATA2;b--;b>0)
{TH0=0x15B0&0xF0;
TL0=0x15B0&0x0F;} /*60MS*/
TR0=1;
pwmf=1;
OUT=1;
}
void Reset_Watchdog(void) /*看门狗启动及喂狗*/
{ WDTRST=0x1E;
WDTRST=0xE1;
}
Trun_data[][]={ {80.31,79.91,79.51,79.12,78.72,78.32,77.92,77.52,77.12,76.73},
{84.27,93.88,83.48,83.08,82.69,82.29,81.9,81.5,81.1,80.7},
{92.16,91.77,91.37,90.38,90.59,90.19,89.8,89.4,89.01,88.62},
{96.09,95.69,95.3,94.91,94.52,94.12,93.73,93.34,92.95,92.55},
{100,99.61,99.22,98.83,98.44,98.04,97.65,97.26,96.87,96.48},
{100,100.39,100.78,101.17,101.56,101.95,102.34,102.73,103.12,103.51},
{103.9,104.29,104.68,105.07,105.46,105.85,106.24,106.63,107.02,107.4},
{107.79,108.18,108.57,108.96,109.34,109.73,110.12,110.51,110.9,111.28},
{111.67,112.06,112.45,112.83,113.22,113.61,113.99,114.38,114.77,115.15},
{115.54,115.92,116.31,116.7,117.08,117.47,117.85,118.24,118.62,119.01},
{119.4,119.78,120.16,120.55,120.93,121.32,121.7,122.09,122.47,122.86},
{123.24,123.62,124.01,124.39,124.77,125.16,125.54,125.92,126.31,126.69},
{130.89,131.27,131.46,135.84,136.22,136.6,136.98,137.36,137.74,138.12},
{134.7,135.08,135.46,135.84,136.22,136.6,136.98,137.36,137.74,138.12},
{138.5,138.88,139.26,139.64,140.02,140.4,140.77,141.15,141.53,141.91},
{142.29,142.66,143.04,143.42,143.8,144.18,144.55,144.93,145.31,145.68},
{146.06,146.44,146.82,147.19,147.57,147.94,148.32,148.7,149.07,149.44},
{149.82,150.2,150.70,15095,151.33,151.7,152.08,152.45,152.83,153.2},
{153.70,153.95,154.32,154.7,155.07,155.45,155.82,156.2,156.57,156.94},
{161.04,161.42,161.79,162.16,162.53,162.9,163.28,163.65,164.02,164.39},
{164.76,165.13,165.5,165.88,166.24,166.62,166.99,167.32,167.73,168.1},
{168.47,168.84,169.21,169.70,169.95,170.32,170.68,171.05,171.42,171.79},
{172.16,172.53,172.9,173.27,173.64,174,174.37,174.74,175.11,175.48},
{175.84}};