久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 23106|回復: 24
收起左側

51單片機+PID算法水溫控制系統設計源碼與資料下載

  [復制鏈接]
ID:376014 發表于 2018-7-20 16:56 | 顯示全部樓層 |閱讀模式
基于51單片機的水溫控制系統制作

適合于51單片機愛好者

壓縮文件里有制作過程、代碼與原理圖。

本系統設計采用基于PID算法的單片機控制來實現水溫的調控。單片機控制部分采用AT89C51單片機為核心,采用軟件編程,實現用PID算法來控制PWM波的產生,繼而控制電爐的加熱來實現溫度控制。通過編程對PID各參數的調整,來達到提高加溫速度,減小超調的目的。
設計任務和主要內容
  • 基本要求
一升水在1kw電爐下加熱,要求水溫在一定范圍內可由人工設定,并能在環境溫度降低時自動調節,以保證設定的溫度基本不變。
  • 主要性能指標
  • 溫度設定范圍為40~90℃,最小區分度為1℃,標定溫度小于等于1℃。
  • 環境溫度降低時溫度控制的靜態誤差小于等于1℃。
  • 用十進制數碼管顯示水的溫度。
  • 拓展功能
  • 采用適當的控制方法,當設定的溫度突變時,減小系統的調節時間和超調量。
  • 溫度控制的靜態誤差小于等于0.2℃。
  • 在設定溫度發生突變時,自動打印水溫隨時間變化的曲線。
  •                       系統設計原理
    0.png

該水溫控制系統主要由AT89S52單片機控制系統、溫度采樣轉換器、溫度控制電路。鍵盤顯示電路等四部分組成,總體框圖如上。
  • 方案論證與比較
(一)總體方案論證
根據題目的要求,我們提出了以下三種方案:
    方案1:采用傳統的二位模擬控制方法,選用模擬電路,用電位器設定給定值,采用上下限比較電路將反饋的溫度值與給定的值比較后,決定加熱或者不加熱。由于采用的模擬控制方式,系統受環境影響較大,不能實現復雜的控制算法使控制精度做得較高,而且不能用于顯示和鍵盤設定。
    方案2:采用單片機AT89S52為核心。采用數字溫度傳感器DS18B20采集溫度變化信號,將其轉換成數字信號并通過單片機處理后去控制溫度,使其達到穩定。使用單片機具有編程靈活,控制簡單的優點,使系統能簡單的實現溫度的控制及顯示,并且通過軟件編程能實現各種控制算法使系統還具有控制精度高的特點。
    比較上述兩種方案,方案2明顯改善了方案1的不足,具有控制簡單、控制溫度精度高的特點,因此本設計電路采用方案2。
(二)各部分電路方案論證
1、溫度采樣部分
    方案1:采用熱敏電阻,可滿足35℃--95℃的測量范圍,但熱敏電阻精度、重復性和可靠性都比較差,對于檢測精度小于1℃的溫度信號是不適用的。
    方案2:采用數字溫度傳感器DS18B20。DS18B20是支持一線總線接口的溫度傳感器,具有抗干擾性強,體積小,靈活經濟的特點。它的測量溫度范圍為-55℃~+125℃,在-10℃~+85℃范圍內,精度為±0.5℃且有9~12位分辨率可調,使用電壓為3~5V無需備用電源。此外DS18B20集合了64位光刻ROM、溫度傳感器、非揮發的溫度報警觸發器TH和TL、配置寄存器,可以直接實現溫度的測量和轉換,無需再另接外部電路。
    方案3:采用溫度傳感器AD590。AD590具有體積小、質量輕、線性度好、性能穩定等優點。其測量范圍在-50℃~+150℃,滿刻度范圍誤差為   ±0.3℃,當電源電壓在5~10之間,穩定度為1%時誤差只有±0.01℃,此外,AD590是溫度—電流傳感器,對于提高系統抗干擾能力有很大幫助。
     從系統電路設計的復雜度,性價比等方面考慮,決定選用方案2。
