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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4482|回復: 2
打印 上一主題 下一主題
收起左側

51單片機PID恒溫程序設計

  [復制鏈接]
跳轉到指定樓層
樓主
我控制電路主要包括,數碼管顯示電路、按鍵電路、報警電路、H型全橋式驅動電熱絲電路、溫度檢測電路及其控制電路。
如下圖

通過代碼控制使系統恒溫,溫度可以通過單片機設置,可以加減溫度。溫度的穩定是通過PID控制的,通過PID使溫度差保持在百分之5內。

下面是PID控制程序
  1. void wendu_regulation_PID() //PID 控制調節溫度子程序
  2. {
  3.         float PWM_out;
  4.         Kp_PID=16;Ki_PID=18.2;Kd_PID=4.8;
  5.         ek_PID[j]=wendu-w;
  6. switch(j)
  7. {
  8.         case
  9.         2:PWM_out=Kp_PID*(ek_PID[j]-ek_PID[j-1])+Ki_PID*ek_PID[j]+Kd_PID*(
  10.         ek_PID[j]-2*ek_PID[j-1]+ek_PID[j-2]);break;
  11.         case
  12.         1:PWM_out=Kp_PID*(ek_PID[j]-ek_PID[j-1])+Ki_PID*ek_PID[j]+Kd_PID*(
  13.         ek_PID[j]-2*ek_PID[j-1]+ek_PID[j+1]);break;
  14.         case
  15.         0:PWM_out=Kp_PID*(ek_PID[j]-ek_PID[j+2])+Ki_PID*ek_PID[j]+Kd_PID*(
  16.         ek_PID[j]-2*ek_PID[j+2]+ek_PID[j+1]);break;
  17. }
  18.         PWM=PWM_out;
  19.         if(PWM>100) PWM=100;
  20.         if(PWM<0) PWM=0;
  21.         j++;
  22.         if(j==3) j=0;
  23. }
復制代碼
其中的數據要自己不斷試驗方可

