基于51單片機(jī)的水溫控制系統(tǒng)制作
適合于51單片機(jī)愛(ài)好者
壓縮文件里有制作過(guò)程、代碼與原理圖。
本系統(tǒng)設(shè)計(jì)采用基于PID算法的單片機(jī)控制來(lái)實(shí)現(xiàn)水溫的調(diào)控。單片機(jī)控制部分采用AT89C51單片機(jī)為核心,采用軟件編程,實(shí)現(xiàn)用PID算法來(lái)控制PWM波的產(chǎn)生,繼而控制電爐的加熱來(lái)實(shí)現(xiàn)溫度控制。通過(guò)編程對(duì)PID各參數(shù)的調(diào)整,來(lái)達(dá)到提高加溫速度,減小超調(diào)的目的。 設(shè)計(jì)任務(wù)和主要內(nèi)容 一升水在1kw電爐下加熱,要求水溫在一定范圍內(nèi)可由人工設(shè)定,并能在環(huán)境溫度降低時(shí)自動(dòng)調(diào)節(jié),以保證設(shè)定的溫度基本不變。 - 溫度設(shè)定范圍為40~90℃,最小區(qū)分度為1℃,標(biāo)定溫度小于等于1℃。
- 環(huán)境溫度降低時(shí)溫度控制的靜態(tài)誤差小于等于1℃。
- 用十進(jìn)制數(shù)碼管顯示水的溫度。
- 采用適當(dāng)?shù)目刂品椒�,�?dāng)設(shè)定的溫度突變時(shí),減小系統(tǒng)的調(diào)節(jié)時(shí)間和超調(diào)量。
- 溫度控制的靜態(tài)誤差小于等于0.2℃。
- 在設(shè)定溫度發(fā)生突變時(shí),自動(dòng)打印水溫隨時(shí)間變化的曲線。
- 系統(tǒng)設(shè)計(jì)原理
0.png (6.4 KB, 下載次數(shù): 72)
下載附件
2018-7-20 18:40 上傳
該水溫控制系統(tǒng)主要由AT89S52單片機(jī)控制系統(tǒng)、溫度采樣轉(zhuǎn)換器、溫度控制電路。鍵盤顯示電路等四部分組成,總體框圖如上。 (一)總體方案論證 根據(jù)題目的要求,我們提出了以下三種方案: 方案1:采用傳統(tǒng)的二位模擬控制方法,選用模擬電路,用電位器設(shè)定給定值,采用上下限比較電路將反饋的溫度值與給定的值比較后,決定加熱或者不加熱。由于采用的模擬控制方式,系統(tǒng)受環(huán)境影響較大,不能實(shí)現(xiàn)復(fù)雜的控制算法使控制精度做得較高,而且不能用于顯示和鍵盤設(shè)定。 方案2:采用單片機(jī)AT89S52為核心。采用數(shù)字溫度傳感器DS18B20采集溫度變化信號(hào),將其轉(zhuǎn)換成數(shù)字信號(hào)并通過(guò)單片機(jī)處理后去控制溫度,使其達(dá)到穩(wěn)定。使用單片機(jī)具有編程靈活,控制簡(jiǎn)單的優(yōu)點(diǎn),使系統(tǒng)能簡(jiǎn)單的實(shí)現(xiàn)溫度的控制及顯示,并且通過(guò)軟件編程能實(shí)現(xiàn)各種控制算法使系統(tǒng)還具有控制精度高的特點(diǎn)。 比較上述兩種方案,方案2明顯改善了方案1的不足,具有控制簡(jiǎn)單、控制溫度精度高的特點(diǎn),因此本設(shè)計(jì)電路采用方案2。 (二)各部分電路方案論證 1、溫度采樣部分 方案1:采用熱敏電阻,可滿足35℃--95℃的測(cè)量范圍,但熱敏電阻精度、重復(fù)性和可靠性都比較差,對(duì)于檢測(cè)精度小于1℃的溫度信號(hào)是不適用的。 方案2:采用數(shù)字溫度傳感器DS18B20。DS18B20是支持一線總線接口的溫度傳感器,具有抗干擾性強(qiáng),體積小,靈活經(jīng)濟(jì)的特點(diǎn)。它的測(cè)量溫度范圍為-55℃~+125℃,在-10℃~+85℃范圍內(nèi),精度為±0.5℃且有9~12位分辨率可調(diào),使用電壓為3~5V無(wú)需備用電源。此外DS18B20集合了64位光刻ROM、溫度傳感器、非揮發(fā)的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器,可以直接實(shí)現(xiàn)溫度的測(cè)量和轉(zhuǎn)換,無(wú)需再另接外部電路。 方案3:采用溫度傳感器AD590。AD590具有體積小、質(zhì)量輕、線性度好、性能穩(wěn)定等優(yōu)點(diǎn)。其測(cè)量范圍在-50℃~+150℃,滿刻度范圍誤差為 ±0.3℃,當(dāng)電源電壓在5~10之間,穩(wěn)定度為1%時(shí)誤差只有±0.01℃,此外,AD590是溫度—電流傳感器,對(duì)于提高系統(tǒng)抗干擾能力有很大幫助。 從系統(tǒng)電路設(shè)計(jì)的復(fù)雜度,性價(jià)比等方面考慮,決定選用方案2。 2、控制電路部分 方案1:可以用邏輯電路搭建一個(gè)控制器,實(shí)現(xiàn)PID控制。但系統(tǒng)還要附加顯示、溫度設(shè)定等功能,要附加很多電路,總體的電路設(shè)計(jì)和制作比較繁瑣。 方案2:采用8031芯片,其內(nèi)部沒(méi)有程序存儲(chǔ)器,需要進(jìn)行外部拓展,這給電路增加了復(fù)雜度。 方案3:本方案的CPU模塊采用2051芯片,其內(nèi)部有2KB單元的程序存儲(chǔ)器,不需要外部拓展程序存儲(chǔ)器,但由于系統(tǒng)用到較多的I/O口,因此此芯片的資源不夠用。 方案4:采用AT89S52單片機(jī),其內(nèi)部有8KB單元的程序存儲(chǔ)器,不需要外部擴(kuò)展程序存儲(chǔ)器,而且其I/O口達(dá)32個(gè),完全滿足本次設(shè)計(jì)需要。 比較這4種方案,綜合的考慮單片機(jī)各部分資源,本次設(shè)計(jì)選用方案4。 3、加熱方案和功率電路的選擇 方案1:加熱的裝置,根據(jù)題目,可以使用電熱爐進(jìn)行加熱,控制電爐的功率豈可控制加熱速度。水溫過(guò)高時(shí),一般只能關(guān)掉電爐,讓其自然冷卻。為求更好的控制效果,也可以裝置一個(gè)小風(fēng)扇,電爐加熱時(shí)風(fēng)扇關(guān)閉,水溫超高時(shí)關(guān)閉電爐開(kāi)啟風(fēng)扇加速散熱。 方案2:可以采用可控硅控制加熱器的工作。通過(guò)單片機(jī)產(chǎn)生PWM信號(hào)來(lái)控制可控硅的導(dǎo)通和關(guān)斷,控制加熱器的加熱時(shí)間,從而控制加熱器的功率。   從加熱的響應(yīng)速度考慮,采用方案2。因?yàn)榧訜岬墓β瘦^大,故電源采用市電220伏。 設(shè)計(jì)電路圖如圖2所示
 DS18B20  ISP下載口