2、控制電路部分
方案1:可以用邏輯電路搭建一個控制器,實現PID控制。但系統還要附加顯示、溫度設定等功能,要附加很多電路,總體的電路設計和制作比較繁瑣。
   方案2:采用8031芯片,其內部沒有程序存儲器,需要進行外部拓展,這給電路增加了復雜度。
   方案3:本方案的CPU模塊采用2051芯片,其內部有2KB單元的程序存儲器,不需要外部拓展程序存儲器,但由于系統用到較多的I/O口,因此此芯片的資源不夠用。
   方案4:采用AT89S52單片機,其內部有8KB單元的程序存儲器,不需要外部擴展程序存儲器,而且其I/O口達32個,完全滿足本次設計需要。
   比較這4種方案,綜合的考慮單片機各部分資源,本次設計選用方案4。
3、加熱方案和功率電路的選擇
方案1:加熱的裝置,根據題目,可以使用電熱爐進行加熱,控制電爐的功率豈可控制加熱速度。水溫過高時,一般只能關掉電爐,讓其自然冷卻。為求更好的控制效果,也可以裝置一個小風扇,電爐加熱時風扇關閉,水溫超高時關閉電爐開啟風扇加速散熱。
  方案2:可以采用可控硅控制加熱器的工作。通過單片機產生PWM信號來控制可控硅的導通和關斷,控制加熱器的加熱時間,從而控制加熱器的功率。
   從加熱的響應速度考慮,采用方案2。因為加熱的功率較大,故電源采用市電220伏。                                                
設計電路圖如圖2所示                                          



                                                          DS18B20
                                    ISP下載口





AT89S52主控電路      MOC3041功率電路            LCD液晶顯示

  PCB圖如下

     功率電路
主控電路

  • 硬件電路設計
  本設計總體包括四個部分:主機控制部分、溫度采樣轉換部分、溫度控制部分、鍵盤顯示部分。
  • 溫度采樣轉換電路
   系統的溫度采樣轉換由DS18B20集成芯片來實現。電路圖如右
  DS18B20性能描述
    測量范圍在-55℃~+125℃,在-10℃~+85℃范圍內,精度為±0.5℃且有9~12位分辨率可調,使用電壓為3~5V,無需備用電源。
DS18B20采用單總線通信技術,通信穩定可靠,且線路簡單,容易實現。
其基本的通信過程如下:
主機拉低單總線產生至少480us的Tx復位脈沖;
然后由主機釋放總線,進入Rx接收模式,主機釋放總線時會產生一個由低電平變為高電平的上升沿;
單總線器件檢測到該上升沿后,延時15~60us;  
單總線器件通過拉低總線60~240us來產生應答脈沖;
主機接收到從機的應答信號后,說明有單總線器件在線,然后主機就可以開始對從機進行ROM命令和功能命令操作。
DS18B20直接輸出數字量,可直接與單片機進行通信,讀取測溫數據,電路非常簡單。使用它,主要工作量集中在了單片機編程上。
  •      溫度控制電路
此部分電路主要由光電耦合器MOC3041和雙向可控硅BTA16組成。以脈寬調制輸出控制電爐與電源的接通和斷開比例,以通斷控制調壓法控制電爐的輸入功率。MOC3041的內部集成了發光二極管、過零檢測電路和一個小功率雙向可控硅。當單片機PWM輸出為1,MOC3041中的發光二極管發光,用于過零檢測電路的同步作用,內部的雙向可控硅在過零后馬上導通,從而使觸發雙向可控硅BTA16導通,負載中有電流通過,反之當單片機PWM輸出為0,雙向可控硅截止,負載中沒有電流通過。光電耦合的耐壓值為400v,它的輸出級由過零觸發的雙向可控硅構成,它控制著主電路雙向可控硅的導通和關閉。控制部分電路圖如下






3單片機控制部分
此部分是該系統的核心,系統的控制采用了單片機AT89S52。單片機AT89S52內部有8KB字節的可編程FLASH存儲器和256字節的數據存儲器。故系統不必外拓存儲器,這樣大大減少了系統的硬件電路。電路原理圖如下:





4按鍵及顯示部分
系統僅采用五個按鍵來進行溫度的控制。
在顯示方面,我們采用了LCD1602的液晶顯示模塊,通過軟件編程,可以實現所需要的顯示。此外,液晶模塊的使用也比較簡單,只要連接數據總線,選通端口和命令/數據端口即可。
  • 軟件設計
系統的硬件設計盡量簡單,故工作任務主要在程序的設計上。
0.png

