[问答] 温度控制PID系统中,继电器不工作,电路图和程序如下,谢谢啦~

[复制链接]

实习生

发表于 2018-6-1 15:41:34   397 查看 1 回复 显示全部楼层 倒序浏览
分享

#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;

}



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

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

标签:单片机 温度控制 PID 继电器 温度传感器

工程师

发表于 2018-6-10 10:23:11  
谢谢楼主的分享学习了
回复

点赞 举报

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

关闭

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

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

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

项目|工程师创意

招聘|求职}工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

PIC单片机论坛

DSP论坛

瑞萨单片机论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

工程资源中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

电子展览展会专区

芯片求购|供应发布区