單片機源程序如下:
  1. /**************************************************************************************
  2. *                              DS18B20溫度傳感器實驗                                                                                                  *
  3. 實現現象:        具體接線操作請看視頻。
  4.                         下載程序后,在溫度傳感器接口處,按照絲印方向插好溫度傳感器,數碼管就會顯示
  5.                         檢測的溫度值,
  6. 注意事項:                                                                                                                                                                  
  7. ***************************************************************************************/

  8. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
  9. #include"temp.h"       

  10. typedef unsigned int u16;          //對數據類型進行聲明定義
  11. typedef unsigned char u8;

  12. sbit LSA=P2^2;
  13. sbit LSB=P2^3;
  14. sbit LSC=P2^4;
  15. sbit k3=P1^0;
  16. sbit k1=P1^1;
  17. sbit k2=P1^2;
  18. sbit beep=P1^3;
  19. char num=0;
  20. u8 DisplayData[8];
  21. u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  22. u16 wendu=3160;
  23. u16 PWM;
  24. u16 w;
  25. u8 Kd_PID,Kp_PID,Ki_PID,ek_PID[3];
  26. u16 a=0;
  27. u8 j;

  28. /*******************************************************************************
  29. * 函 數 名         : delay
  30. * 函數功能                   : 延時函數,i=1時,大約延時10us
  31. *******************************************************************************/
  32. void delay(u16 i)
  33. {
  34.         while(i--);       
  35. }



  36. void ad()        //定時器初始化
  37. {
  38.          TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
  39.         TH0=0XFC;        //給定時器賦初值,定時1ms
  40.         TL0=0X18;       
  41.         ET0=1;//打開定時器0中斷允許
  42.         EA=1;//打開總中斷
  43.         TR0=1;//打開定時器
  44. }



  45. /*******************************************************************************
  46. * 函 數 名         : datapros()
  47. * 函數功能                   : 溫度讀取處理轉換函數
  48. * 輸    入         : temp
  49. * 輸    出         : 無
  50. *******************************************************************************/

  51. void datapros(int temp)          
  52. {
  53.            float tp;  
  54.         if(temp< 0)                                //當溫度值為負數
  55.           {
  56.                 DisplayData[0] = 0x40;           //   -
  57.                 //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  58.                 temp=temp-1;
  59.                 temp=~temp;
  60.                 tp=temp;
  61.                 temp=tp*0.0625*100+0.5;       
  62.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  63.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  64.                 //算加上0.5,還是在小數點后面。

  65.           }
  66.         else
  67.           {                       
  68.                 DisplayData[0] = 0x00;
  69.                 tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  70.                 //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  71.                 temp=tp*0.0625*100+0.5;       
  72.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  73.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  74.                 //算加上0.5,還是在小數點后面。
  75.         }
  76.         DisplayData[0] = smgduan[temp % 10000 / 1000];
  77.         DisplayData[1] = smgduan[temp % 1000 / 100] | 0x80;
  78.         DisplayData[2] = smgduan[temp % 100 / 10];
  79.         DisplayData[3] = smgduan[temp % 10];
  80.         DisplayData[4] = smgduan[wendu /1000];
  81.         DisplayData[5] = smgduan[wendu % 1000/100]| 0x80;
  82.         DisplayData[6] = smgduan[wendu % 100/10];
  83.         DisplayData[7] = smgduan[wendu %10];
  84.        
  85. }


  86. /*******************************************************************************
  87. * 函 數 名         : keypros1
  88. * 函數功能                   : 按鍵處理函數,判斷按鍵k1是否按下
  89. ********************************************************************************/
  90. void keypros1()
  91. {
  92.         if(k1==0)                  //檢測按鍵K1是否按下
  93.         {       
  94.                 delay(1000);   //消除抖動 一般大約10ms
  95.                 if(k1==0)         //再次判斷按鍵是否按下
  96.                 {
  97.                         wendu=wendu+10;          //溫度加0.1度
  98.                 }
  99.                 while(!k1);         //檢測按鍵是否松開
  100.         }               
  101. }                    

  102. /*******************************************************************************
  103. * 函 數 名         : keypros2
  104. * 函數功能                   : 按鍵處理函數,判斷按鍵k2是否按下
  105. *******************************************************************************/
  106. void keypros2()
  107. {
  108.         if(k2==0)                  //檢測按鍵K2是否按下
  109.         {       
  110.                 delay(1000);   //消除抖動 一般大約10ms
  111.                 if(k2==0)         //再次判斷按鍵是否按下
  112.                 {
  113.                         wendu=wendu-10;          //溫度減0.1度
  114.                 }
  115.                 while(!k2);         //檢測按鍵是否松開
  116.         }               
  117. }



  118. /*******************************************************************************
  119. * 函數名         :DigDisplay()
  120. * 函數功能                 :數碼管顯示函數
  121. * 輸入           : 無
  122. * 輸出                  : 無
  123. *******************************************************************************/
  124. void DigDisplay()
  125. {
  126.         u8 i;
  127.         for(i=0;i<8;i++)
  128.         {
  129.                 switch(i)         //位選,選擇點亮的數碼管,
  130.                 {
  131.                         case(0):
  132.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  133.                         case(1):
  134.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  135.                         case(2):
  136.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  137.                         case(3):
  138.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  139.                         case(4):
  140.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  141.                         case(5):
  142.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  143.                     case(6):
  144.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  145.                         case(7):
  146.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位
  147.                        
  148.                 }
  149.                 P0=DisplayData[i];//發送數據
  150.                 delay(100); //間隔一段時間掃描       
  151.                 P0=0x00;//消隱
  152.         }               
  153. }

  154. /*******************************************************************************
  155. * 函 數 名       : heat
  156. * 函數功能                 : PWM 調壓控溫子程序
  157. * 輸    入       : 無
  158. * 輸    出             : 無
  159. *******************************************************************************/
  160. void heat(PWM) //PWM 調壓控溫子程序
  161. {
  162.          if(a<PWM)
  163.          k3=1;
  164.         if(a>PWM)
  165.                 {k3=0;}
  166.         if(a>100){a=0;}
  167. }       


  168. /*******************************************************************************
  169. * 函 數 名       : wendu_bili
  170. * 函數功能                 : 比例控制調節速度子程序
  171. * 輸    入       : 無
  172. * 輸    出             : 無
  173. *******************************************************************************/
  174. void wendu_regulation_PID() //PID 控制調節溫度子程序
  175. {
  176.         float PWM_out;
  177.         Kp_PID=16;Ki_PID=18.2;Kd_PID=4.8;
  178.         ek_PID[j]=wendu-w;
  179. switch(j)
  180. {
  181.         case
  182.         2:PWM_out=Kp_PID*(ek_PID[j]-ek_PID[j-1])+Ki_PID*ek_PID[j]+Kd_PID*(
  183.         ek_PID[j]-2*ek_PID[j-1]+ek_PID[j-2]);break;
  184.         case
  185.         1:PWM_out=Kp_PID*(ek_PID[j]-ek_PID[j-1])+Ki_PID*ek_PID[j]+Kd_PID*(
  186.         ek_PID[j]-2*ek_PID[j-1]+ek_PID[j+1]);break;
  187.         case
  188.         0:PWM_out=Kp_PID*(ek_PID[j]-ek_PID[j+2])+Ki_PID*ek_PID[j]+Kd_PID*(
  189.         ek_PID[j]-2*ek_PID[j+2]+ek_PID[j+1]);break;
  190. }
  191.         PWM=PWM_out;
  192.         if(PWM>100) PWM=100;
  193.         if(PWM<0) PWM=0;
  194.         j++;
  195.         if(j==3) j=0;
  196. }                                       




  197. /*******************************************************************************
  198. * 函 數 名       : main
  199. * 函數功能                 : 主函數
  200. * 輸    入       : 無
  201. * 輸    出             : 無
  202. *******************************************************************************/
  203. void main()
  204. {                ad();       
  205.         while(1)
  206. {        
  207.                         int qq;
  208.                       keypros1();  //溫度加0.1                 
  209.                    keypros2();        //溫度減0.1
  210.                    qq=Ds18b20ReadTemp();
  211.                    datapros(qq);         //數據處理函數
  212.                    w=qq*0.0625*100+0.5;         //浮點數變成整數
  213.                   
  214.                          wendu_regulation_PID();
  215.                           heat(PWM);
  216.                          DigDisplay();//數碼管顯示函數
  217.                         if(w>59.4||w<19.8)
  218.                    {beep=~beep;delay(100);}       
  219.         }               
  220. }

  221. void Timer0() interrupt 1//定時器 T0 定時 0.01 秒
  222. { static u16 i;
  223.         TH0=0xFC;
  224.         TL0=0x18;
  225.         i++;
  226.         if(i==10) //定時達到 0.01 秒讀取溫度傳感器的溫度值
  227. {               
  228.                 a++; i=0;
  229.                  
  230. }
  231.        
  232. }                                  
