加入收藏 设为首页 帮助中心
 
论坛首页
用户登录 | 用户注册 | 最新悬赏 | 最新贴子 | 会员中心 | 贴子搜索 | 网站地图 | 帮助中心 | 联系我们
站内搜索:
现在位置 > 维库电子开发网论坛 > 单片机 > 51系列 > 程序改错`~
帖子主题: 程序改错`~
你还没有登录,无法发表回复,请首先 登录.. [注 册]
积分:15 majorer149
发表于:2008-10-10 19:06:00 楼主
级别:一星
积分:15分
注册:2008年10月10日

我用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}};

 
积分:965 minar
发表于:2008-10-11 10:16:00 1 楼
级别:一钻
版主
积分:965分
注册:2008年08月05日
看起来有点乱,没有图很难看的,还要有错误提示  
积分:15 majorer149
发表于:2008-10-12 17:39:00 2 楼
级别:一星
积分:15分
注册:2008年10月10日
 Do_Data(Adc_Data[18]); 好象指针转换出错;Adc_Data[c]=((a&lt;&lt;8)|b);
什么左边不是左值。。给的条件不充分。。偶明天可一上图,不过能看下怎么回事吗
 
积分:15 majorer149
发表于:2008-10-13 8:16:00 3 楼
级别:一星
积分:15分
注册:2008年10月10日

.\卤素加热管控制.c(60):错误 C214:illegal pointer converdion
.\卤素加热管控制.c(95):错误C213:left side of asn-op not an lvalue

请大家帮帮忙,谢谢!~

   

 
快速回复:
用户名: 密码:  验证码,看不清楚?请点击刷新验证码 注册新帐号?
上传图片格式(jpg/gif/png)和文件格式(rar/pdf)
 
 
网站简介s广告服务网站地图帮助信息联系方式问题报告
Copyright 2007 - 2008 bbs.weeqoo.com
Powered By weeqoo Version 8.0.0XML