ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:17.93KB ,
资源ID:6916000      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6916000.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(温度pid控制.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

温度pid控制.docx

1、温度pid控制温度pid控制#include SST89x5x4.H #include #include #include sbit dp1=P24; sbit dp2=P25; sbit dp3=P26; sbit dp4=P27;/数码管位选 sbit key1=P20; sbit key2=P21; sbit key3=P22; sbit key4=P23;/按键位选 sbit P13=P13;/控制端口 sbit P34=P34;/测温DQ sbit P35=P35;/发声端口 char dplib11=0x018,0x07B,0x02C,0x029,0x04B,0x089,0x088

2、,0x03B,0x08,0x09,0x0EF;/数码管表 char dpbuf4;/每个数码管显示的数字缓冲区 int t=0;/控制循环次数或标志位 int s0=0;/用于延时或循环或标志位 int s1=0;/用于延时或循环或标志位 unsigned char acc=0;/用于对温度芯片的读写操作 int high_time,low_time,count=0;/占空比调节参数 float temper; int TTL=1,huansuan,TH1Z1,TL1Z1,TH1Z0,TL1Z0;/用于脉宽调制 int sign=0;/sign为1,则小数点显示,否则小数点不显示 int dn

3、t=0;/用于位选挨个点亮 int cnt=0;/用于控制是否一直按着加键或者减键 int shujua;/读出温度数据的高位 int shujub;/温度低位 int zancun=0;/临时数据存放 int watchdog=0;/软件看门狗,无操作定时返回退出 /* PID类 */ struct PID int SetPoint; / 设定目标 Desired Value int Proportion; / 比例常数 Proportional Const int Integral; / 积分常数 Integral Const int Derivative; / 微分常数 Derivati

4、ve Const float LastError; / Error-1 float PrevError; / Error-2 float SumError; / Sums of Errors ; struct PID spid; / PID Control Structure float rout; / PID Response (Output) float rin; / PID Feedback (Input) void keyprogram();/键盘参数设置子程序 void observe();/运行中观察设置参数子程序 void settingmode();/选择要设定的参数子程序 v

5、oid addmode();/参数加 void submode();/参数减 void displaysetting(int mode);/键盘操作时显示的设置 void INIT18B20();/初始芯片 void WRBYTE(unsigned char a);/写字 void RDBYTE( );/读字 void delay10ms(void);/10MS延时,用于显示2S void get_temper();/温度测量子程序 void change(int a,int b);/对读出数据处理,与汇编原理一样 /* T0中断服务程序 */ void timer0(void)interru

6、pt 1 using 2/T0中断 TH0=0xEE; TL0=0x00; dp2=dp4=dp3=dp1=1; if(dnt3) dnt=0; if(dnt=1)&(sign=1) P0=dplibdpbufdnt&0XF7; else P0=dplibdpbufdnt; watchdog+; switch(dnt+) case 0: dp1=0; break; case 1: dp2=0; break; case 2: dp3=0; break; case 3: dp4=0; /* T1中断服务程序 */ void serve_T1() interrupt 3 using 3 /T1 if

7、(TTL=1) P13=1; TH1=TH1Z1; TL1=TL1Z1; TTL=0; else P13=0; TH1=TH1Z0; TL1=TL1Z0; TTL=1; if(count=9) count=0; else count+; /*= 初始化PID类 =*/ void PIDInit (struct PID *pp) memset ( pp,0,sizeof(struct PID); /*= PID计算部分 =*/ float PIDCalc( struct PID *pp, float NextPoint ) float dError,Error; Error = pp-SetPo

8、int - NextPoint; / 偏差 pp-SumError += Error; / 积分 dError = pp-LastError - pp-PrevError; / 当前微分 pp-PrevError = pp-LastError; pp-LastError = Error; if(abs(spid.SetPoint-temper)SumError=0; return (pp-Proportion * Error/比例 + pp-Integral * pp-SumError /积分项 + pp-Derivative * dError); / 微分项 /* 温度控制子程序 */ vo

9、id control_temper() if(spid.SetPoint-temper4) high_time=high_time+100;/高电平份数累加 else if(temper-spid.SetPoint4) high_time=high_time-110;/高电平份数累减 else if(abs(temper-spid.SetPoint)=1000)/防止过热过冷 high_time=999; if(high_time8); TL1Z1=huansuan&0x00FF; huansuan=65536-low_time*46; TH1Z0=(huansuan&0xFF008); TL

10、1Z0=huansuan&0x00FF; /* 温度测量子程序 */ void get_temper() EA=0; INIT18B20(); acc=0xCC; WRBYTE(acc); acc=0x44; WRBYTE(acc); INIT18B20(); acc=0xCC; WRBYTE(acc); acc=0xBE; WRBYTE(acc); RDBYTE(); shujub=(int)acc; RDBYTE(); shujua=(int)acc; change(shujua,shujub); EA=1; /* 初始化DS18B20 */ void INIT18B20() t=4; P

11、34=0; s0=62; for(s0;s00;s0-);/延时500us P34=1; CY=0; s0=6; while(t-) while(s0-) if(P34=1) t=0; s1=1; break; if(s1=1) s0=111; while(s0-) CY=CY|P34; /* 向DS18B20写字 */ void WRBYTE(unsigned char a) t=8; CY=0; while(t-) a=(a1); P34=0; _nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ; P34=CY; s0=3; for(s0;s0

12、0;s0-); P34=1; /* 向DS18B20读字 */ void RDBYTE( ) acc=0; t=8; while(t-) P34=0; _nop_() ; _nop_() ; _nop_(); _nop_(); _nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ; P34=1; CY=P34; _nop_() ; _nop_() ; _nop_() ; _nop_() ; s0=5; for(s0;s00;s0-)

13、; P34=1; if(CY=1) acc=acc|0x80; if(t) acc=(acc1); else if(t) acc=(acc1); /* 处理从DS18B20上读到的数值子程序 */ void change(a,b) int zheng; int xiaoshu; zheng=(shujua&(0x07)4);/处理整数,转换BCD temper=zheng; xiaoshu=shujub&0x0F;/处理小数,转换BCD zancun=(xiaoshu*10)&0xF0); temper=temper+(float)(zancun4)/10; if(sign=1) dpbuf3

14、=zheng/100; zheng=zheng%100; dpbuf2=zheng/10; zheng=zheng%10; dpbuf1=zheng; dpbuf0=(zancun4); /* 延时子程序 */ void delay10ms(void)/10ms unsigned char i0,j0; for(i0=20;i00;i0-) for(j0=248;j00;j0-); /* 参数设定子程序 */ void keyprogram() if(key1=0)/判断是否进入设置 /A delay10ms(); if(key1=0)/进入设置了 P13=0; while(!key1); s

15、ign=0; /B dpbuf2=spid.SetPoint/100; zancun=(int)spid.SetPoint%100; dpbuf1=zancun/10; zancun=zancun%10; dpbuf0=zancun; dpbuf3=1;/从模式一开始选择 while(1) if(key2=0)/判断是否进行参数选择 settingmode();/参数选择子程序 if(key3=0)/判断是否进行参数加 addmode();/参数加子程序 if(key4=0)/判断是否进行参数减减 submode();/参数减子程序 if(key1=0)/判断是否进行参数加加 delay10m

16、s(); if(key1=0) while(!key1); break; if(key3=1)&(key4=1)/ delay10ms(); if(key3=1)&(key4=1) cnt=0; if(watchdog=2000) watchdog=0; break; /B /A watchdog=0; sign=1; /* 观察参数子程序 */ void observe() if(key4=0)/判断是否进入设置 /A delay10ms(); if(key4=0)/进入设置了 while(!key4); sign=0; /B dpbuf2=spid.SetPoint/100; zancun

17、=(int)spid.SetPoint%100; dpbuf1=zancun/10; zancun=zancun%10; dpbuf0=zancun; dpbuf3=1;/从模式一开始观察 while(1) if(key2=0)/判断是否进行参数选择 settingmode();/参数选择子程序 if(key4=0)/判断是否结束观察 delay10ms(); if(key4=0) while(!key4); break; if(watchdog=2000) watchdog=0; break; if(count=10) get_temper();/温度测量子程序 control_temper

18、();/温度控制子程序 /B /A sign=1; watchdog=0; /* 设置模式子程序 */ void settingmode() delay10ms(); if(key2=0)/进入了模式选择 while(!key2); if(+dpbuf3=5) dpbuf3=1; displaysetting(1); dpbuf2=zancun/100; zancun=zancun%100; dpbuf1=zancun/10; zancun=zancun%10; dpbuf0=zancun; /* 参数加子程序 */ void addmode() delay10ms(); displayset

19、ting(1); if(key3=0) if(cnt=0) t=70; while(-t)&(!key3) delay10ms(); if(t=0) cnt+; zancun+; else if(cnt=10) cnt+; t=30; while(t-) delay10ms(); zancun+=10; if(dpbuf3=1) if(zancun100) zancun=30; else if(zancun800) zancun=0; displaysetting(2); /* 参数减子程序 */ void submode() delay10ms(); displaysetting(1); if(key4=0) if(cnt=0) t=75; while(-t)&(!key4) delay10ms(); if(t=0) cnt+; zancun-; else if(cnt10) cnt+; t=30; while(t-) delay10ms(); zancun-; else if(cnt=19) cnt=19; t=30;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1