基于AT89C51單片机设计的pid算法的加热炉(含protues仿真图).doc

基于AT89C51單片机设计的pid算法的加热炉(含protues仿真图).doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于AT89C51單片机设计的pid算法的加热炉(含protues仿真图)

基于AT89C51单片机设计的 pid 算法的 加热炉 (含protues仿真图) #include reg52.h #include PID.h #include lcd1602.h #include adc0809.h sbit up =P2^4; sbit down=P2^5; uchar s_xian1[]= {Set temp: C}; uchar s_xian2[]= {Rel temp: C}; uchar value; uchar set_temp=200,rel_temp; //设定值 和 测量值 void delay_ms(uchar ms) { uchar i,j; for(i=0;ims;i++) for(j=0;j120;j++); } void key_up_down() { if(up==0) delay_ms(1); if(up==0) set_temp++; while(!up); if(down==0) delay_ms(1); if(down==0) set_temp--; while(!down); s_xian1[9] =set_temp/100+0x30; s_xian1[10]=(set_temp%100)/10+0x30; s_xian1[11]=(set_temp%100)%10+0x30; } void main() { lcd_init(); while(1) { key_up_down(); rel_temp=adc0809(); PID(set_temp,rel_temp); write_com(0x80); display(s_xian1); write_com(0xc0); display(s_xian2); } } #include reg52.h #include adc0809.h uchar measure,table[3]; uchar voltage; extern uchar s_xian2[]; void delay1() { uchar i=50; while(i--); } void adc_init() { start=1; delay1(); start=0; while(EOC==0); delay1(); voltage=P1; } uchar adc0809() { uchar dat,t; adc_init(); dat=voltage*300.0/255; table[0]=dat/100; t=dat%100; table[1]=t/10; table[2]=t%10; s_xian2[9] =table[0]+0; s_xian2[10]=table[1]+0; s_xian2[11]=table[2]+0; measure=table[0]*100+table[1]*10+table[2]; return measure; } #include reg52.h #include intrins.h #includePID.h #define DA_data P3 sbit DA_wr1=P2^3; uchar uk; void DAC0832(); void PID_control(uchar set,uchar rel); void PID(uchar set,uchar rel) { uchar D_value=0; //设定值与实际值的差值 if(setrel) { D_value=set-rel; if(D_value20) uk=255; else PID_control(set,rel); } else { D_value=rel-set; if(D_value10) uk=10; else PID_control(set,rel); } DAC0832(); } void PID_control(uchar set,uchar rel) { uchar Kp=200,Ki=3,Kd=5; char e2=0,e1=0,e0=0; uint u0=0,u=0; e2=set-rel; u=Kp*(e2-e1)+Ki*e2+Kd*(e2-2e1+e0)+u0; uk=u; e0=e1;e1=e2;u0=u; } void DAC0832() { DA_wr1=1; DA_data=u

文档评论(0)

fglgf11gf21gI + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档