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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 43160|回復(fù): 73
打印 上一主題 下一主題
收起左側(cè)

基于51單片機+PID恒溫控制器制作

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:155842 發(fā)表于 2017-7-5 22:26 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
制作一個簡易的恒溫控制器學(xué)習(xí)PID。
使用到ds18b20 5V加熱器(TB有賣) 場效應(yīng)管IRF 640N用于開通和關(guān)斷加熱器。
設(shè)置預(yù)設(shè)值,通過PID不斷矯正加熱器輸出,達(dá)到預(yù)設(shè)溫度。

引腳分配    lcd    lcddata:    P0
            lcd_e:        P2^7
            lcd_rs:        P2^6
            lcd_rw:        P2^5
        
        設(shè)置按鍵    limit_choise:        P    //溫度上下限選擇按鍵
                increase_temperature        P    //增加溫度限值按鍵
                reduce_temperature        P    //減少溫度限值按鍵
        
        蜂鳴器報警    warning        P   

        溫度傳感器    temperature_sensor    P

        制熱    heatting    P

        制冷    refrigerating    P

        LED顯示        normal        P    //正常溫度指示燈
                high_temperature    P    //高溫指示燈
                low_temperature        P    //低溫指示燈   

單片機源程序如下:
  1. #include <main.h>
  2. extern unsigned char time_value;
  3. extern bit flag;
  4. int   PWM=0;
  5. int  PWM_I,PWM_P;
  6. unsigned char time_value=0;
  7. bit  flag;
  8. uint temp_m1=0;
  9. int temp_m=0;  //溫度放大100倍后的中轉(zhuǎn)值
  10. int set_temp=0; //設(shè)置溫度*100
  11. void InitTimer0(void)
  12. {
  13.     TMOD = 0x01;
  14.     TH0 = 0x0EC;
  15.     TL0 = 0x078;
  16.     EA = 1;
  17.     ET0 = 1;
  18.     TR0 = 1;
  19. }
  20. void main()//主函數(shù)
  21. {
  22.     init();//初始化函數(shù)
  23.         pid_init (&temp_PID);
  24.         InitTimer0();
  25.     temp_PID.Proportion =120;              //  Set PID Coefficients
  26.     temp_PID.Integral   =5;
  27.     temp_PID.Derivative =2;
  28.    
  29.         
  30.         
  31.   while(1)
  32.         {
  33.                 temp_control();//控制按鍵函數(shù)
  34.                 if(time_value<PWM)      { heatting=1;}else { heatting=0;}
  35.                
  36.                  if(time_value==30)            
  37.                 {
  38.                
  39.                 display_real_tenp(temp_m1);
  40.                 }//顯示函數(shù)        
  41.                 if(time_value==60)      temp_m=unnormal_proccessing(temp_m1);//溫度轉(zhuǎn)換函數(shù)*100
  42.                   if(time_value==100)
  43.          {
  44.                   
  45.                    if(set_temp-temp_m>250)
  46.                    {
  47.                                       PWM=PWM_MAX;
  48.                    }
  49.                    else
  50.                    {
  51.            PWM_I=pid_calc(&temp_PID,temp_m);
  52.            PWM  =PWM_I ;
  53.            if( PWM>=100)PWM=100;
  54.            else if(PWM<=PWM_MIN)  PWM=PWM_MIN;
  55.                    }
  56.                   
  57.                   
  58.                   }
  59.                    if(time_value==120)
  60.          {                PWM_P=PWM/2;
  61.                         LcdWriteCom(0x80+0X40+0x0C);
  62.                                 LcdWriteData('0'+PWM_P/100);
  63.                                  LcdWriteCom(0x80+0X40+0x0D);
  64.                                 LcdWriteData('0'+PWM_P%100/10);
  65.                                 LcdWriteCom(0x80+0X40+0x0E);
  66.                                 LcdWriteData('0'+PWM_P%10);
  67.                  }
  68.         }               
  69. }

  70. void init()//初始化函數(shù)
  71. {
  72.         uint i,j;
  73.         //函數(shù)初始化
  74.         LcdInit();//LCD初始化函數(shù)
  75.         Ds18b20Init();
  76.         
  77.         //I/O口初始化
  78.         heatting=0;//不制熱

  79.         
  80.         //LCD初始化顯示
  81.         LcdWriteCom(0x80);//第一行顯示
  82.         j=strlen(num1);
  83.         for(i=0; i<j; i++)
  84.         {
  85.                 LcdWriteData(num1[i]);        
  86.                 delay_ms(1);
  87.         }
  88.         LcdWriteCom(0x80+0x40);//第二行顯示
  89.         j=strlen(num2);
  90.         for(i=0; i<j; i++)
  91.         {
  92.                 LcdWriteData(num2[i]);        
  93.                 delay_ms(1);
  94.         }
  95.         LcdWriteCom(0x04);  //關(guān)閉寫一個指針加1
  96. }

  97. uint get_temp(uint temp)//計算溫度函數(shù)
  98. {
  99.         float tp;
  100.         
  101.         tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
  102.         //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
  103.         temp=tp*0.0625*100+0.5;        
  104.         //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
  105.         //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  106.         //算加上0.5,還是在小數(shù)點后面。
  107.         return temp;
  108. }

  109. void display_real_tenp(uint temp)//實時溫度顯示函數(shù)
  110. {
  111.         uchar datas[] = {0, 0, 0, 0}; //定義數(shù)組

  112.         datas[0] = temp % 10000 / 1000;
  113.         datas[1] = temp % 1000 / 100;
  114.         datas[2] = temp % 100 / 10;
  115.         datas[3] = temp % 10;

  116.         LcdWriteCom(0x80+0x0a);                 //寫地址 80表示初始地址
  117.         LcdWriteData('0'+datas[0]); //十位

  118.         LcdWriteCom(0x80+0x0b);        //寫地址 80表示初始地址
  119.         LcdWriteData('0'+datas[1]); //個位

  120.         LcdWriteCom(0x80+0x0d);         //寫地址 80表示初始地址
  121.         LcdWriteData('0'+datas[2]); //顯示小數(shù)點  

  122.         LcdWriteCom(0x80+0x0e);                 //寫地址 80表示初始地址
  123.         LcdWriteData('0'+datas[3]); //顯示小數(shù)點  

  124. }

  125. void temp_control()//控制溫度上下限函數(shù)
  126. {
  127.         if(limit_choise==0)//選擇按鍵
  128.         {
  129.                 delay_ms(5);
  130.                 if(limit_choise==0)
  131.                 {
  132.                         while(!limit_choise);
  133.                         limit_choise_num++;
  134.                         if(limit_choise_num>=2)
  135.                         {
  136.                                 limit_choise_num=0;
  137.                         }
  138.                 }
  139.         }
  140.         if(limit_choise_num==0)//正常顯示
  141.         {
  142.                 LcdWriteCom(0x0c);//關(guān)閉光標(biāo)
  143.         
  144.         }
  145.                         
  146.         if(limit_choise_num==1)//調(diào)節(jié)上限溫度
  147.         {
  148.                 LcdWriteCom(0x80+0X40+2);
  149.                 LcdWriteCom(0x0f);//開啟光標(biāo)
  150.                 if(increase_temperature==0)//增加溫度
  151.                 {
  152.                         delay_ms(5);
  153.                         if(increase_temperature==0)
  154.                         {
  155.                                 while(!increase_temperature);
  156.                                 up_limit_temp++;
  157.                                 if(up_limit_temp>=100)
  158.                                 {
  159.                                         up_limit_temp=0;
  160.                                 }
  161.                                 //寫入新數(shù)據(jù)
  162.                                 LcdWriteCom(0x80+0X40+0x03);
  163.                                 LcdWriteData('0'+up_limit_temp/10);
  164.                                 LcdWriteCom(0x80+0X40+0x04);
  165.                                 LcdWriteData('0'+up_limit_temp%10);
  166.                                 LcdWriteCom(0x80+0X40+2);//光標(biāo)回寫
  167.                         }
  168.                 }
  169.                 if(reduce_temperature==0)//減少溫度
  170.                 {
  171.                         delay_ms(5);
  172.                         if(reduce_temperature==0)
  173.                         {
  174.                                 while(!reduce_temperature);
  175.                                 up_limit_temp--;
  176.                                 if(up_limit_temp<0)
  177.                                 {
  178.                                         up_limit_temp=99;
  179.                                 }
  180.                                 //寫入新數(shù)據(jù)
  181.                                 LcdWriteCom(0x80+0X40+0x03);
  182.                                 LcdWriteData('0'+up_limit_temp/10);
  183.                                 LcdWriteCom(0x80+0X40+0x04);
  184.                                 LcdWriteData('0'+up_limit_temp%10);
  185.                                 LcdWriteCom(0x80+0X40+2);//光標(biāo)回寫
  186.                         }
  187.                 }

  188.         }
  189.          set_temp=up_limit_temp*100;
  190.         temp_PID.SetPoint   =set_temp;
  191.         
  192. }

  193. int unnormal_proccessing(uint temp)//溫度轉(zhuǎn)換函數(shù)
  194. {
  195.         uchar datas[] = {0, 0, 0, 0}; //定義數(shù)組
  196.         int temp1=0;

  197.         datas[0] = temp % 10000 / 1000;
  198.         datas[1] = temp % 1000 / 100;
  199.         datas[2] = temp % 100 / 10;
  200. ……………………

  201. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
PID恒溫控制器.zip (104.42 KB, 下載次數(shù): 1186)


評分

參與人數(shù) 6黑幣 +133 收起 理由
水木之 + 6
karo + 5 贊一個!
nipi + 5 贊一個!
zkele + 10 共享資料的黑幣獎勵!贊一個!高手
tieq1952 + 7 贊一個!
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

來自 2#
ID:149988 發(fā)表于 2017-7-12 06:22 | 只看該作者

RE: 基于51單片機+PID恒溫控制器制作

樓主朋友:請教一下,
pp->SumError=-500;  中pp->是什么意思?  pp是什么意思?
temp_PID.SetPoint=set_temp;中的“.”是什么意思?set_temp值究竟賦給了誰?我做過實驗,如果本句修改為SetPoint=set_temp;  或  temp_PID=set_temp;  SetPoint=set_temp;兩句,程序總體好用,當(dāng)溫度回降到脈寬接近100%輸出時,有一段時間無輸出,當(dāng)溫度回降到脈寬輸出為100%時輸出恢復(fù)正常。謝謝樓主。
回復(fù)

使用道具 舉報

來自 3#
ID:342294 發(fā)表于 2018-8-22 16:33 | 只看該作者
你里面的左移  右移是不是弄錯了  或者你注釋有誤                  byte = (byte >> 1) | (bi << 7);        這一段的注釋是不是有誤   你看看   但是這個PID算法  還是滿真確的  而且用到了 結(jié)構(gòu)體指針    感覺非常高大上                                       

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

來自 4#
ID:342294 發(fā)表于 2018-8-22 16:36 | 只看該作者
不倒翁.WZT 發(fā)表于 2017-7-12 06:22
樓主朋友:請教一下,
pp->SumError=-500;  中pp->是什么意思?  pp是什么意思?
temp_PID.SetPoint=set_ ...

此乃結(jié)構(gòu)體指針 pp->SumError=-500; 相當(dāng)于(*pp).SumError    為了方便用pp->代替(*pp)

評分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

5#
ID:89286 發(fā)表于 2017-7-6 04:40 | 只看該作者
thanks for sharing
回復(fù)

使用道具 舉報

6#
ID:96326 發(fā)表于 2017-7-6 08:16 | 只看該作者
感謝分享!
回復(fù)

使用道具 舉報

7#
ID:61135 發(fā)表于 2017-7-6 09:12 | 只看該作者
兄弟沒視頻嗎
回復(fù)

使用道具 舉報

8#
ID:102702 發(fā)表于 2017-7-6 09:22 | 只看該作者
樓主是否能提供一下相關(guān)電路圖,謝謝
回復(fù)

使用道具 舉報

9#
ID:155842 發(fā)表于 2017-7-6 13:23 | 只看該作者
raymondau 發(fā)表于 2017-7-6 09:22
樓主是否能提供一下相關(guān)電路圖,謝謝

電路圖太丑  不要介意

WENKONG.rar

19.62 KB, 下載次數(shù): 252, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

10#
ID:155842 發(fā)表于 2017-7-6 13:25 | 只看該作者

沒有視頻,這個控制可以在設(shè)置溫度上下0.3度浮動。有時間的可以慢慢調(diào)
回復(fù)

使用道具 舉報

11#
ID:102702 發(fā)表于 2017-7-6 16:31 | 只看該作者
離譜 發(fā)表于 2017-7-6 13:23
電路圖太丑  不要介意

謝謝樓主,請問能發(fā)一下電路圖嗎?您發(fā)的這個是PCB圖啊
回復(fù)

使用道具 舉報

12#
ID:155842 發(fā)表于 2017-7-6 16:49 | 只看該作者
raymondau 發(fā)表于 2017-7-6 16:31
謝謝樓主,請問能發(fā)一下電路圖嗎?您發(fā)的這個是PCB圖啊

找了很久才找到

電路圖.jpg (76.17 KB, 下載次數(shù): 303)

電路圖

電路圖

PID溫度控制.zip

13.8 KB, 下載次數(shù): 233, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報

13#
ID:102702 發(fā)表于 2017-7-6 20:16 | 只看該作者

收到了,謝謝
回復(fù)

使用道具 舉報

14#
ID:249705 發(fā)表于 2017-11-21 16:32 | 只看該作者
有仿真嗎?兄弟
回復(fù)

使用道具 舉報

15#
ID:49377 發(fā)表于 2017-12-11 10:05 | 只看該作者
收到了,支持
回復(fù)

使用道具 舉報

16#
ID:226140 發(fā)表于 2017-12-27 20:39 | 只看該作者
在這里面,算法起到了什么樣的作用??
回復(fù)

使用道具 舉報

17#
ID:253767 發(fā)表于 2017-12-28 07:56 | 只看該作者
有實用價值
回復(fù)

使用道具 舉報

18#
ID:155842 發(fā)表于 2017-12-31 23:37 | 只看該作者
gdfg 發(fā)表于 2017-12-27 20:39
在這里面,算法起到了什么樣的作用??

自動控制輸出,保持設(shè)定溫度
回復(fù)

使用道具 舉報

19#
ID:155842 發(fā)表于 2017-12-31 23:38 | 只看該作者

互相學(xué)習(xí)
回復(fù)

使用道具 舉報

20#
ID:230607 發(fā)表于 2018-3-11 16:59 | 只看該作者
學(xué)習(xí)了
回復(fù)

使用道具 舉報

21#
ID:168356 發(fā)表于 2018-3-23 15:19 | 只看該作者
學(xué)習(xí)一下PID
回復(fù)

使用道具 舉報

22#
ID:297180 發(fā)表于 2018-3-26 14:28 | 只看該作者
請問在這基礎(chǔ)上,怎么增加遙控控制溫度增減開關(guān)。
回復(fù)

使用道具 舉報

23#
ID:297180 發(fā)表于 2018-3-26 14:36 | 只看該作者
在此基礎(chǔ)上,怎么增加遙控控制溫度
回復(fù)

使用道具 舉報

24#
ID:241772 發(fā)表于 2018-4-16 22:28 | 只看該作者
厲害了!學(xué)習(xí)!
回復(fù)

使用道具 舉報

25#
ID:311423 發(fā)表于 2018-4-19 09:58 | 只看該作者
可否告知下樓主QQ,謝謝
回復(fù)

使用道具 舉報

26#
ID:97811 發(fā)表于 2018-4-23 07:12 | 只看該作者
謝謝分享!學(xué)習(xí)了
回復(fù)

使用道具 舉報

27#
ID:314339 發(fā)表于 2018-4-24 08:45 來自手機 | 只看該作者
學(xué)習(xí)了,學(xué)習(xí)pid
回復(fù)

使用道具 舉報

28#
ID:257292 發(fā)表于 2018-4-28 19:12 | 只看該作者
老哥,你的5V加熱器是多少瓦的,使用什么給他供電
回復(fù)

使用道具 舉報

29#
ID:155842 發(fā)表于 2018-5-15 17:20 | 只看該作者
qq984304095 發(fā)表于 2018-4-28 19:12
老哥,你的5V加熱器是多少瓦的,使用什么給他供電

2W   可以用充電寶供電
回復(fù)

使用道具 舉報

30#
ID:155842 發(fā)表于 2018-5-15 17:21 | 只看該作者
顧新鑫 發(fā)表于 2018-3-26 14:36
在此基礎(chǔ)上,怎么增加遙控控制溫度

遙控只需要設(shè)置一個變量,遠(yuǎn)程數(shù)據(jù)傳過來的時候使用這個變量接收就好
回復(fù)

使用道具 舉報

31#
ID:329417 發(fā)表于 2018-5-16 16:40 | 只看該作者
樓主還在不。
回復(fù)

使用道具 舉報

32#
ID:357697 發(fā)表于 2018-6-24 12:15 | 只看該作者
可以學(xué)習(xí)了
回復(fù)

使用道具 舉報

33#
ID:259210 發(fā)表于 2018-6-26 12:05 | 只看該作者
感謝樓主的分享
回復(fù)

使用道具 舉報

34#
ID:61135 發(fā)表于 2018-6-26 20:54 | 只看該作者
無法下載了????
回復(fù)

使用道具 舉報

35#
ID:268570 發(fā)表于 2018-6-28 14:54 | 只看該作者
thank you。能不能有電路圖一起學(xué)習(xí)學(xué)習(xí),小白一個
回復(fù)

使用道具 舉報

36#
ID:361719 發(fā)表于 2018-7-5 18:08 | 只看該作者
好東西 ,學(xué)習(xí)了
回復(fù)

使用道具 舉報

37#
ID:264029 發(fā)表于 2018-7-12 22:53 | 只看該作者
學(xué)習(xí)PID
回復(fù)

使用道具 舉報

38#
ID:357876 發(fā)表于 2018-8-20 20:31 | 只看該作者
非常好!
回復(fù)

使用道具 舉報

39#
ID:390412 發(fā)表于 2018-8-27 14:30 | 只看該作者
可以
回復(fù)

使用道具 舉報

40#
ID:97811 發(fā)表于 2018-8-30 10:36 | 只看該作者
非常感謝樓主分享,今天試了一下,還有PWM 輸出顯示,挺不錯的
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 麻豆精品国产91久久久久久 | 国产精品亚洲二区 | 台湾a级理论片在线观看 | 久久久久久久一区二区三区 | 精品国产99| 精品视频一区二区 | 久久91av | 91视频网址 | 欧美一级久久 | 欧美日韩精品久久久免费观看 | 国产精品一二三区 | 亚洲精品久久久久久久久久久久久 | 日韩av第一页 | 久久久久久成人 | 免费看一区二区三区 | 欧美极品在线 | 黄色一级片aaa| 91久久夜色精品国产网站 | 国产成人精品免高潮在线观看 | 久久99精品久久久 | av黄在线观看 | 日本特黄a级高清免费大片 国产精品久久性 | 美女久久久久 | 日韩在线视频精品 | 欧美日韩国产一区二区三区 | 嫩草国产 | 欧美激情综合五月色丁香小说 | 亚洲精品电影网在线观看 | 久久久久亚洲精品 | 欧美精品一区三区 | 成年人的视频免费观看 | 人人干在线 | 国产午夜精品久久久久 | 日韩欧美一区在线 | 国产视频亚洲视频 | 亚洲在线免费观看 | 亚洲精选一区二区 | 日韩中文一区二区三区 | 欧美视频 | 99久久免费精品国产男女高不卡 | 国产日韩一区二区 |