发 帖  
[问答] 温度控制PID系统中,继电器不工作,电路图和程序如下,谢谢啦~
641 单片机 温度控制 PID 继电器 温度传感器
分享

#include

#include

#include

#include

#define  uchar  unsigned  char

#define  uint   unsigned  int

sbit  DATA = P1^1; //DS18B20接入口

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极字型码

int temp;  //温度值

int ss;                //中间的一个变量

int dd;

int j;

uchar data b;//定时器中断次数

uchar data buf[4];//字型显示中间变量

int alarmH=400;          //默认报警值

int alarmL=-500;

//定义开关的接入口

sbit  k1=P2^5;//+

sbit  k2=P2^6;//-

sbit  k3=P2^7;//确认

sbit  bell=P1^0;


sbit  Red=P1^6;                                //nouse

sbit output=P3^5;

unsigned int s;

unsigned char high_time,low_time,count=0;

bit set=0;

bit Flag=0;

int n;

unsigned char set_temp;

struct PID {

unsigned int  SetPoint; // 设定目标 Desired Value

unsigned int  Proportion; // 比例常数 Proportional Const

unsigned int  Integral; // 积分常数 Integral Const

unsigned int  Derivative; // 微分常数 Derivative Const

unsigned int  LastError; // Error[-1]

unsigned int  PrevError; // Error[-2]

unsigned int  SumError; // Sums of Errors

};

struct PID spid; // the control PID

unsigned int rout;//the reaction of PID

unsigned int rin;//the feedback of PID

//函数的声明区

void key_to1();                                //键盘++

void key_to2();                           //键盘--

void delay(uint);                //延时

void key();                                 //按键扫描子程序

void Show();                         //显示

//函数的定义区

/*延时子函数*/

void delay(uint num)

{

        while(num--) ;


void Show()

{            if(temp>=0)

                        display();//显示函数

                if(temp<0)

                        display00();

}

void PIDInit(struct PID *pp)         //jie gou  bian liang chu shi hua

{

        memset(pp,0,sizeof(struct PID));

}


unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )

{

        unsigned int dError,Error;

        Error=pp->SetPoint-NextPoint; // 偏差EK,设定值减去当前采样值

        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); // 微分项

}

compare_temper()

{

        unsigned char i;

        if(set_temp>temp)

        {

                if(set_temp-temp>1)

                {

                        high_time=100;

                        low_time=0;

                }

                else

                {

                        for(i=0;i<10;i++)

                        {

                         int ReadTemperature();

                         rin=s;

                         rout=PIDCalc(&spid,rin);

                        }

                        if(        high_time<=100)

                                high_time=(unsigned char)(rout/800);

                        else

                                high_time=100;

                                low_time=(100-high_time);

                }

        }

        else if(set_temp<=temp)

        {

         if(temp-set_temp>1)

         {

                high_time=0;

                low_time=100;

         }

         else

         {

          for(i=0;i<10;i++)

          {

                   int ReadTemperature();

                   rin=s;

                   rout=PIDCalc( &spid, rin );

          }

          if(high_time<100)

                   high_time=(unsigned char) (rout/10000);

                else

                         high_time=0;

                         low_time=(100-high_time);

         }

   }

}


void  main()

{        

    TCON=0x01;

    TMOD=0X01;        

        TH0=(65536-5000)/256;

        TL0=(65536-5000)%256;

        EA=1;

        ET0=1;

        TR0=1;

        EX0=1;

        

        for(n=0;n<500;n++)//显示启动LOGo"- - - -"

        {bell=0;logo();}

         Red=0;

        while(1)

        {

            key();

                ss=ReadTemperature();

        Show();

                alarm();

                if(Flag==1)

                {bell=!bell;}  //蜂鸣器滴滴响

                else {bell=0;}        

        }        

}

void sever_T1() interrupt        1 using 1  //control the turn of electict

{

        if(++count<=(high_time))

                output=1;

        else if(count<=100)

        {

                output=0;

        }

        else

                count=0;

                TH0=0X2f;

                TL0=0Xe0;

}



void time0(void) interrupt 1 using 1  //每隔10ms执行一次此子程序

{        TH0=(65536-5000)/256;

        TL0=(65536-5000)%256;        

        temp=ss;

}



0

恒温燃气热水器硬件设计.PDF

下载积分: 积分 -1 分

143.3 KB, 下载次数: 13, 下载积分: 积分 -1 分

2018-6-1 15:41:34   评论 邀请回答
1个回答
谢谢楼主的分享学习了
2018-6-10 10:23:11 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

提问题
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表