1、基于PID的水温控制系统#include#include#include#include#define Z 55sbit P27=P27;sbit temp=P20;sbit P21=P21;sbit P22=P22;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; /占空比显示位uc
2、har 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; delay10
3、us(20);/延时266us。 void writedata(uchar dat)/向ds18b20写数据。 uchar i; for(i=0;i=1; /先写低位。 uchar readdata()/从ds18b20读数据。 uchar dat; uchar i; for(i=0;i=1;/ 先读低位。 temp=1; if(temp) dat=dat|0x80; delay10us(10);/延时136us; temp=1; return(dat); void readtemperature() uchar temperh,temperl; rst18b20(); writedata(0
4、xcc);/跳过读rom命令直接给器件发命令。 writedata(0x44);/启动ds18b20读取温度。 rst18b20(); /必须二次复位。 writedata(0xcc); writedata(0xbe); temperl=readdata();/读取温度低字节。 temperh=readdata();/读取温度高字节。 tvalue=temperh; tvalue=8; tvalue=tvalue|temperl;/组成16位合成字。 if(tvalue111) xx=0; clrscreen(); xyset();/建立坐标系; void ruptinte0()interru
5、pt 0 /按键中断子函数 P2=0xff; if(P2!=0xff) delay(8); if(P2!=0xff) switch(P2) case(0xfd):set_temp+;if(set_temp100);temp=0;break; case(0xfb):set_temp-;if(set_temp100);temp=0;break; default:break; void settempdeal() shi=set_temp/10+0x30; ge=set_temp%10+0x30;void ukdeal()/显示控制电压子函数 z_uk=(uint)uk; uk_qian=z_uk/
6、1000; uk_bai=z_uk%1000/100; uk_shi=z_uk%1000%100/10; uk_ge=z_uk%10;void qdeal()/显示占空比子函数 uint x; x=(uint)(bfb*100.0); q_ge=x/100; q_shif=x%100/10; q_baif=x%10;void main() init(); rst(); setbacklight(); clrscreen(); cs=0; zibigset(0x11); send(0x81);/设置ASCII字符类型; send(0x01);/6X10字体,字符为黑色; send(0x83);/
7、设置绘图色; send(1);/黑色; xianhan(16,4,table1);/水 xianhan(32,4,table2);/温 xianhan(48,4,table3);/控 xianhan(62,4,table4);/制 xianhan(78,4,table5);/系 xianhan(94,4,table6);/统 xianhan(24,38,table7); xianhan(40,38,table8); asciiset(56,38,0x3a);/显示冒号; xianhan(64,38,table9); xianhan(80,38,table0); delay(500); clrs
8、creen(); xyset();/建立坐标系; EA=1; while(1) settempdeal(); /预设值处理 ukdeal();/控制电压值处理 if(temperature=set_temp) P27=0; TR1=0; else if(temperature=(set_temp-4) calcpid(set_temp,temperature); bfb=(uk/220.0); qdeal(); /占空比值处理 if(bfb=1.0) TR1=0; P27=1; else if(bfb1.0) d_uk=kp*(ek-ek1)+kd*(ek-2*ek1+ek2); else d
9、_uk=kp*(ek-ek1)+ki*ek+kd*(ek-2*ek1+ek2); uk=d_uk+uk1; ek2=ek1; ek1=ek; uk1=uk; */*void calcpiiid(float s_temp,float now_temp)/遇限削弱积分法; ukmax=5.0*(kp+kd); ek=s_temp-now_temp; d_uk=kp*(ek-ek1)+kd*(ek-2*ek1+ek2); if(uk1=ukmax) if(ek0); else d_uk+=ki*ek; else if(uk1=ukmax) if(ek0); else d_uk+=I*ek; uk=u
10、k1+d_uk; ek2=ek1; ek1=ek; uk1=uk; */void calcpid(float s_temp,float now_temp)/增量式 /ukmax=5.0*(kp+ki+kd); ek=s_temp-now_temp; d_uk=kp*(ek-ek1)+ki*ek+kd*(ek-2*ek1+ek2); uk=d_uk+uk1; ek2=ek1; ek1=ek; uk1=uk; #include#define uint unsigned int#define uchar unsigned charuchar code table1=水;uchar code tabl
11、e2=温;uchar code table3=控;uchar code table4=制;uchar code table5=系;uchar code table6=统;uchar code table7=作;uchar code table8=者;uchar code table9=李;uchar code table0=奕;uchar code table00=度;uchar code table01=时;uchar code table02=间;sbit cs=P10;sbit sda=P11;sbit sck=P13;sbit crst=P14;void delay10us(uint
12、n) do _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); while(-n);void delay(uint n) do delay10us(131); while(-n);void send(uchar da) uint i; for(i=0;i8;i+) sck=0; sda=da&0x80; sck=1; da=1; void rst() sck=1; cs=1; crst=0; delay(3); crst=1; delay(10);void clrscreen() cs=0; send(0x80); cs=1;void asciiset(u
13、char x,uchar y,uchar a) /写阿斯科码; cs=0; send(0x07); send(x); send(y); send(a); void setbacklight() cs=0; send(0x8a); send(110); cs=1; void bitflash()/绘制图像; uchar i,j; send(0x0e); send(0); send(0); send(104); send(46); for(i=0;i46;i+) for(j=0;j13;j+) send(table1i*13+j); void pointset(uchar x,uchar y) /
14、描点; cs=0; send(0x01); send(x); send(y); void danwei() /描坐标点; uint i,j; for(j=20;j14;i-=10) pointset(9,i); void zibigset(uchar x) /设置字体大小 cs=0; send(0x82);/设置汉字库类型; send(x);/16X16字体,字符为黑色; void xianhan(uchar x,uchar y,uchar *p)/写汉字; uchar i; cs=0; send(0x08); send(x); send(y); for(i=0;i2;i+) send(pi)
15、; void xyset() /绘制坐标系 cs=0; send(0x02);/绘制x,y横纵坐标; send(10);/横坐标起点为10,终点为111; send(55); send(111); send(55); send(0x02); send(10); send(55);/纵坐标起点为55,终点8; send(10); send(3); pointset(9,4);/绘制箭头; pointset(8,5); pointset(11,4); pointset(12,5); pointset(110,54); pointset(110,56); pointset(109,53); pointset(109,57); danwei();/绘制单位坐标点; asciiset(2,0,T); asciiset(120,54,t); zibigset(0x01); xianhan(66,36,table01); xianhan(78,36,table02); xianhan(16,0,table2); xianhan(28,0,table00);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1