PID算法控制PWM輸出:
程圖如下
  1. void timer0() interrupt 1
  2.    {
  3. uchar flag;
  4. TH0=0xd8 ;                                   有
  5. TL0=0xf0 ;
  6. TR1=1 ;                                 無
  7. P24=1 ;     //啟動輸出
  8. CJ++;   
  9. if(stemp>Wtemperature)       flag=0
  10. {
  11. ei=stemp-Wtemperature;                    flag=1
  12. E=E+ei;
  13. ex=ej-ei;
  14. ej=ei;
  15. if(ei<6)
  16. {Ui=U0-Kp*(ei+Ti*E-Td*ex);}
  17. else Ui=U0-Kp*ei;
  18. flag=Ui/100;
  19. switch(flag)
  20. {
  21. case 9:{TH1=0xdc;TL1=0xd8;}break;
  22. case 8:{TH1=0xe2;TL1=0xb4;}break;
  23. case 7:{TH1=0xe8;TL1=0x90;}break;
  24. case 6:{TH1=0xec;TL1=0x78;}break;
  25. case 5:{TH1=0xf0;TL1=0x60;}break;
  26. case 4:{TH1=0xf2;TL1=0x54;}break;
  27. case 3:{TH1=0xf4;TL1=0x48;}break;
  28. case 2:{TH1=0xf8;TL1=0x30;}break;
  29. case 1:{TH1=0xfc;TL1=0x18;}break;
  30. case 0:{TH1=0xfd;TL1=0xa8;}break;
  31. default:{TH1=0xff;TL1=0xfa;}break;
  32.           }
  33.          }
  34. else {TH1=0xff;TL1=0xfa;}
  35. }   
復制代碼
程序用T0和T1的嵌套來實現PWM波,T0控制波的頻率,T1控制占空比,其效果圖如下:

0.png


PID控制器:
PID控制器采用單片機軟件實現。輸出PWM控制信號,定時器采用T0,T1的嵌套,T0定時是10MS,T1控制低電平的輸出。由于加熱器屬于帶滯后的一階對象,故式中Kp,Ki,Kd的選擇取決于加熱器的階躍響應特性和實際經驗,為了實現PID參數的實時整定,各溫度區間由實驗測取最佳的Kp,Ki,Kd值。

  • 測試結果及分析
1、動態溫控測量         
測量方式:接上系統的加熱裝置,裝入1L室溫的水,設定溫控溫度。記錄調節時間、超調溫度、穩態溫度波動幅度等。
測量條件:環境溫度18℃,加熱器功率1000W。
                 測量結果數據
設定溫度/℃
     40
     50
     65
     80
超調溫度/℃
     1.1
     0.8
     0.2
     0.3
穩態誤差/℃
     0.6
     0.4
     0.6
     0.6
調節時間/min
     3.37
     5.85
     10.05
     15.22
2、結果分析
由以上測量結果可見,系統性能基本達到了所要求的指標。
在溫控指標中,影響系統性能的因素很多,最關鍵的是加熱器本身的物理
性質及控制算法。傳感器必須加上防水設施,故溫度傳感難免遲滯,加熱器的加熱本身有延遲,水對流傳熱也會造成測溫的延遲,這些都會直接影響系統的控制性能。控制算法方面,需反復實驗比較,在上升時間和超調量之間做權衡,選出綜合效果最好的PID系數。
  • 設計總結
  • 設計中遇到的問題及其解決方法
因為是直接接入220V的市電,當電路一通電,板面溫度突然升高,以致燒壞電路板。于是之后我們在電路中加上了散熱片。
溫度傳感器DS18B20不能直接浸在水中測溫度,故我們將其固定在一導熱性相對好的金屬筒內,再沒入水中測量。
功率電路的輸出端原本應該加上一個電容來矯正零相位,然而當硬件電路都裝好后,進行調試,發現加熱器一直工作,沒有辦法實現溫度的控制,檢查發現是電容的問題。當加上電容時,在交流電的作用下,電路直接導通,根本不需要外加控制,故我們去掉了該電容,加熱器這才受控。
  • 設計總結
     本系統設計是以AT89S51單片機為核心,采用軟件編程,運用PID算法來控制PWM波的產生,繼而控制加熱器的加熱時間來實現溫度的控制。在軟硬件的調試過程中,出現了不少問題,如電路板發燙,程序不起作用,加熱速度較慢等,但是在老師和同學的指導和幫助下,通過電路檢查,程序修改等工作,問題基本上都得到了解決。在這一次設計過程中,我們了解了很多專業知識,動手能力也得到了提高。然而,系統還存在著一些問題,如水溫達到穩定的時間。

