700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 温控系统c语言源代码 模糊PID控制温控系统设计C语言程序代码

温控系统c语言源代码 模糊PID控制温控系统设计C语言程序代码

时间:2020-11-28 06:15:17

相关推荐

温控系统c语言源代码 模糊PID控制温控系统设计C语言程序代码

《模糊PID控制温控系统设计C语言程序代码》由会员分享,可在线阅读,更多相关《模糊PID控制温控系统设计C语言程序代码(17页珍藏版)》请在人人文库网上搜索。

1、模糊PID控制温控系统仿真设计C程序代码#in clude#defi ne uchar un sig ned char#defi ne uint un sig ned int#defi ne PULSE 200#defi ne number 0.035sbit SDO = P2A0;sbit SDI = P2A1;sbit CS = P2A2;sbit CLK = P2A3;sbit EOC = P2A4;sbit RS = P2A5;sbit RW = P2A6;sbit EN = P2A7;sbit KEY仁 P3A0;sbit KEY2=卩3八1;sbit KEY3=卩3八2;sbit 。

2、KEY4=卩3八3;sbit KEY5=卩3八4;sbit IN1 = P3A5;sbit IN2 = P3A6;sbit ENA = P3A7;uchar flag;uchar flag_start;float S_temp=60.0;float P_temp=20.0;float Kp;float Ki;float Kd;float Err=0.0;float Last_Err=0.0;float D_Err=0.0;float Sum_Err=0.0;float U=0.0;/*函数功能:延时*/void delay_ms(uchar z)uchar i;uchar j;for(i=z;。

3、 iO;i-)for(j=360;j0;j-);void delay_us(uchar z)uchar i;for(i=z; i0;i-);void LCD_WriteData(uchar Dat) _RS = 1;P1 = Dat;delay_us(10);EN = 1;delay_us(10);EN = 0;void LCD_WriteCOM(uchar com) _RS = 0;P1 = com;delay_us(10);EN = 1;delay_us(10);EN = 0;void Show_Num(uchar x,uchar y,uchar n, float num) _uchar 。

4、a3;uchar i;uint Temp;Temp=(i nt)num;for(i=0;i 0;i-)LCD_WriteData(ai-1+0x30);void Show_Ki(uchar num _Ki)uchar Temp; num_Ki=Ki*100; Temp=(uchar) num _Ki; Show_Num(10,2,1,Temp%10); Temp=Temp/10;Show_Num(9,2,1,Temp%10);Temp=Temp/10;Show_Num(7,2,1,Temp);_void Show_char(uchar x,uchar y,uchar ch)_if(y%2 = 。

5、1)LCD_WriteCOM(0x80+x);elseLCD_WriteCOM(0x80+0x40+x); LCD_WriteData(ch); _ void LCDni t(void) _RW = 0;EN = 0;LCD_WriteCOM(0x38);LCD_WriteCOM(0x0c);LCD_WriteCOM(0x06);LCD_WriteCOM(0x01); /*函数功能:显示函数*void LCD_display(void) _Show_char(1,1,T); delay_us(10); Show_char(0,1,卩);delay_us(10);Show_char(1,1,T)。

6、;delay_us(10);Show_char(2,1,:);delay_us(10);Show_Num(3,1,3,P_temp);delay_us(10);Show_char(10,1,S);delay_us(10);Show_char(11,1,T);delay_us(10);Show_char(12,1,:);delay_us(10);Show_Num(13,1,3,S_temp);delay_us(10);Show_char(0,2, P);delay_us(10);Show_char(1,2,:);delay_us(10);Show_Num(2,2,2,Kp);delay_us(1。

7、0);Show_char(5,2,T);delay_us(10);Show_char(6,2,:);delay_us(10);Show_char(8,2,.);delay_us(10);Show_Ki(Ki);delay_us(10);Show_char(12,2,D);delay_us(10);Show_char(13,2,:);delay_us(10);Show_Num(14,2,2,Kd); delay_us(10); _/* 函数功能:定时器2初始化 */ void Timer2ni t() _RCAP2H =(65536-300)/256;RCAP2L =(65536-300)%25。

8、6;TH2 = RCAP2H;TL2 = RCAP2L;ET2 = 1;TR2 = 1;EA = 1;/* 函数功能:键盘扫描,调整设置温度 */ void key_sca n(v oid) _if(KEY1=0)delay_ms(1);if(KEY1=0)S_temp=S_temp+1; if(S_temp=200) S_temp=200;while(!KEY1);if(KEY2=0)delay_ms(1);if(KEY2=0)if(S_temp0) S_temp=S_temp-1;else if(S_temp=10) S_temp=S_temp-10;while(!KEY4); if(KE。

9、Y5=0) delay_ms(1); if(KEY5=0) flag_start=1; while(!KEY5); /*函数功能:PID的计算*/void PID_Calculate() _Err = S_temp - P_temp; Sum_Err += Err; D_Err = Err - Last_Err; Last_Err = Err; U=Kp*Err+Ki*Sum_Err+Kd*D_Err; U=( in t)U;if(U=0) if(U=200) U=200;flag=1;elseU=-U;if(U=200)U=200;flag=0;函数功能:PID参数Kp的计算float fu。

10、zzy_kp(float e, float ec)e,ec 表示误差,误差变化率float Kp_calcu;uchar nu m,pe,pec;float code eRule7=-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0;误差 E 的模糊论域float code ecRule7=-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0; /误差变化率 EC 的模糊论 域float eFuzzy2=0.0,0.0;float ecFuzzy2=0.0,0.0;float code kpRule4=0.0,8.0,16.0,24.0;float KpFuzzy4=0.0,。

11、0.0,0.0,0.0;in t code KpRule77=3,3,3,3,3,3,3,/隶属于误差E的隶属程度/隶属于误差变化率EC的隶属程度/Kp的模糊子集/隶属于Kp的隶属程度/Kp的模糊控制表222,2,1,2,2,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,0,1,0,0,1,0,0,1,0,1,0,0,2,3,3,3,3,3,3,3;/*误差E隶属函数描述*/if(e2)PORT = port; return AD_value; _float AD_deal(void) _ui nt AD_value;float temp;AD_value = read_tlc2。

12、543(0x00); temp = AD_value* nu mber; return temp;主函数*void ma in (void)uchar AD_value=0; flag=0;flag_start=0;ENA=1;IN 仁0;IN2=0;LCDni t(); LCD_display(); Timer2_I ni t();while(1) if(flag_start=0) _key_sca n();Show_Num(13,1,3,S_temp);Show_Num(3,1,3,P_temp); 一 一else if(flag_start=1) P_temp=AD_deal();Sho。

13、w_Num(3,1,3,P_temp); PID_Calculate();/E量化因子5Kp=fuzzy_kp(Err/5,D_Err);Ki=fuzzy_ki(Err/5,D_Err);Kd=fuzzy_kd(Err/5,D_Err);Show_Num(2,2,2,Kp); Show_Ki(Ki);Show_Num(14,2,2,Kd); key_sca n();Show_Num(13,1,3,S_temp); void timer2() in terrupt 5 定时器2中断*/static uchar nu m1=0;TF2 = 0;nu m1+;if(n um1PULSE)num仁 0;ENA=1。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。