復制代碼
下面的源代碼下載鏈接
PID.rar (45.36 KB, 下載次數: 140)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:57896 發表于 2019-7-16 18:27 | 只看該作者
不錯,有空仿真一下看看
回復

使用道具 舉報

板凳
ID:77840 發表于 2021-3-30 16:27 | 只看該作者
井井有條,每個函數都單獨注解出來,讓我們這些初學者一目了然,各個函數和語法功能都能清晰看到如何使用。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩中文字幕 | 黄色一级片在线播放 | 日韩中文字幕一区二区 | 国产欧美在线一区 | 国产精品美女久久久久久免费 | 日韩毛片在线视频 | 国产精品乱码一区二区三区 | 亚洲精品一区二区三区 | 九九久久99 | 亚洲欧美视频一区二区 | 亚洲国产成人精品女人久久久 | 羞羞网站在线免费观看 | 色综合久久久 | 久久国产美女视频 | 欧美综合一区二区三区 | 国产偷录叫床高潮录音 | 国产1区 | a级在线 | 999热在线视频 | 色婷婷av99xx | 亚洲精品一区二区三区四区高清 | 五月婷婷丁香婷婷 | 欧美日韩淫片 | 欧美成人自拍 | 国产成人一区在线 | 日韩一区二区在线视频 | 亚洲视频 欧美视频 | 91色视频在线观看 | 欧美精品一区在线发布 | 久草网站 | 中文字幕在线观看一区二区 | 精品一区二区三区在线观看 | 国产在线网址 | 久久久久久亚洲国产精品 | 国产亚洲一级 | 欧美在线视频二区 | 久久夜视频 | 男人天堂手机在线视频 | 亚洲精品乱码久久久久久9色 | 成人精品一区二区三区中文字幕 | 亚洲一二三在线 |