單片機源程序如下:
  1. /***************************************************************
  2.         項目名稱:水溫控制系統設計;
  3.         功    能:通過STC89C52單片機控制可控硅驅動加過零檢測電路作為
  4.                           功率控制電路來控制加熱過程,通過鍵盤掃描來設定水溫,
  5.                           DS18B20實時測量水的溫度,將實際水溫與設定水溫比較
  6.                           通過PID控制算法調節,是實際水溫與設定水溫接近。從而
  7.                           達到控制水溫的目的。
  8.         作    者:0903 藺一鋒
  9.         日    期:2010年11月3日
  10. ***************************************************************/
  11. #include<reg52.h>
  12. #include<stdio.h>
  13. #define uchar unsigned char
  14. #define uint unsigned int
  15. sbit s1=P2^0;
  16. sbit s2=P2^1;
  17. sbit s3=P2^2;
  18. sbit s4=P2^3;
  19. sbit s5=P2^4;
  20. sbit ds=P2^5;
  21. sbit beep=P2^6;
  22. sbit rd=P1^0;
  23. sbit rs=P1^1;
  24. sbit wr=P1^2;
  25. sbit lcden=P1^3;
  26. sbit PWM=P1^6;
  27. sbit led1=P1^4;
  28. sbit led2=P1^5;
  29. uchar set_temp,keytemp;
  30. uint temp;
  31. uchar c;
  32. bit flag,flag1,flag2;
  33. float f_temp,t;
  34. int timecount,z;
  35. float KP,KI,KD;
  36. float e1,e2,e3;
  37. float uk,duk;
  38. uchar HighL,HighH,PWMH;
  39. float k;
  40. uchar code table[]={"設定溫度:"};
  41. uchar code table1[]={"實測溫度:"};
  42. uchar code table2[]={"加熱"};
  43. uchar code table3[]={"保溫"};
  44. uchar code table4[]={"作者:0903鋒仔@"};
  45. uchar code table5[]={"系統初始化"};
  46. uchar code table6[]={"measured Temperature"};
  47. uchar code table7[]={"水溫控制系統設計"};
  48. uchar code table8[]={"    "};
  49. void delay(uint z)//延時函數,延時5ms
  50. {
  51.         uint x,y;
  52.         for(x=z;x>0;x--)
  53.                 for(y=110;y>0;y--);
  54. }
  55. /***************************************
  56.                 鍵盤掃描函數
  57. 通過S5,S4,S3,S2,S1鍵來分別實現溫度設定值的
  58. 粗加,粗減,精加,精減,和確定功能。
  59. ***************************************/
  60. void keyscan()
  61. {
  62.         if(set_temp>=100)//將設定溫度限定在0-100度之間
  63.                 set_temp=100;
  64.         if(set_temp<=0)
  65.                 set_temp=0;
  66.         if(s5==0)//此鍵按下設定溫度加5
  67.         {
  68.                 delay(10);
  69.                 if(s5==0)
  70.                 {
  71.                         flag1=0;
  72.                         set_temp+=5;
  73.                         if(set_temp>=100)
  74.                         {
  75.                                 set_temp=100;
  76.                                 beep=0;
  77.                                 delay(1000);
  78.                                 beep=1;
  79.                         }
  80.                 }while(s5==0);
  81.         }
  82.         if(s4==0)//此鍵按下設定溫度減5
  83.         {
  84.                 delay(10);
  85.                 if(s4==0)
  86.                 {
  87.                         flag1=0;
  88.                         set_temp-=5;
  89.                         if(set_temp<=0)
  90.                         {
  91.                                 set_temp=0;
  92.                                 beep=0;
  93.                                 delay(1000);
  94.                                 beep=1;
  95.                         }
  96.                 }while(s4==0);
  97.         }
  98.         if(s3==0)//此鍵按下設定溫度加1
  99.         {
  100.                 delay(10);
  101.                 if(s3==0)
  102.                 {
  103.                         flag1=0;
  104.                         set_temp++;
  105.                         if(set_temp==100)
  106.                         {
  107.                                 set_temp=100;
  108.                                 beep=0;
  109.                                 delay(1000);
  110.                                 beep=1;
  111.                         }
  112.                 }while(s3==0);
  113.         }
  114.         if(s2==0)//此鍵按下設定溫度減1
  115.         {
  116.                 delay(10);
  117.                 if(s2==0)
  118.                 {
  119.                         flag1=0;
  120.                         set_temp--;
  121.                         if(set_temp==0)
  122.                         {
  123.                                 set_temp=0;
  124.                                 beep=0;
  125.                                 delay(1000);
  126.                                 beep=1;
  127.                         }
  128.                 }while(s2==0);
  129.         }
  130.         if(s1==0)//確定加熱狀態(加熱與不加熱)
  131.         {
  132.                 delay(10);
  133.                 if(s1==0)
  134.                 {
  135.                         flag1=1;
  136.                 }
  137.                 while(s1==0);
  138.         }
  139. }        
  140. /******************************************
  141.            DS18B20溫度采集模塊程序設計
  142. 通過DS18B20實時采集水溫,反映給單片機系統
  143. ******************************************/
  144. void dsreset()//DS18B20復位函數
  145. {
  146.         uint i;
  147.         ds=0;
  148.         i=103;
  149.         while(i>0)i--;
  150.         ds=1;
  151.         i=4;
  152.         while(i>0)i--;
  153. }
  154. bit tempreadbit()//從DS18B20 RAM讀一位數據
  155. {
  156.         uint i;
  157.         bit dat;
  158.         ds=0;i++;
  159.         ds=1;i++;i++;
  160.         dat=ds;
  161.         i=8;while(i>0)i--;
  162.         return(dat);
  163. }
  164. uchar tempread()//從DS18B20 RAM讀一字節數據
  165. {
  166.         uchar i,j,dat;
  167.         dat=0;
  168.         for(i=1;i<=8;i++)
  169.         {
  170.                 j=tempreadbit();
  171.                 dat=(j<<7)|(dat>>1);
  172.         }
  173.         return(dat);
  174. }        
  175. void tempwritebyte(uchar dat)//向DS18B20寫以字節的數據
  176. {
  177.         uint i,j;
  178.         bit testb;
  179.         for(j=1;j<=8;j++)
  180.         {
  181.                 testb=dat&0x01;
  182.                 dat=dat>>1;
  183.                 if(testb)//寫1
  184.                 {
  185.                         ds=0;
  186.                         i++;i++;
  187.                         ds=1;
  188.                         i=8;while(i>0)i--;
  189.                 }
  190.                 else//寫0
  191.                 {
  192.                         ds=0;
  193.                         i=8;while(i>0)i--;
  194.                         ds=1;
  195.                         i++;i++;
  196.                 }
  197.         }
  198. }
  199. /*void readrom()
  200. {
  201.         dsreset();
  202.         delay(1);
  203.         tempwritebyte(0x33);
  204.         tempwritebyte(0xbe);
  205.         readrom=tempread();
  206. }
  207. void matchrom()
  208. {
  209.         dsreset();
  210.         delay(1);
  211.         tempwritebyte(0x55);
  212. }*/
  213. void tempchange()//啟動溫度轉換
  214. {
  215.         dsreset();
  216.         delay(1);
  217.         tempwritebyte(0xcc);
  218.         tempwritebyte(0x44);
  219. }
  220. float get_temp()//溫度值讀取與處理函數
  221. {
  222.         uchar a,b;
  223.         dsreset();
  224.         delay(1);
  225.         tempwritebyte(0xcc);
  226.         tempwritebyte(0xbe);
  227.         a=tempread();
  228.         b=tempread();
  229.         temp=b;
  230.         temp<<=8;
  231.         temp=temp|a;
  232.         f_temp=(float)(temp*0.0625);
  233.         f_temp=f_temp*10;
  234.         return(f_temp);
  235. }
  236. /**********************************************
  237.                  12864顯示模塊
  238.    顯示實際溫度制和設定溫度值
  239. **********************************************/
  240. void write_com(uchar com)//向12864寫指令
  241. {
  242.         rs=0;
  243.         wr=0;
  244.         delay(1);
  245.         P0=com;
  246.         lcden=1;
  247.         delay(1);
  248.         lcden=0;
  249.         delay(1);
  250. }
  251. void write_date(uchar date)//向12864寫數據
  252. {
  253.         rs=1;
  254.         wr=0;
  255.         delay(1);
  256.         P0=date;
  257.         lcden=1;
  258.         delay(1);
  259.         lcden=0;
  260.         delay(1);
  261. }
  262. void display(float m,uchar n)//顯示設定溫度、實測溫度、加熱狀態
  263. {
  264.         uint i,j;
  265.         float b;
  266.         float p;
  267.         uchar a1,a2,a3;
  268.         uchar b1,b2,b3,b4;
  269.         if(n<100)
  270.         {
  271.                 a1=0;
  272.                 a2=n/10;
  273.                 a3=n%10;
  274.         }
  275.         else
  276.         {
  277.                 a1=1;
  278.                 a2=0;
  279.                 a3=0;
  280.         }
  281.         p=m;
  282.         j=(uint)(p*10);
  283.         b1=(uchar)(j/1000);
  284.         b2=(uchar)(j%1000/100);
  285.         b3=(uchar)(j%100/10);
  286.         b4=(uchar)(j%10);
  287.         write_com(0x90+5);//顯示設定溫度
  288.         write_date(0x30+a1);
  289.         write_date(0x30+a2);
  290.         write_date(0x30+a3);
  291.         write_com(0x88+5);//顯示實測溫度
  292.         write_date(0x30+b1);
  293.         write_date(0x30+b2);
  294.         write_date(0x2e);
  295.         write_date(0x30+b3);
  296.         write_date(0x30+b4);
  297.         b=((float)(b1*100+b2*10+b3))/10.0;
  298.         i=0;
  299.         if((b+0.2)<n)
  300.         {
  301.                 led1=0;
  302.                 write_com(0x98+1);
  303.                 while(table2[i]!='\0')
  304.                 {
  305.                         write_date(table2[i]);
  306.                         i++;
  307.                 }
  308.                 flag2=1;
  309.         }
  310.         else
  311.         {
  312.                 led1=1;
  313.                 i=0;
  314.                 write_com(0x98+1);
  315.                 while(table8[i]!='\0')
  316.                 {
  317.                         write_date(table8[i]);
  318.                         i++;
  319.                 }
  320.                 i=0;
  321.                 if((b=n)||((b>n)&&((b-0.2)<=n))||((b<n)&&((b+0.2)>=n)))
  322.                 {
  323.                         led2=0;
  324.                         write_com(0x98+4);
  325.                         while(table3[i]!='\0')
  326.                         {
  327.                                 write_date(table3[i]);
  328.                                 i++;
  329.                         }
  330.                 }
  331.         }
  332.         if(flag2==1)
  333.         {
  334.                 flag2=0;
  335.                 led2=1;
  336.                 i=0;
  337.                 write_com(0x98+4);
  338.                 while(table8[i]!='\0')
  339.                 {
  340.                         write_date(table8[i]);
  341.                         i++;
  342.                 }
  343.         }
  344. }
  345. /*****************************************************
  346.                         PID控制算法程序設計
  347. 通過PID控制算法可以使實際水溫在設定水溫周圍呈很小范圍的
  348. 波動,從而使實際水溫值接近設定水溫值
  349. *****************************************************/
  350. void conversion()//定時器2初值處理函數
  351. {
  352.         uint temp2;
  353.         temp2=65536-PWMH*10;
  354.         HighH=temp2/256;
  355.         HighL=temp2%256;
  356. }
  357. void senddate(float y)
  358. {
  359. //        uint i;
  360.         if(flag==1)
  361.         {
  362.                 ES=0;
  363.                 flag=0;
  364.                 c=0;
  365.                 TI=1;
  366.                 printf("The measured temp:%f",y);
  367. //                SBUF=1;
  368.                 while(!TI);
  369.                 TI=0;
  370.                 ES=1;
  371.         }        
  372. }
  373. void init()//初始化函數
  374. {
  375.         uint i,j;
  376.         TMOD=0x21;
  377.         TH1=0xfd;
  378.         TL1=0xfd;
  379.         TH0=(65536-50000)/256;
  380.         TL0=(65536-50000)%256;
  381.         PWMH=0;
  382.         conversion();
  383.         TH2=(65536-50000)/256;
  384.         TL2=(65536-50000)%256;
  385.         rd=1;
  386.         lcden=0;
  387.         write_com(0x30);
  388.         write_com(0x0c);
  389.         write_com(0x01);
  390.         write_com(0x90);
  391.         while(table5[i]!='\0')//系統初始化
  392.         {
  393.                 write_date(table5[i]);
  394.                 i++;
  395.                 delay(20);
  396.         }
  397.         for(j=0;j<=1;j++)//6個點的三次循環
  398.         {
  399.                 write_com(0x88+4);
  400.                 for(i=0;i<=5;i++)
  401.                 {
  402.                         write_date(0x2e);
  403.                         delay(200);
  404.                 }
  405.                 delay(100);
  406.                 write_com(0x88+4);
  407.                 for(i=0;i<=5;i++)
  408.                 {
  409.                         write_date(0x20);
  410.                 }
  411.                 delay(100);
  412.         }
  413.         i=0;
  414.         write_com(0x80);//顯示 水溫控制系統設計標題
  415.         while(table7[i]!='\0')
  416.         {
  417.                 write_date(table7[i]);
  418.                 i++;
  419.         }
  420.         i=0;
  421.         write_com(0x90);//顯示 設定溫度
  422.         while(table[i]!='\0')
  423.         {
  424.                 write_date(table[i]);
  425.                 i++;
  426.         }
  427.         i=0;
  428.         write_com(0x88);//顯示 實測溫度
  429.         while(table1[i]!='\0')
  430.         {
  431.                 write_date(table1[i]);
  432.                 i++;
  433.         }
  434. //        tempwritebyte(0x4e);//設定DS18B20的分辨率為11位
  435. //        tempwritebyte(0x5f);
  436.         PWM=0;
  437.         e1=0;
  438.         e2=0;
  439.         e3=0;
  440.         duk=0;
  441.         uk=0;
  442.         KP=20;//PID控制算法參數
  443.         KI=0.061;
  444.         KD=30;
  445.         REN=1;//串口通信設置
  446.         SM0=0;
  447.         SM1=1;
  448.         ET0=1;
  449.         ET2=1;
  450.         TR0=1;
  451.         TR1=1;
  452.         TR2=1;//啟動定時器2
  453.         EA=1;
  454.         ES=1;
  455. }        
  456. void main()
  457. {
  458.         init();
  459.         while(1)
  460.         {
  461.                 keyscan();//調用鍵盤掃描函數
  462.                 tempchange();//啟動溫度轉換
  463.                 t=get_temp();//提取實測溫度
  464.                 display(t,set_temp);//顯示設定溫度和實測溫度
  465.                 senddate(t);//向上位機發送數據函數
  466.                 if((flag1==1))
  467.                 {
  468.                     if(timecount>=375)
  469.                         {
  470.                                 timecount=0;
  471.                                 e1=set_temp-t;
  472.                                 duk=(KP*(e1-e2)+KI*e1+KD*(e1-2*e2+e3));//PID控制算法式
  473.                             uk=uk+duk;
  474.                                 if(e1>=75)
  475.                                 {
  476.                                         z=4;
  477.                                 }
  478.                                 else if(e1>=50)
  479.                                 {
  480.                                         z=3;
  481. ……………………

  482. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png

所有資料51hei提供下載:
基于51單片機的水溫控制系統.rar (18.56 MB, 下載次數: 916)

評分

參與人數 2黑幣 +65 收起 理由
zbfdyw + 15 共享資料的黑幣獎勵!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:455865 發表于 2018-12-27 10:38 | 顯示全部樓層
我這份程序在原基礎上做了點修改,添加多了一點注釋,但思路基本一致

PID恒溫修改后.zip

100.24 KB, 下載次數: 315, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:345098 發表于 2019-3-20 18:02 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:386691 發表于 2019-4-26 13:13 | 顯示全部樓層
謝謝分享!!
回復

使用道具 舉報

ID:487891 發表于 2019-4-27 15:17 | 顯示全部樓層
學習了
回復

使用道具 舉報

ID:375715 發表于 2019-4-27 19:33 來自手機 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:276416 發表于 2019-5-10 11:33 | 顯示全部樓層
怎么感覺PWM輸出沒有變化
回復

使用道具 舉報

ID:387410 發表于 2019-5-13 20:47 來自手機 | 顯示全部樓層
嗯嗯,謝謝樓主分享,頂起
回復

使用道具 舉報

ID:284093 發表于 2019-8-23 11:42 | 顯示全部樓層
謝謝樓主分享
回復

使用道具 舉報

ID:630180 發表于 2019-10-25 18:03 | 顯示全部樓層
謝謝樓主分享,頂起
回復

使用道具 舉報

ID:545065 發表于 2019-11-27 21:23 | 顯示全部樓層
我問一下 這個電路圖在哪啊
回復

使用道具 舉報

ID:603295 發表于 2019-12-6 23:53 | 顯示全部樓層
頂一個,謝謝樓主
回復

使用道具 舉報

ID:556032 發表于 2020-4-14 23:34 | 顯示全部樓層
感謝,研究中
回復

使用道具 舉報

ID:739691 發表于 2020-4-27 22:39 | 顯示全部樓層
哇.....想自學單片機,但好難啊.....感覺就這個程序我至少要研究一個星期。
回復

使用道具 舉報

ID:413383 發表于 2020-4-28 00:19 | 顯示全部樓層
謝謝樓主分享,頂起
回復

使用道具 舉報

ID:423031 發表于 2020-5-8 16:14 | 顯示全部樓層
謝謝分享~~~~~~~~~·
回復

使用道具 舉報

ID:748312 發表于 2020-5-10 16:50 | 顯示全部樓層
很棒的資料,下載學習,謝謝提供
回復

使用道具 舉報

ID:748653 發表于 2020-5-10 22:06 | 顯示全部樓層
除以800是為什么啊
回復

使用道具 舉報

ID:302666 發表于 2020-5-10 23:16 | 顯示全部樓層
厲害啊,我的鍋
回復

使用道具 舉報

ID:187802 發表于 2020-5-12 12:16 | 顯示全部樓層

很棒的資料,下載學習,謝謝提供
回復

使用道具 舉報

ID:754600 發表于 2020-5-30 22:01 | 顯示全部樓層
沒有仿真請別下載
回復

使用道具 舉報

ID:873326 發表于 2021-4-18 22:55 來自手機 | 顯示全部樓層
有仿真原件嗎
回復

使用道具 舉報

ID:202793 發表于 2021-12-10 20:15 | 顯示全部樓層
學習了真的高手很多
回復

使用道具 舉報

ID:462629 發表于 2021-12-28 10:23 | 顯示全部樓層
高手太厲害了,這個能實用嗎
回復

使用道具 舉報

ID:1073609 發表于 2023-4-23 17:58 來自手機 | 顯示全部樓層
有模糊pid控制水溫的嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频中文字幕 | 羞羞视频在线免费 | 欧美精产国品一二三区 | 成人精品高清 | 狠狠操你 | 成人在线视频免费观看 | 亚洲成人精品在线观看 | 国产一级特黄真人毛片 | 成人av高清| 日韩一区二区三区在线观看 | 午夜影院在线观看视频 | 欧美中文字幕一区二区 | 国产一级黄色网 | 国产夜恋视频在线观看 | 国产高清精品在线 | 日本三级网站在线观看 | 一级毛片黄片 | 欧美激情亚洲 | 国产精品伦一区二区三级视频 | 国产一区二区 | 午夜电影福利 | 欧美日韩中文字幕在线 | 亚洲久久| av三级在线观看 | 亚洲国产aⅴ精品一区二区 免费观看av | 狠狠干天天干 | 女女百合av大片一区二区三区九县 | 久久99精品国产麻豆婷婷 | 欧美大片一区 | 日韩免费在线观看视频 | 久久久精品| 免费在线观看黄色av | 视频一二三区 | av天天看 | 99久久免费精品视频 | 免费一看一级毛片 | 国产精品久久久久久久久久久新郎 | 天堂网中文 | 欧美激情99 | 亚洲国产精品久久久 | 国产91丝袜 |