AT89S52主控電路 MOC3041功率電路 LCD液晶顯示
 PCB圖如下:
功率電路 主控電路
本設(shè)計(jì)總體包括四個(gè)部分:主機(jī)控制部分、溫度采樣轉(zhuǎn)換部分、溫度控制部分、鍵盤顯示部分。 溫度采樣轉(zhuǎn)換電路
系統(tǒng)的溫度采樣轉(zhuǎn)換由DS18B20集成芯片來(lái)實(shí)現(xiàn)。電路圖如右 DS18B20性能描述 測(cè)量范圍在-55℃~+125℃,在-10℃~+85℃范圍內(nèi),精度為±0.5℃且有9~12位分辨率可調(diào),使用電壓為3~5V,無(wú)需備用電源。 DS18B20采用單總線通信技術(shù),通信穩(wěn)定可靠,且線路簡(jiǎn)單,容易實(shí)現(xiàn)。 其基本的通信過(guò)程如下: 主機(jī)拉低單總線產(chǎn)生至少480us的Tx復(fù)位脈沖; 然后由主機(jī)釋放總線,進(jìn)入Rx接收模式,主機(jī)釋放總線時(shí)會(huì)產(chǎn)生一個(gè)由低電平變?yōu)楦唠娖降纳仙兀? 單總線器件檢測(cè)到該上升沿后,延時(shí)15~60us; 單總線器件通過(guò)拉低總線60~240us來(lái)產(chǎn)生應(yīng)答脈沖; 主機(jī)接收到從機(jī)的應(yīng)答信號(hào)后,說(shuō)明有單總線器件在線,然后主機(jī)就可以開(kāi)始對(duì)從機(jī)進(jìn)行ROM命令和功能命令操作。 DS18B20直接輸出數(shù)字量,可直接與單片機(jī)進(jìn)行通信,讀取測(cè)溫?cái)?shù)據(jù),電路非常簡(jiǎn)單。使用它,主要工作量集中在了單片機(jī)編程上。  此部分電路主要由光電耦合器MOC3041和雙向可控硅BTA16組成。以脈寬調(diào)制輸出控制電爐與電源的接通和斷開(kāi)比例,以通斷控制調(diào)壓法控制電爐的輸入功率。MOC3041的內(nèi)部集成了發(fā)光二極管、過(guò)零檢測(cè)電路和一個(gè)小功率雙向可控硅。當(dāng)單片機(jī)PWM輸出為1,MOC3041中的發(fā)光二極管發(fā)光,用于過(guò)零檢測(cè)電路的同步作用,內(nèi)部的雙向可控硅在過(guò)零后馬上導(dǎo)通,從而使觸發(fā)雙向可控硅BTA16導(dǎo)通,負(fù)載中有電流通過(guò),反之當(dāng)單片機(jī)PWM輸出為0,雙向可控硅截止,負(fù)載中沒(méi)有電流通過(guò)。光電耦合的耐壓值為400v,它的輸出級(jí)由過(guò)零觸發(fā)的雙向可控硅構(gòu)成,它控制著主電路雙向可控硅的導(dǎo)通和關(guān)閉�?刂撇糠蛛娐穲D如下
3、單片機(jī)控制部分 此部分是該系統(tǒng)的核心,系統(tǒng)的控制采用了單片機(jī)AT89S52。單片機(jī)AT89S52內(nèi)部有8KB字節(jié)的可編程FLASH存儲(chǔ)器和256字節(jié)的數(shù)據(jù)存儲(chǔ)器。故系統(tǒng)不必外拓存儲(chǔ)器,這樣大大減少了系統(tǒng)的硬件電路。電路原理圖如下:
4、按鍵及顯示部分 系統(tǒng)僅采用五個(gè)按鍵來(lái)進(jìn)行溫度的控制。 在顯示方面,我們采用了LCD1602的液晶顯示模塊,通過(guò)軟件編程,可以實(shí)現(xiàn)所需要的顯示。此外,液晶模塊的使用也比較簡(jiǎn)單,只要連接數(shù)據(jù)總線,選通端口和命令/數(shù)據(jù)端口即可。 系統(tǒng)的硬件設(shè)計(jì)盡量簡(jiǎn)單,故工作任務(wù)主要在程序的設(shè)計(jì)上。
0.png (12.37 KB, 下載次數(shù): 55)
下載附件
2018-7-20 18:39 上傳
PID算法控制PWM輸出:
程圖如下
- void timer0() interrupt 1
- {
- uchar flag;
- TH0=0xd8 ; 有
- TL0=0xf0 ;
- TR1=1 ; 無(wú)
- P24=1 ; //啟動(dòng)輸出
- CJ++;
- if(stemp>Wtemperature) flag=0
- {
- ei=stemp-Wtemperature; flag=1
- E=E+ei;
- ex=ej-ei;
- ej=ei;
- if(ei<6)
- {Ui=U0-Kp*(ei+Ti*E-Td*ex);}
- else Ui=U0-Kp*ei;
- flag=Ui/100;
- switch(flag)
- {
- case 9:{TH1=0xdc;TL1=0xd8;}break;
- case 8:{TH1=0xe2;TL1=0xb4;}break;
- case 7:{TH1=0xe8;TL1=0x90;}break;
- case 6:{TH1=0xec;TL1=0x78;}break;
- case 5:{TH1=0xf0;TL1=0x60;}break;
- case 4:{TH1=0xf2;TL1=0x54;}break;
- case 3:{TH1=0xf4;TL1=0x48;}break;
- case 2:{TH1=0xf8;TL1=0x30;}break;
- case 1:{TH1=0xfc;TL1=0x18;}break;
- case 0:{TH1=0xfd;TL1=0xa8;}break;
- default:{TH1=0xff;TL1=0xfa;}break;
- }
- }
- else {TH1=0xff;TL1=0xfa;}
- }
復(fù)制代碼程序用T0和T1的嵌套來(lái)實(shí)現(xiàn)PWM波,T0控制波的頻率,T1控制占空比,其效果圖如下:
0.png (3.67 KB, 下載次數(shù): 65)
下載附件
2018-7-20 18:40 上傳
PID控制器: PID控制器采用單片機(jī)軟件實(shí)現(xiàn)。輸出PWM控制信號(hào),定時(shí)器采用T0,T1的嵌套,T0定時(shí)是10MS,T1控制低電平的輸出。由于加熱器屬于帶滯后的一階對(duì)象,故式中Kp,Ki,Kd的選擇取決于加熱器的階躍響應(yīng)特性和實(shí)際經(jīng)驗(yàn),為了實(shí)現(xiàn)PID參數(shù)的實(shí)時(shí)整定,各溫度區(qū)間由實(shí)驗(yàn)測(cè)取最佳的Kp,Ki,Kd值。
1、動(dòng)態(tài)溫控測(cè)量 測(cè)量方式:接上系統(tǒng)的加熱裝置,裝入1L室溫的水,設(shè)定溫控溫度。記錄調(diào)節(jié)時(shí)間、超調(diào)溫度、穩(wěn)態(tài)溫度波動(dòng)幅度等。 測(cè)量條件:環(huán)境溫度18℃,加熱器功率1000W。 測(cè)量結(jié)果數(shù)據(jù) 2、結(jié)果分析 由以上測(cè)量結(jié)果可見(jiàn),系統(tǒng)性能基本達(dá)到了所要求的指標(biāo)。 在溫控指標(biāo)中,影響系統(tǒng)性能的因素很多,最關(guān)鍵的是加熱器本身的物理 性質(zhì)及控制算法。傳感器必須加上防水設(shè)施,故溫度傳感難免遲滯,加熱器的加熱本身有延遲,水對(duì)流傳熱也會(huì)造成測(cè)溫的延遲,這些都會(huì)直接影響系統(tǒng)的控制性能�?刂扑惴ǚ矫�,需反復(fù)實(shí)驗(yàn)比較,在上升時(shí)間和超調(diào)量之間做權(quán)衡,選出綜合效果最好的PID系數(shù)。 - 設(shè)計(jì)中遇到的問(wèn)題及其解決方法
因?yàn)槭侵苯咏尤?20V的市電,當(dāng)電路一通電,板面溫度突然升高,以致燒壞電路板。于是之后我們?cè)陔娐分屑由狭松崞?/div> 溫度傳感器DS18B20不能直接浸在水中測(cè)溫度,故我們將其固定在一導(dǎo)熱性相對(duì)好的金屬筒內(nèi),再?zèng)]入水中測(cè)量。 功率電路的輸出端原本應(yīng)該加上一個(gè)電容來(lái)矯正零相位,然而當(dāng)硬件電路都裝好后,進(jìn)行調(diào)試,發(fā)現(xiàn)加熱器一直工作,沒(méi)有辦法實(shí)現(xiàn)溫度的控制,檢查發(fā)現(xiàn)是電容的問(wèn)題。當(dāng)加上電容時(shí),在交流電的作用下,電路直接導(dǎo)通,根本不需要外加控制,故我們?nèi)サ袅嗽撾娙荩訜崞鬟@才受控。 本系統(tǒng)設(shè)計(jì)是以AT89S51單片機(jī)為核心,采用軟件編程,運(yùn)用PID算法來(lái)控制PWM波的產(chǎn)生,繼而控制加熱器的加熱時(shí)間來(lái)實(shí)現(xiàn)溫度的控制。在軟硬件的調(diào)試過(guò)程中,出現(xiàn)了不少問(wèn)題,如電路板發(fā)燙,程序不起作用,加熱速度較慢等,但是在老師和同學(xué)的指導(dǎo)和幫助下,通過(guò)電路檢查,程序修改等工作,問(wèn)題基本上都得到了解決。在這一次設(shè)計(jì)過(guò)程中,我們了解了很多專業(yè)知識(shí),動(dòng)手能力也得到了提高。然而,系統(tǒng)還存在著一些問(wèn)題,如水溫達(dá)到穩(wěn)定的時(shí)間。
單片機(jī)源程序如下:
- /***************************************************************
- 項(xiàng)目名稱:水溫控制系統(tǒng)設(shè)計(jì);
- 功 能:通過(guò)STC89C52單片機(jī)控制可控硅驅(qū)動(dòng)加過(guò)零檢測(cè)電路作為
- 功率控制電路來(lái)控制加熱過(guò)程,通過(guò)鍵盤掃描來(lái)設(shè)定水溫,
- DS18B20實(shí)時(shí)測(cè)量水的溫度,將實(shí)際水溫與設(shè)定水溫比較
- 通過(guò)PID控制算法調(diào)節(jié),是實(shí)際水溫與設(shè)定水溫接近。從而
- 達(dá)到控制水溫的目的。
- 作 者:0903 藺一鋒
- 日 期:2010年11月3日
- ***************************************************************/
- #include<reg52.h>
- #include<stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit s1=P2^0;
- sbit s2=P2^1;
- sbit s3=P2^2;
- sbit s4=P2^3;
- sbit s5=P2^4;
- sbit ds=P2^5;
- sbit beep=P2^6;
- sbit rd=P1^0;
- sbit rs=P1^1;
- sbit wr=P1^2;
- sbit lcden=P1^3;
- sbit PWM=P1^6;
- sbit led1=P1^4;
- sbit led2=P1^5;
- uchar set_temp,keytemp;
- uint temp;
- uchar c;
- bit flag,flag1,flag2;
- float f_temp,t;
- int timecount,z;
- float KP,KI,KD;
- float e1,e2,e3;
- float uk,duk;
- uchar HighL,HighH,PWMH;
- float k;
- uchar code table[]={"設(shè)定溫度:"};
- uchar code table1[]={"實(shí)測(cè)溫度:"};
- uchar code table2[]={"加熱"};
- uchar code table3[]={"保溫"};
- uchar code table4[]={"作者:0903鋒仔@"};
- uchar code table5[]={"系統(tǒng)初始化"};
- uchar code table6[]={"measured Temperature"};
- uchar code table7[]={"水溫控制系統(tǒng)設(shè)計(jì)"};
- uchar code table8[]={" "};
- void delay(uint z)//延時(shí)函數(shù),延時(shí)5ms
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /***************************************
- 鍵盤掃描函數(shù)
- 通過(guò)S5,S4,S3,S2,S1鍵來(lái)分別實(shí)現(xiàn)溫度設(shè)定值的
- 粗加,粗減,精加,精減,和確定功能。
- ***************************************/
- void keyscan()
- {
- if(set_temp>=100)//將設(shè)定溫度限定在0-100度之間
- set_temp=100;
- if(set_temp<=0)
- set_temp=0;
- if(s5==0)//此鍵按下設(shè)定溫度加5
- {
- delay(10);
- if(s5==0)
- {
- flag1=0;
- set_temp+=5;
- if(set_temp>=100)
- {
- set_temp=100;
- beep=0;
- delay(1000);
- beep=1;
- }
- }while(s5==0);
- }
- if(s4==0)//此鍵按下設(shè)定溫度減5
- {
- delay(10);
- if(s4==0)
- {
- flag1=0;
- set_temp-=5;
- if(set_temp<=0)
- {
- set_temp=0;
- beep=0;
- delay(1000);
- beep=1;
- }
- }while(s4==0);
- }
- if(s3==0)//此鍵按下設(shè)定溫度加1
- {
- delay(10);
- if(s3==0)
- {
- flag1=0;
- set_temp++;
- if(set_temp==100)
- {
- set_temp=100;
- beep=0;
- delay(1000);
- beep=1;
- }
- }while(s3==0);
- }
- if(s2==0)//此鍵按下設(shè)定溫度減1
- {
- delay(10);
- if(s2==0)
- {
- flag1=0;
- set_temp--;
- if(set_temp==0)
- {
- set_temp=0;
- beep=0;
- delay(1000);
- beep=1;
- }
- }while(s2==0);
- }
- if(s1==0)//確定加熱狀態(tài)(加熱與不加熱)
- {
- delay(10);
- if(s1==0)
- {
- flag1=1;
- }
- while(s1==0);
- }
- }
- /******************************************
- DS18B20溫度采集模塊程序設(shè)計(jì)
- 通過(guò)DS18B20實(shí)時(shí)采集水溫,反映給單片機(jī)系統(tǒng)
- ******************************************/
- void dsreset()//DS18B20復(fù)位函數(shù)
- {
- uint i;
- ds=0;
- i=103;
- while(i>0)i--;
- ds=1;
- i=4;
- while(i>0)i--;
- }
- bit tempreadbit()//從DS18B20 RAM讀一位數(shù)據(jù)
- {
- uint i;
- bit dat;
- ds=0;i++;
- ds=1;i++;i++;
- dat=ds;
- i=8;while(i>0)i--;
- return(dat);
- }
- uchar tempread()//從DS18B20 RAM讀一字節(jié)數(shù)據(jù)
- {
- uchar i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)
- {
- j=tempreadbit();
- dat=(j<<7)|(dat>>1);
- }
- return(dat);
- }
- void tempwritebyte(uchar dat)//向DS18B20寫(xiě)以字節(jié)的數(shù)據(jù)
- {
- uint i,j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if(testb)//寫(xiě)1
- {
- ds=0;
- i++;i++;
- ds=1;
- i=8;while(i>0)i--;
- }
- else//寫(xiě)0
- {
- ds=0;
- i=8;while(i>0)i--;
- ds=1;
- i++;i++;
- }
- }
- }
- /*void readrom()
- {
- dsreset();
- delay(1);
- tempwritebyte(0x33);
- tempwritebyte(0xbe);
- readrom=tempread();
- }
- void matchrom()
- {
- dsreset();
- delay(1);
- tempwritebyte(0x55);
- }*/
- void tempchange()//啟動(dòng)溫度轉(zhuǎn)換
- {
- dsreset();
- delay(1);
- tempwritebyte(0xcc);
- tempwritebyte(0x44);
- }
- float get_temp()//溫度值讀取與處理函數(shù)
- {
- uchar a,b;
- dsreset();
- delay(1);
- tempwritebyte(0xcc);
- tempwritebyte(0xbe);
- a=tempread();
- b=tempread();
- temp=b;
- temp<<=8;
- temp=temp|a;
- f_temp=(float)(temp*0.0625);
- f_temp=f_temp*10;
- return(f_temp);
- }
- /**********************************************
- 12864顯示模塊
- 顯示實(shí)際溫度制和設(shè)定溫度值
- **********************************************/
- void write_com(uchar com)//向12864寫(xiě)指令
- {
- rs=0;
- wr=0;
- delay(1);
- P0=com;
- lcden=1;
- delay(1);
- lcden=0;
- delay(1);
- }
- void write_date(uchar date)//向12864寫(xiě)數(shù)據(jù)
- {
- rs=1;
- wr=0;
- delay(1);
- P0=date;
- lcden=1;
- delay(1);
- lcden=0;
- delay(1);
- }
- void display(float m,uchar n)//顯示設(shè)定溫度、實(shí)測(cè)溫度、加熱狀態(tài)
- {
- uint i,j;
- float b;
- float p;
- uchar a1,a2,a3;
- uchar b1,b2,b3,b4;
- if(n<100)
- {
- a1=0;
- a2=n/10;
- a3=n%10;
- }
- else
- {
- a1=1;
- a2=0;
- a3=0;
- }
- p=m;
- j=(uint)(p*10);
- b1=(uchar)(j/1000);
- b2=(uchar)(j%1000/100);
- b3=(uchar)(j%100/10);
- b4=(uchar)(j%10);
- write_com(0x90+5);//顯示設(shè)定溫度
- write_date(0x30+a1);
- write_date(0x30+a2);
- write_date(0x30+a3);
- write_com(0x88+5);//顯示實(shí)測(cè)溫度
- write_date(0x30+b1);
- write_date(0x30+b2);
- write_date(0x2e);
- write_date(0x30+b3);
- write_date(0x30+b4);
- b=((float)(b1*100+b2*10+b3))/10.0;
- i=0;
- if((b+0.2)<n)
- {
- led1=0;
- write_com(0x98+1);
- while(table2[i]!='\0')
- {
- write_date(table2[i]);
- i++;
- }
- flag2=1;
- }
- else
- {
- led1=1;
- i=0;
- write_com(0x98+1);
- while(table8[i]!='\0')
- {
- write_date(table8[i]);
- i++;
- }
- i=0;
- if((b=n)||((b>n)&&((b-0.2)<=n))||((b<n)&&((b+0.2)>=n)))
- {
- led2=0;
- write_com(0x98+4);
- while(table3[i]!='\0')
- {
- write_date(table3[i]);
- i++;
- }
- }
- }
- if(flag2==1)
- {
- flag2=0;
- led2=1;
- i=0;
- write_com(0x98+4);
- while(table8[i]!='\0')
- {
- write_date(table8[i]);
- i++;
- }
- }
- }
- /*****************************************************
- PID控制算法程序設(shè)計(jì)
- 通過(guò)PID控制算法可以使實(shí)際水溫在設(shè)定水溫周圍呈很小范圍的
- 波動(dòng),從而使實(shí)際水溫值接近設(shè)定水溫值
- *****************************************************/
- void conversion()//定時(shí)器2初值處理函數(shù)
- {
- uint temp2;
- temp2=65536-PWMH*10;
- HighH=temp2/256;
- HighL=temp2%256;
- }
- void senddate(float y)
- {
- // uint i;
- if(flag==1)
- {
- ES=0;
- flag=0;
- c=0;
- TI=1;
- printf("The measured temp:%f",y);
- // SBUF=1;
- while(!TI);
- TI=0;
- ES=1;
- }
- }
- void init()//初始化函數(shù)
- {
- uint i,j;
- TMOD=0x21;
- TH1=0xfd;
- TL1=0xfd;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- PWMH=0;
- conversion();
- TH2=(65536-50000)/256;
- TL2=(65536-50000)%256;
- rd=1;
- lcden=0;
- write_com(0x30);
- write_com(0x0c);
- write_com(0x01);
- write_com(0x90);
- while(table5[i]!='\0')//系統(tǒng)初始化
- {
- write_date(table5[i]);
- i++;
- delay(20);
- }
- for(j=0;j<=1;j++)//6個(gè)點(diǎn)的三次循環(huán)
- {
- write_com(0x88+4);
- for(i=0;i<=5;i++)
- {
- write_date(0x2e);
- delay(200);
- }
- delay(100);
- write_com(0x88+4);
- for(i=0;i<=5;i++)
- {
- write_date(0x20);
- }
- delay(100);
- }
- i=0;
- write_com(0x80);//顯示 水溫控制系統(tǒng)設(shè)計(jì)標(biāo)題
- while(table7[i]!='\0')
- {
- write_date(table7[i]);
- i++;
- }
- i=0;
- write_com(0x90);//顯示 設(shè)定溫度
- while(table[i]!='\0')
- {
- write_date(table[i]);
- i++;
- }
- i=0;
- write_com(0x88);//顯示 實(shí)測(cè)溫度
- while(table1[i]!='\0')
- {
- write_date(table1[i]);
- i++;
- }
- // tempwritebyte(0x4e);//設(shè)定DS18B20的分辨率為11位
- // tempwritebyte(0x5f);
- PWM=0;
- e1=0;
- e2=0;
- e3=0;
- duk=0;
- uk=0;
- KP=20;//PID控制算法參數(shù)
- KI=0.061;
- KD=30;
- REN=1;//串口通信設(shè)置
- SM0=0;
- SM1=1;
- ET0=1;
- ET2=1;
- TR0=1;
- TR1=1;
- TR2=1;//啟動(dòng)定時(shí)器2
- EA=1;
- ES=1;
- }
- void main()
- {
- init();
- while(1)
- {
- keyscan();//調(diào)用鍵盤掃描函數(shù)
- tempchange();//啟動(dòng)溫度轉(zhuǎn)換
- t=get_temp();//提取實(shí)測(cè)溫度
- display(t,set_temp);//顯示設(shè)定溫度和實(shí)測(cè)溫度
- senddate(t);//向上位機(jī)發(fā)送數(shù)據(jù)函數(shù)
- if((flag1==1))
- {
- if(timecount>=375)
- {
- timecount=0;
- e1=set_temp-t;
- duk=(KP*(e1-e2)+KI*e1+KD*(e1-2*e2+e3));//PID控制算法式
- uk=uk+duk;
- if(e1>=75)
- {
- z=4;
- }
- else if(e1>=50)
- {
- z=3;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png (49.27 KB, 下載次數(shù): 74)
下載附件
2018-7-20 18:43 上傳
所有資料51hei提供下載:
基于51單片機(jī)的水溫控制系統(tǒng).rar
(18.56 MB, 下載次數(shù): 916)
2018-7-20 16:53 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|