基于PID的水温控制系统

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#include

#include<04.h>

#define Z 55

sbit P27=P2^7;

sbit temp=P2^0;

sbit P21=P2^1;

sbit P22=P2^2;

uint nnn;

uchar t_min,t_minf,t_sec,t_ge,shii,gee,shiff;

uchar uk_qian,uk_bai,uk_shi,uk_ge;//uk显示位

uint time;

uint z_uk;

uchar w_shi,w_ge,w_shif,w_baif; //实际温度数字显示;uchar q_ge,q_shif,q_baif; //占空比显示位

uchar idata bai,shi,ge; //预设温度数字显示;

bit w_fh;//实际值符号位;

uint tvalue; //10倍实际温度。

uint p=20000;

uint f,g;//

float idata bfb;//占空比设定。

uchar set_temp=60;

float idata temperature;

uchar idata count=1;

uchar idata cont=500;

uchar idata xx;

void rst18b20()

{

temp=1;

delay10us(1);

temp=0;

delay10us(70);//延时916us。

temp=1;

delay10us(20);//延时266us。

}

void writedata(uchar dat)//向ds18b20写数据。

{

uchar i;

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

{

temp=0;

temp=dat&0x01;

delay10us(10);

temp=1;

dat>>=1; //先写低位。

}

}

uchar readdata()//从ds18b20读数据。

{

uchar dat;

uchar i;

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

{

temp=0;

dat>>=1;// 先读低位。

temp=1;

if(temp)

dat=dat|0x80;

delay10us(10);//延时136us;

temp=1;

}

return(dat);

}

void readtemperature()

{

uchar temperh,temperl;

rst18b20();

writedata(0xcc);//跳过读rom命令直接给器件发命令。

writedata(0x44);//启动ds18b20读取温度。

rst18b20(); //必须二次复位。

writedata(0xcc);

writedata(0xbe);

temperl=readdata();//读取温度低字节。

temperh=readdata();//读取温度高字节。

tvalue=temperh;

tvalue<<=8;

tvalue=tvalue|temperl;//组成16位合成字。

if(tvalue<0x0fff) //是否为正数。

w_fh=0;

else //负数转换程序。

{

w_fh=1;

tvalue=~tvalue+1;

}

temperature=tvalue*0.0625;

tvalue=(tvalue*6.25);//温度转换,强制转换成整形数。

w_shi=tvalue/1000;//十位

w_ge=tvalue%1000/100;//个位

w_shif=tvalue%100/10;//shifen位

w_baif=tvalue%10;//baifenwei }

void init()

{

P27=1;

TMOD=0x11;

TH0=0x3c; //50ms采样一次;

TL0=0xb0;

//TH1=0x9c;

//TL1=0x9c;

TH1=(65536-1000)/256;

TL1=(65536-1000)%256;

EX0=1;

IT0=1;

ET0=1;

TR0=1;

ET1=1;

TR1=1;

}

void rupttime1()interrupt 3

{

/*if(--f==0)

{

P27=0;

}

if(--p==0)

{

P27=1;

p=20000;

f=g;

}*/

TH1=(65536-1000)/256;

TL1=(65536-1000)%256;

nnn++;

if(nnn==g){P27=0;}

if(nnn==1000){P27=1;nnn=0;}

}

void rupttime0()interrupt 1

{

uchar min,sec;

TH0=0x3c; //50ms采样一次;

TL0=0xb0;

相关文档
最新文档