標(biāo)題: PID控制的單片機(jī)爐溫控制系統(tǒng)源碼和Proteus仿真 [打印本頁(yè)]
作者: smileml115 時(shí)間: 2017-6-4 15:04
標(biāo)題: PID控制的單片機(jī)爐溫控制系統(tǒng)源碼和Proteus仿真
功能要求:
1) 采用液晶顯示器顯示溫度測(cè)量值。
2) 檢測(cè)的溫度范圍為0~128℃。
3) 溫度超過(guò)警戒值時(shí)能報(bào)警提示。
4) 能通過(guò)鍵盤(pán)輸入設(shè)定溫度并顯示。
5) 用PID控制溫度,控溫精度≦±2℃。
DS18B20溫度顯示仿真如圖,DS18B20的值可以任意調(diào)整,模擬溫度的采集,LCD的顯示值隨DS18B20的溫度值變化而變化。當(dāng)溫度超過(guò)界限,LED亮,同時(shí)SOUNDER響,模擬警報(bào)系統(tǒng)。當(dāng)按下k1,顯示溫度的最高位光標(biāo)開(kāi)始閃爍,進(jìn)入設(shè)定溫度調(diào)整,按下k2,光標(biāo)右移,按下k3數(shù)值加1,按下k4數(shù)值減1。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):
2.png (25.88 KB, 下載次數(shù): 284)
下載附件
PID控制仿真圖
2017-6-4 15:01 上傳
1.png (35.76 KB, 下載次數(shù): 246)
下載附件
DS18B20仿真圖
2017-6-4 15:01 上傳
PID控制仿真如圖,電加熱爐OVEN輸出的模擬量經(jīng)ADC0804轉(zhuǎn)化成數(shù)字量,再送到LCD顯示。OVEN的溫度與設(shè)定溫度在單片機(jī)內(nèi)進(jìn)行PID運(yùn)算,PID輸出量控制晶閘管的導(dǎo)通,從而控制OVEN的加熱。
0.png (70.96 KB, 下載次數(shù): 235)
下載附件
2017-6-4 16:12 上傳
下面是51單片機(jī)的源碼:
- #include<reg52.h>
- #include<math.h>
- float R;
- float Kp;
- float T;
- float Ti;
- float Td;
- float e2;
- float e1,e;
- float a0,a1,a2;
- #define ui unsigned int
- #define uc unsigned char
- sbit bj=P2^4; //低電平報(bào)警模塊工作
- sbit lcden=P2^7; //LCD E
- sbit lcdrs=P2^6; //LCD RS
- sbit lcdrw=P2^5; // //LCD RW
- sbit control=P2^3; //加熱模塊相關(guān)。低電平啟動(dòng)
- char lshi,lge,hshi,hge;
- uc num,flag;
- ui temp;
- sbit dsio=P3^7; //DS18B20輸入口
- //延時(shí)
- void delay(ui z)
- {
- uc x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- //DS18B20控制
- void dsinit()
- {
- uc i;
- dsio=0;
- i=70;
- while(i--);
- dsio=1;
- i=4;
- while(i--);
- }
- void dswritebyte(uc dat)
- {
- uc i,j;
- for(j=0;j<8;j++)
- {
- dsio=0;
- i++;
- dsio=dat&0x01;
- i=6;
- while(i--);
- dsio=1;
- dat>>=1;
- }
- }
- uc dsreadbyte()
- {
- uc i,j,byte,b;
- for(j=0;j<8;j++)
- {
- dsio=0;
- i++;
- dsio=1;
- i++;i++;
- b=dsio;
- byte=(byte>>1)|(b<<7);
- i=4;
- while(i--);
- }
- return byte;
- }
- void dschangetemp()
- {
- dsinit();
- delay(1);
- dswritebyte(0xcc);
- dswritebyte(0x44);
- }
- void dsreadtemp()
- {
- dsinit();
- delay(1);
- dswritebyte(0xcc);
- dswritebyte(0xbe);
- }
- ui gettemp()
- {
- int temp;
- uc h,l;
- dschangetemp();
- dsreadtemp();
- l=dsreadbyte();
- h=dsreadbyte();
- temp=h;
- temp<<=8;
- temp|=l;
- temp=temp*0.0625*100+0.5;
- return temp;
- }
- //LCD控制程序
- void lcdwritecom(uc com)
- {
- lcdrs=0;
- P0=com;
- delay(10);
- lcden=1;
- delay(10);
- lcden=0;
- }
- void lcdwritedata(uc date)
- {
- lcdrs=1;
- P0=date;
- delay(10);
- lcden=1;
- delay(10);
- lcden=0;
- }
- void lcdinit()
- {
- lcdrw=0;
- lcden=0;
- lcdwritecom(0x38);
- lcdwritecom(0x0c);
- lcdwritecom(0x06);
- lcdwritecom(0x01);
- }
- //LCD顯示
- void lcddisplay(int temp)
- {
- ui tab[]={0,0,0,-2,0,0};
- lcdwritecom(0x80);
- lcdwritedata('+');
- tab[0]=temp/10000;
- tab[1]=temp%10000/1000;
- tab[2]=temp%1000/100;
- tab[4]=temp%100/10;
- tab[5]=temp%10;
- lcdwritecom(0x81);
- for(num=0;num<6;num++)
- {
- lcdwritedata('0'+tab[num]);
- }
- }
- void adjust()
- {
- delay(100);
- flag++;
- if(flag==5)flag=1;
- if(flag==1)
- {
- lcdwritecom(0x80+0x44);
- lcdwritecom(0x0f);
- }
- if(flag==2)
- {
- lcdwritecom(0x80+0x45);
- lcdwritecom(0x0f);
- }
- if(flag==3)
- {
- lcdwritecom(0x80+0x47);
- lcdwritecom(0x0f);
- }
- if(flag==4)
- {
- lcdwritecom(0x80+0x48);
- lcdwritecom(0x0f);
- }
- }
- void inc()
- {
- delay(100);
- switch(flag)
- {
- case 1:lshi++; if(lshi==10)lshi=0;
- lcdwritedata('0'+lshi);
- lcdwritecom(0x10);
- break;
- case 2:lge++; if(lge==10)lge=0;
- lcdwritedata('0'+lge);
- lcdwritecom(0x10);
- break;
- case 3:hshi++; if(hshi==10)hshi=0;
- lcdwritedata('0'+hshi);
- lcdwritecom(0x10);
- break;
- case 4:hge++; if(hge==10)hge=0;
- lcdwritedata('0'+hge);
- lcdwritecom(0x10);
- break;
- }
- }
- void dec()
- {
- delay(100);
- switch(flag)
- {
- case 1:lshi--; if(lshi<0)lshi=9;
- lcdwritedata('0'+lshi);
- lcdwritecom(0x10);
- break;
- case 2:lge--; if(lge<0)lge=9;
- lcdwritedata('0'+lge);
- lcdwritecom(0x10);
- break;
- case 3:hshi--; if(hshi<0)hshi=9;
- lcdwritedata('0'+hshi);
- lcdwritecom(0x10);
- break;
- case 4:hge--; if(hge<0)hge=9;
- lcdwritedata('0'+hge);
- lcdwritecom(0x10);
- break;
- }
- }
- //鍵盤(pán)掃描
- void keyscan()
- {
- uc test,num;
- num=0;
- test=P1;
- if(test!=0xff)
- delay(5);
- test=P1;
- if(test==0xf7)
-
- {
- while(P1!=0xff);
- num++;
- while(1)
- {
- test=P1;
- if(test!=0xff)
- delay(5);
- test=P1;
- if(test!=0xff)
- {
- if(test==0xf7)
- num++;
- if(num==2)
- { lcdwritecom(0x0c);
- break;}
- switch(test)
- {
- case 0xfe:adjust();
- break;
- case 0xfd:inc();
- break;
- case 0xfb:dec();
- break;
- }
- }
- while(P1!=0xff);
-
- }
- }
- }
- //PID
- void PIDinit()
- {
-
- Kp=2;Ti=4;Td=1;T=1;R=25;
- a0=Kp*(1+T/Ti+Td/T);
- a1=-Kp*(1+(2*Td)/T);
- a2=Kp*(Td/T);
- e2=e1=0;
- }
- void PIDdeal()
- {
- float y ,u ;
- y=gettemp();
- e=y/100-R;
- u=a0*e+a1*e1+a2*e2;
- e2=e1;e1=e;
- if(u>0.5||u<-0.5)
- control=0;
- else control=1;
- }
- void main()
- {
- uc code tab2[]="SET:20~80C";
- uc i;
- TMOD=0x01;
- TH0=(65535-10900)/256;
- TL0=(65535-10900)%256;
- ET0=1;
- TR0=1;
- lcdinit();
- lcdwritecom(0x87);
- lcdwritedata('C');
- lcdwritecom(0x80+0x40);
- for(i=0;i<10;i++)
- lcdwritedata(tab2[i]) ;
- lshi=2;lge=0;hshi=5;hge=0;
- while(1)
- {
- lcddisplay(gettemp());
- keyscan() ;
- EA=1; while(1);
- }
- }
- void t0() interrupt 1
- {
- uc i;
- TH0=(65535-10900)/256;
- TL0=(65535-10900)%256;
- i++;
- if(i==100)
- {
- void PIDinit();
- void PIDdeal();
- }
- }
復(fù)制代碼
上文是網(wǎng)上轉(zhuǎn)載的給大家學(xué)習(xí)參考的,附件里面是我自己弄的,目前不成功,調(diào)試了好幾天了,搞不定,求大神指導(dǎo)如何修改?
仿真失敗的程序,求大神幫忙指導(dǎo)修改.7z
(236.78 KB, 下載次數(shù): 1201)
2021-4-14 00:00 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: 3760609865 時(shí)間: 2017-6-5 00:34
謝謝分享,學(xué)習(xí)學(xué)習(xí)pID控制。
作者: alphacrux 時(shí)間: 2017-8-27 16:54
Node #00087 not found whilst binding pin V+ of U4_U10_ADC#0001!
仿真出現(xiàn)上述錯(cuò)誤,請(qǐng)問(wèn)是什么原因呢?
我的proteus版本是7.8
作者: CZP1234 時(shí)間: 2017-8-28 10:41
源程序有問(wèn)題
作者: lijn 時(shí)間: 2017-11-4 09:48
樓主 pid在單片機(jī)中的運(yùn)算,講講。
作者: 海里沒(méi)有大鯊魚(yú) 時(shí)間: 2017-11-21 16:22
怎么解決?
作者: 海里沒(méi)有大鯊魚(yú) 時(shí)間: 2017-11-21 16:27
樓主 是不是少了什么原件?
作者: 海里沒(méi)有大鯊魚(yú) 時(shí)間: 2017-11-21 16:29
你是怎么解決這個(gè)問(wèn)題的?
作者: 哈哈哈WJ 時(shí)間: 2017-12-20 21:02
解決了嗎
作者: aqb3322 時(shí)間: 2018-1-16 22:09
這個(gè)資料真好。可以做成品了。
作者: nishiy 時(shí)間: 2018-1-23 11:09
為什么程序運(yùn)行不了,仿真也運(yùn)行不了
作者: whs123456 時(shí)間: 2018-4-9 11:37
怎么自動(dòng)調(diào)節(jié)啊
作者: walt740 時(shí)間: 2018-4-13 00:37
好資料,51黑有你更精彩!!!
作者: 小貓小兔 時(shí)間: 2018-5-7 21:26
謝謝樓主的分享,我試試看能不能仿真出來(lái)。
作者: 295735223 時(shí)間: 2018-5-11 00:15
好資料,51黑有你更精彩!!!
作者: liyongan_1985 時(shí)間: 2018-5-11 08:57
果然是好資料,打算下載下倆看看
作者: kaili 時(shí)間: 2018-5-17 13:31
運(yùn)行后無(wú)法設(shè)置溫度,加熱裝置也不工作,蜂鳴器一直在報(bào)警
作者: zengzengbin 時(shí)間: 2018-5-22 13:47
程序有問(wèn)題。
作者: 六月六月 時(shí)間: 2018-5-22 19:32
運(yùn)行不了是因?yàn)橄螺d回來(lái)的protues圖中adc0804有幾個(gè)引腳的網(wǎng)絡(luò)標(biāo)號(hào)沒(méi)有標(biāo)上,可以參照樓主的截圖自行添加
作者: zengzengbin 時(shí)間: 2018-5-23 16:56
這個(gè)有問(wèn)題。
作者: 川大學(xué)子 時(shí)間: 2018-5-23 21:04
正好需要,就是不知道能不能完成整個(gè)仿真
作者: liuxiaoxiong 時(shí)間: 2018-6-19 20:42
能運(yùn)行,lcd不顯示,有哪位可以解釋一下嗎?
作者: liuxi1206 時(shí)間: 2019-1-10 21:03
謝謝分享,學(xué)習(xí)學(xué)習(xí)pID控制。
作者: 123xianbei 時(shí)間: 2019-1-16 15:17
樓主能不能注釋下代碼!PIDInit()和PIDDeal()看不懂什么意思,和平常的PID函數(shù)不太一樣
作者: wacsl 時(shí)間: 2019-3-24 13:37
感謝分享,更想學(xué)習(xí)了
作者: recoo 時(shí)間: 2019-3-25 00:26
樓主精神可嘉啊
作者: lichangle 時(shí)間: 2019-4-23 17:13
這仿真有問(wèn)題, 不會(huì)獲取溫度
估計(jì)樓主屏蔽了或者刪除了一部分代碼
作者: xiaobai1990 時(shí)間: 2019-5-7 22:19
樓主沒(méi)有找到ADC0804的代碼。
作者: ZOUZHUO 時(shí)間: 2019-5-8 12:40
哪里有
作者: lyfe 時(shí)間: 2019-5-8 22:24
可以向大家咨詢下關(guān)于PID控溫的其他問(wèn)題嗎?我的問(wèn)題是:為什么protues仿真中l(wèi)cd不顯示呢?求幫助,謝謝您了
作者: 123@4 時(shí)間: 2019-5-23 20:24
程序有點(diǎn)問(wèn)題,按鍵也沒(méi)有進(jìn)行定義
作者: 某偶像練習(xí)生 時(shí)間: 2019-6-5 13:57
大神厲害 剛好需要用到
作者: 煙花易冷 時(shí)間: 2019-6-16 18:15
編譯代碼沒(méi)問(wèn)題,一仿真就出現(xiàn)23 ERROR(S),都是ERROR L121: IMPROPER FIXUP.怎么解決啊,在線等,急
作者: 煙花易冷 時(shí)間: 2019-6-17 12:07
這個(gè)問(wèn)題解決了,把工程設(shè)置中Options里的ROM改為large就行了。
可是仿真成功后,按鍵設(shè)置無(wú)反應(yīng),電熱爐也不加熱,LCD顯示也不改變。
作者: yusan12342019 時(shí)間: 2019-6-17 15:08
值得學(xué)習(xí)
作者: 夏娜不灼眼 時(shí)間: 2019-6-17 18:16
LCD顯示不成功啊
作者: Robust59 時(shí)間: 2019-6-19 08:37
樓主,出現(xiàn)關(guān)鍵性錯(cuò)誤是怎么回事
作者: ljb6869118 時(shí)間: 2019-6-19 11:44
請(qǐng)問(wèn)怎么解決了
作者: wgykk 時(shí)間: 2019-12-24 13:37
好資料,前來(lái)學(xué)習(xí)
作者: MIGRAINE 時(shí)間: 2019-12-29 22:34
用oven那個(gè)圖的程序在哪啊?
作者: puyong 時(shí)間: 2020-3-26 10:09
不能用,慎重下載
作者: lele5211314 時(shí)間: 2020-4-4 11:12
程序不能用,下載的程序里面沒(méi)有關(guān)于ADC0804的代碼
作者: 請(qǐng)問(wèn)請(qǐng)4 時(shí)間: 2020-5-12 21:48
基于AT89S51單片機(jī)爐溫控制系統(tǒng)的模塊電路設(shè)計(jì)
作者: tangjun 時(shí)間: 2020-6-9 17:26
馬克 ,攢夠積分再來(lái)。
作者: hyfwyy 時(shí)間: 2020-6-28 12:48
樓主,請(qǐng)問(wèn)可以分享一下adc的程序嘛?或者請(qǐng)問(wèn)一下oven模塊輸出電壓和實(shí)際溫度的關(guān)系,謝謝
作者: 51hei電控200522 時(shí)間: 2020-8-2 22:00
附件應(yīng)該是忘記保存最后新的了,需要把a(bǔ)dc0804的電源的數(shù)據(jù)輸出口全部都接上,具體可以參照樓主截圖。
作者: 51hei電控200522 時(shí)間: 2020-8-2 22:01
ADC0804的程序和OVEN的控制程序都沒(méi)有上傳
先看PID動(dòng)態(tài)效果的不建議下載了哦
作者: zyx@ 時(shí)間: 2020-8-12 11:18
垃圾吧,仿真沒(méi)一個(gè)成功的,按鍵沒(méi)反應(yīng),第二個(gè)仿真也有錯(cuò)誤
作者: zyx@ 時(shí)間: 2020-8-12 12:01
能不能認(rèn)真點(diǎn),仿真液晶屏顯示第一張中,功能不是設(shè)置最高溫和最低溫嗎,你上面就顯示一個(gè)溫度設(shè)置個(gè)錘子
作者: zyx@ 時(shí)間: 2020-8-12 14:42
絕對(duì)有問(wèn)題,又一個(gè)進(jìn)坑了,擦
作者: 阿giao 時(shí)間: 2020-9-10 20:01
仿真出現(xiàn)錯(cuò)誤 咋整 有改好的沒(méi)
作者: Highnose 時(shí)間: 2020-10-22 21:49
電路沒(méi)連完,網(wǎng)頁(yè)圖里是對(duì)的,仿真原理圖是錯(cuò)的,程序也不對(duì)蛋
作者: qzsulin 時(shí)間: 2020-11-12 11:47
程序不完整,沒(méi)辦法用
作者: 51hei電控200522 時(shí)間: 2021-4-13 23:01
這個(gè)仿真不推薦大家下載了,認(rèn)真查看過(guò)之后并沒(méi)有晶閘管驅(qū)動(dòng)oven加熱的代碼,沒(méi)有adc084的代碼。良心建議!!!!
作者: c51單片機(jī)小白 時(shí)間: 2021-4-14 18:43
要是早看到就好了
老哥你也在寫(xiě)pid溫控嗎?能交流下嗎
作者: luobog 時(shí)間: 2021-4-22 22:48
c51單片機(jī)小白 發(fā)表于 2021-4-14 18:43
要是早看到就好了老哥你也在寫(xiě)pid溫控嗎?能交流下嗎
老哥你寫(xiě)的咋樣了?能討論討論嗎
作者: Ux.。 時(shí)間: 2021-6-2 20:31
謝謝分享 對(duì)51單片機(jī)PID調(diào)控有更好認(rèn)識(shí)
作者: woyaodwn 時(shí)間: 2021-12-28 10:05
這個(gè)搞起來(lái)了嗎
作者: zxw517 時(shí)間: 2023-4-18 00:14
學(xué)習(xí)了,PID的模糊運(yùn)算有點(diǎn)不容易
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |