欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5571|回復: 4
收起左側

51單片機+max6675模塊+K型熱電偶的高溫可調PID溫控系統源程序

[復制鏈接]
ID:512894 發表于 2019-6-17 13:36 | 顯示全部樓層 |閱讀模式
單片機源程序如下:
  1. #include <reg52.h>
  2. #include<intrins.h>
  3. #include<string.h>
  4. #include <stdio.h>
  5. #include <math.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int//位定義
  8. //max6675
  9. sbit SO= P1^0;
  10. sbit CS= P1^1;
  11. sbit SCK=P1^2;
  12. //按鍵
  13. sbit key1=P1^5;                //功能鍵
  14. sbit key2=P1^6;                //+
  15. sbit key3=P1^7;                //-
  16. sbit BEEP=P1^3;                //蜂鳴器
  17. sbit RELAY=P1^4;        //繼電器
  18. //DAC0832
  19. //sbit CSDA=P3^2;
  20. //sbit wr=P3^6;

  21. //int high_limit=1250; //上限溫度,默認值為1250
  22. int Temp_set=250;    //設定目標溫度,默認值為250
  23. int Temp_true;
  24. int set_status=0;
  25. uchar qian=0,bai=0,shi=0,ge=0,xiao=0;
  26. uchar smg[8];
  27. //float Kp,Ki,Kd;
  28. uchar num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰極數碼管賦值  0,1,2,3,4,5,6,7,8,9
  29. //uchar num_p[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共陽極數碼管帶小數點賦值  0,1,2,3,4,5,6,7,8,9
  30. uchar choose[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//數碼管位選
  31. //sbit dula=P2^6;        //數碼管段選,鎖存器控制信號
  32. //sbit wela=P2^7;        //數碼管位選,鎖存器控制信號
  33. uint  Re_Convert();        //熱電偶數據讀取,返回溫度
  34. //int ek=0;
  35. //int eset_statu=0;                //第K-1采樣時的偏差值,Error[-1]
  36. //int ek2=0;                        //第K-2采樣時的偏差值,Error[-2]
  37. //float LastOutput=0;        //上次PID輸出
  38. //float Output=0;                //PID的輸出
  39. //uchar high_time,low_time,count=0;                //占空比調節參數
  40. //---------------------------延時子程序---------------------------//
  41. void delay(uint z)
  42. {
  43.         uint i,j;
  44.         for(i=z;i>0;i--)
  45.                 for(j=110;j>0;j--);
  46. }
  47. void delay_50ms(uint m)
  48. {
  49.         uchar x,y;  
  50.         for(x=m;x>0;x--)
  51.                 for(y=50;y>0;y--) ;
  52. }
  53. /*********** MAX6675函數***********/
  54. uint Re_Convert() //熱電偶數據讀取,返回溫度
  55. {
  56.         long int a=0x7ff8;
  57.         long int wendu=0,wendu_1;
  58.         float wendu_2;
  59.     uint i;
  60.         CS=1;
  61.         SCK=0;
  62.         delay(200);
  63.         _nop_();
  64.         _nop_();
  65.         CS=0;
  66.         for(i=1;i<=16;i++)
  67.           {        wendu=wendu<<1;
  68.                 _nop_();
  69.                  SCK=1;
  70.                 if(SO==1){wendu=wendu|0x01;}
  71.                    else wendu=wendu|0x00;
  72.                 _nop_();
  73.                 _nop_();
  74.                 SCK=0;
  75.                 _nop_();
  76.                 _nop_();
  77.           }
  78.         wendu_1=wendu&a;
  79.         wendu_1=wendu_1>>3;
  80.         wendu_2=wendu_1*0.25;
  81.         return wendu_2;                        //返回帶兩位小數的實際溫度
  82.         //wendu=wendu_2*100;        //放大100倍轉成整型常數
  83.         //return wendu;                        //返回整型常數便于顯示小數位數字
  84. }
  85. //*************溫度顯示程序*******************//
  86. void Disp_temp_true(uint temp)//溫度顯示
  87. {
  88.           unsigned char i;
  89.         unsigned int j;
  90.         ge=temp%10; //取個數位數字
  91.         temp=temp/10;
  92.         shi=temp%10;//取十位數字
  93.         temp=temp/10;
  94.         bai=temp%10;//取百位數字
  95.         qian=temp/10;//取千位數字
  96.           smg[0]=num[qian];
  97.         smg[1]=num[bai];
  98.         smg[2]=num[shi];
  99.         smg[3]=num[ge];
  100.         /*
  101.         for(i=0; i<4; i++)
  102.         {
  103.                 P2=choose[i];  //數碼管位選
  104.                 P0=smg[i];  //送數字到段碼端口,顯示數字
  105.                 j = 10;                        //掃描間隔時間設定
  106.                 while(j--);        
  107.                 P0 = 0x00;//消隱
  108.         }
  109.         */
  110. }

  111. //*************溫度設置顯示程序*******************//
  112. void Disp_temp_set(uint set)//溫度設置顯示
  113. {
  114.          unsigned char i;
  115.         unsigned int j;
  116.         ge=set%10; //取個數位數字
  117.         set=set/10;
  118.         shi=set%10;//取十位數字
  119.         set=set/10;
  120.         bai=set%10;//取百位數字
  121.         qian=set/10;//取千位數字
  122.           smg[4]=num[qian];
  123.         smg[5]=num[bai];
  124.         smg[6]=num[shi];
  125.         smg[7]=num[ge];
  126.         /*
  127.         for(i=4; i<8; i++)
  128.         {
  129.                 P2=choose[i];  //數碼管位選
  130.                 P0=smg[i];  //送數字到段碼端口,顯示數字
  131.                 j = 10;                        //掃描間隔時間設定
  132.                 while(j--);        
  133.                 P0 = 0x00;//消隱
  134.         }
  135.         */
  136. }


  137. //*************報警子程序*******************//
  138. void Alarm()//蜂鳴器間斷
  139. {
  140.         if(Temp_true>Temp_set)
  141.         {
  142.                 int b;
  143.                 for(b=100;b>0;b--)
  144.                 {
  145.                         BEEP=1;
  146.                         delay_50ms(10);
  147.                         BEEP=0;
  148.                         delay_50ms(10);
  149.                 }
  150.         }
  151. }

  152. void compare_temper()
  153. {
  154.         uint temper=Temp_true;
  155.         if(temper>=Temp_set)                //實際溫度是否大于設置的溫度
  156.         {
  157.                 RELAY=1;
  158.         }
  159.         else if(temper<Temp_set)
  160.         {
  161.                 RELAY=0;
  162.         }
  163. }

  164. //*******按鍵子程序*******//
  165. void keyset()
  166. {
  167.         #if 1
  168.                 if(key1 == 0){
  169.                         set_status =!set_status;
  170.                 }
  171.                 if(set_status==1){
  172.                         if(key1==0)
  173.                         {
  174.                                 set_status =!set_status;
  175.                         }

  176.                         if(key2==0)
  177.                         {
  178.                                 Temp_set=Temp_set+10;
  179.                                 Disp_temp_set(Temp_set);
  180.                                 //delay_50ms(1);
  181.                                 //while(!key2);
  182.                         }

  183.                         if(key3==0)
  184.                         {
  185.                                 Temp_set=Temp_set-10;
  186.                                 Disp_temp_set(Temp_set);
  187.                                 //delay_50ms(10);
  188.                                 //while(!key3);
  189.                         }
  190.                 }
  191.         }
  192.         #else
  193.                
  194.         if(set_status==0)
  195.         {
  196.                 if(key1==0)
  197.                 {
  198.                         set_status=1;
  199.                 }
  200.         }
  201.         else{
  202.                 //while(set_status==1)
  203.                 {
  204.                         if(key1==0)
  205.                         {
  206.                                 set_status=0;
  207.                         }

  208.                         if(key2==0)
  209.                         {
  210.                                 Temp_set=Temp_set+10;
  211.                                 Disp_temp_set(Temp_set);
  212.                                 //delay_50ms(1);
  213.                                 //while(!key2);
  214.                         }

  215.                         if(key3==0)
  216.                         {
  217.                                 Temp_set=Temp_set-10;
  218.                                 Disp_temp_set(Temp_set);
  219.                                 //delay_50ms(10);
  220.                                 //while(!key3);
  221.                         }
  222.                 //}

  223.         }  
  224.         #endif
  225. }

  226. void init_sys() //系統初始化
  227. {
  228. IT0=1;
  229. EX0=1;
  230. ET0=1;
  231. EA=1;
  232. TMOD=1;
  233.         TH0=0xfc;
  234.         TL0=0x66;//裝初值,定時時間為1ms
  235.         ET0=1;        //打開定時器0的大門
  236.         TR0=1;
  237. P0=0xc0;

  238. }


  239. //*************主程序*******************//
  240. void main()
  241. {  
  242. //        Kp=1.2;
  243. //        Ki=3.4;
  244. //        Kd=5.6;
  245.         init_sys();
  246.         delay_50ms(1);
  247.         while(1)
  248.         {  
  249.                 Temp_true=Re_Convert();// 熱電偶數據讀取,返回溫度
  250.                 compare_temper();
  251.                 Disp_temp_true(Temp_true);
  252.                 Disp_temp_set(Temp_set);
  253.                 //if(key1==0)
  254.                 {
  255.                         keyset();
  256.                 }
  257.                 //PID();  
  258.                 Alarm();
  259.                 //delay_50ms(6);
  260.         }
  261. }

  262. void Dsqi0() interrupt 1
  263. {
  264.         long int i=0;
  265.         uchar c=0xfe;
  266.     TH0=0xfc;
  267.     TL0=0x66;
  268.         P2=0xff;
  269.         P0=smg[i];
  270.         P2=c;
  271.         c=_crol_(c,1);
  272.         i=i+1;
  273.         if(i==8)
  274.         {
  275.                 i=0;
  276.                 c=0xfe;
  277.         }                           
  278. }
復制代碼

所有資料51hei提供下載:
max6675.rar (43.63 KB, 下載次數: 197)


回復

使用道具 舉報

ID:1 發表于 2019-6-17 16:03 | 顯示全部樓層
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

ID:742297 發表于 2020-5-1 14:40 來自觸屏版 | 顯示全部樓層
請問有對應原理圖嗎
回復

使用道具 舉報

ID:64825 發表于 2020-10-19 09:36 | 顯示全部樓層
未包含pid程序部分
回復

使用道具 舉報

ID:462629 發表于 2021-12-28 09:53 | 顯示全部樓層
補全電路原理圖,源碼了嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表