p30控制喇叭c语言程序,模糊PID自动控制控制温控系统设计C语言知识程序代码.doc...

c8da8f5a7cda2d62dda9e5a200b168b9.gif模糊PID自动控制控制温控系统设计C语言知识程序代码.doc

-//********************************************************************模糊PID控制温控系统仿真设计C程序代码********************************************************************/includereg52.hdefine uchar unsigned chardefine uint unsigned intdefine PULSE 200define number 0.035 sbit SDO P20; sbit SDI P21;sbit CS P22;sbit CLK P23;sbit EOC P24;sbit RS P25; sbit RW P26;sbit EN P27;sbit KEY1 P30;sbit KEY2 P31; sbit KEY3 P32;sbit KEY4 P33;sbit KEY5 P34; sbit IN1 P35; sbit IN2 P36;sbit ENA P37;uchar flag; uchar flag_start;float S_temp60.0; float P_temp20.0; float Kp;float Ki;float Kd;float Err0.0;float Last_Err0.0;float D_Err0.0;float Sum_Err0.0;float U0.0;/****************************** 函数功能延时******************************/void delay_msuchar z uchar i; uchar j; foriz;i0;i-- forj360;j0;j--; void delay_usuchar z uchar i; foriz;i0;i--;void LCD_WriteDatauchar Dat RS 1; P1 Dat; delay_us10; EN 1; delay_us10; EN 0;void LCD_WriteCOMuchar com RS 0; P1 com; delay_us10; EN 1; delay_us10; EN 0;void Show_Numuchar x,uchar y,uchar n,float num uchar a3; uchar i; uint Temp; Tempintnum; fori0;in;i ai Temp10; Temp Temp/10; ify2 1 LCD_WriteCOM0 x80x; else LCD_WriteCOM0 x800 x40x; forin;i0;i-- LCD_WriteDataai-10 x30; void Show_Kiuchar num_Kiuchar Temp;num_KiKi*100;Tempucharnum_Ki; Show_Num10,2,1,Temp10;TempTemp/10;Show_Num9,2,1,Temp10; TempTemp/10;Show_Num7,2,1,Temp;void Show_charuchar x,uchar y,uchar ch ify2 1 LCD_WriteCOM0 x80x; else LCD_WriteCOM0 x800 x40x; LCD_WriteDatach; void LCD_Initvoid RW 0; EN 0; LCD_WriteCOM0 x38; LCD_WriteCOM0 x0c; LCD_WriteCOM0 x06; LCD_WriteCOM0 x01;/*********************************** 函数功能显示函数*************************************/void LCD_displayvoid Show_char1,1,T; delay_us10; Show_char0,1,P; delay_us10; Show_char1,1,T; delay_us10; Show_char2,1,; delay_us10; Show_Num3,1,3,P_temp; delay_us10; Show_char10,1,S; delay_us10; Show_char11,1,T; delay_us10; Show_char12,1,; delay_us10; Show_Num13,1,3,S_temp; delay_us10; Show_char0,2,P; delay_us10; Show_char1,2,; delay_us10; Show_Num2,2,2,Kp; delay_us10; Show_char5,2,I; delay_us10; Show_char6,2,; delay_us10; Show_char8,2,.; delay_us10; Show_KiKi; delay_us10; Show_char12,2,D; delay_us10; Show_char13,2,; delay_us10; Show_Num14,2,2,Kd; delay_us10;/************************************ 函数功能定时器2初始化*************************************/void Timer2_Init RCAP2H 65536-300/256; RCAP2L 65536-300256; TH2 RCAP2H; TL2 RCAP2L; ET2 1; TR2 1; EA 1;/************************************* 函数功能键盘扫描,调整设置温度****************************************/void key_scanvoidifKEY10 delay_ms1;ifKEY10S_tempS_temp1;ifS_temp200S_temp200;whileKEY1;ifKEY20delay_ms1;ifKEY20ifS_temp0S_tempS_temp-1;else ifS_temp0S_temp0;whileKEY2;ifKEY30 delay_ms1;ifKEY30ifS_temp190S_tempS_temp10;whileKEY3; ifKEY40 delay_ms1;ifKEY40ifS_temp10S_tempS_temp-10;whileKEY4;ifKEY50 delay_ms1;ifKEY50flag_start1; whileKEY5;/************************************ 函数功能PID的计算**********************************/void PID_Calculate Err S_temp - P_temp; Sum_Err Err; D_Err Err - Last_Err; Last_Err Err; UKp*ErrKi*Sum_ErrKd*D_Err; UintU; ifU0 ifU200U200;flag1; else U-U;ifU200U200;flag0; /*********************************************** 函数功能PID参数Kp的计算 ************************************************/ float fuzzy_kpfloat e, float ec//e,ec,表示误差,误差变化率 float Kp_calcu;uchar num,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 eFuzzy20.0,0.0; //隶属于误差E的隶属程度float ecFuzzy20.0,0.0; //隶属于误差变化率EC的隶属程度float code kpRule40.0,8.0,16.0,24.0;//Kp的模糊子集float KpFuzzy40.0,0.0,0.0,0.0;//隶属于Kp的隶属程度int code KpRule77 //Kp的模糊控制表3,3,3,3,3,3,3,2,2,2,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隶属函数描述*****/ ifeeRule0eFuzzy0 1.0; pe 0;else ifeRule0e pe 0;else ifeRule1e pe 1;else ifeRule2e pe 2; else ifeRule3e pe 3; else ifeRule4e pe 4;else ifeRule5e pe 5;elseeFuzzy0 0.0;pe 5; eFuzzy1 1.0 - eFuzzy0;/*****误差变化率EC隶属函数描述*****/ ifececRule0ecFuzzy0 1.0;pec 0;else ifecRule0ec pec 0 ;else ifecRule1ec pec 1;else ifecRule2ec pec 2 ; else ifecRule3ec pec3; else ifecRule4ec pec4; else ifecRule5ec pec5; elseecFuzzy0 0.0;pec 5;ecFuzzy1 1.0 - ecFuzzy0; /*********查询模糊规则表*********/num KpRulepepec;KpFuzzynum eFuzzy0*ecFuzzy0;num KpRulepepec1;KpFuzzynum eFuzzy0*ecFuzzy1;num KpRulepe1pec;KpFuzzynum eFuzzy1*ecFuzzy0;num KpRulepe1pec1;KpFuzzynum eFuzzy1*ecFuzzy1;/*********加权平均法解模糊*********/ Kp_calcuKpFuzzy0*kpRule0KpFuzzy1*kpRule1KpFuzzy2*kpRule2KpFuzzy3*kpRule3;returnKp_calcu;/*********************************************** 函数功能PID参数Ki的计算 ************************************************/ float fuzzy_kifloat e, float ec float Ki_calcu;uchar num,pe,pec;float code eRule7-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0;float code ecRule7-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0;float eFuzzy20.0,0.0;float ecFuzzy20.0,0.0; float code kiRule40.00,0.01,0.02,0.03; float KiFuzzy40.0,0.0,0.0,0.0;int code KiRule77 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,3,3,3,3,3,3,3; /*****误差隶属函数描述*****/ifeeRule0eFuzzy0 1.0; pe 0;else ifeRule0e pe 0;else ifeRule1e pe 1;else ifeRule2e pe 2; else ifeRule3e pe 3; else ifeRule4e pe 4;else ifeRule5e pe 5;elseeFuzzy0 0.0;pe 5; eFuzzy1 1.0 - eFuzzy0;/*****误差变化隶属函数描述*****/ ifececRule0ecFuzzy0 1.0;pec 0;else ifecRule0ec pec 0 ;else ifecRule1ec pec 1;else ifecRule2ec pec 2 ; else ifecRule3ec pec3; else ifecRule4ec pec4; else ifecRule5ec pec5; elseecFuzzy0 0.0;pec 5;ecFuzzy1 1.0 - ecFuzzy0; /***********查询模糊规则表***************/num KiRulepepec;KiFuzzynum eFuzzy0*ecFuzzy0;num KiRulepepec1;KiFuzzynum eFuzzy0*ecFuzzy1;num KiRulepe1pec;KiFuzzynum eFuzzy1*ecFuzzy0;num KiRulepe1pec1;KiFuzzynum eFuzzy1*ecFuzzy1;/********加权平均法解模糊********/ Ki_calcuKiFuzzy0*kiRule0KiFuzzy1*kiRule1KiFuzzy2*kiRule2KiFuzzy3*kiRule3; returnKi_calcu;/*********************************************** 函数功能PID参数Kd的计算 ************************************************/ float fuzzy_kdfloat e, float ec float Kd_calcu;uchar num,pe,pec; float code eRule7-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0;float code ecRule7-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0;float eFuzzy20.0,0.0;float ecFuzzy20.0,0.0; float code kdRule40.0,1.0,2.0,3.0;float KdFuzzy40.0,0.0,0.0,0.0;int code KdRule773,3,3,2,2,2,2,2,2,2,1,1,1,1,1,1,2,1,1,2,1,1,1,0,1,0,1,1,1,1,0,0,0,1,1,2,2,1,0 ,1,1,1,3,3,3,3,2,3,2; /*****误差隶属函数描述*****/ifeeRule0eFuzzy0 1.0; pe 0;else ifeRule0e pe 0;else ifeRule1e pe 1;else ifeRule2e pe 2; else ifeRule3e pe 3; else ifeRule4e pe 4;else ifeRule5e pe 5;elseeFuzzy0 0.0;pe 5; eFuzzy1 1.0 - eFuzzy0; /*****误差变化隶属函数描述*****/ ifececRule0ecFuzzy0 1.0;pec 0;else ifecRule0ec pec 0 ;else ifecRule1ec pec 1;else ifecRule2ec pec 2 ; else ifecRule3ec pec3; else ifecRule4ec pec4; else ifecRule5ec pec5; elseecFuzzy0 0.0;pec 5;ecFuzzy1 1.0 - ecFuzzy0; /***********查询模糊规则表*************/num KdRulepepec;KdFuzzynum eFuzzy0*ecFuzzy0;num KdRulepepec1;KdFuzzynum eFuzzy0*ecFuzzy1;num KdRulepe1pec;KdFuzzynum eFuzzy1*ecFuzzy0;num KdRulepe1pec1;KdFuzzynum eFuzzy1*ecFuzzy1;/********加权平均法解模糊********/ Kd_calcuKdFuzzy0*kdRule0KdFuzzy1*kdRule1KdFuzzy2*kdRule2KdFuzzy3*kdRule3; returnKd_calcu;/*****************************************函数功能AD将采集到的温度进行转化********************************************/uint read_tlc2543uchar port static uchar PORT 0; uchar Temp,i,k0; uint AD_value0; Temp port; CS 1; CLK 0; Temp4; CS 0; while1 fori0;i8;i CLK 0; ifTemp else SDI 0;AD_value1; ifSDO AD_value | 0 x01; CLK 1; Temp1; fori8;i12;i CLK 0; AD_value1; ifSDO AD_value | 0 x01; delay_us10; CLK 1; CLK 0; CS 1; ifPORT port break; else Temp port; Temp4; delay_us10; CS 0; AD_value 0; k; ifk2 PORT port; return AD_value;float AD_dealvoid uint AD_value; float temp; AD_value read_tlc25430 x00; temp AD_value*number; return temp;/*********主函数**********/void mainvoid uchar AD_value0; flag0; flag_start0; ENA1; IN10; IN20; LCD_Init; LCD_display; Timer2_Init; while1 ifflag_start0key_scan;Show_Num13,1,3,S_temp;Show_Num3,1,3,P_temp;else ifflag_start1P_tempAD_deal;Show_Num3,1,3,P_temp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值