找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4497|回复: 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, 下载次数: 189)
回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表