找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2|回复: 0
打印 上一主题 下一主题
收起左侧

单片机+K型热电偶MAX6675 电热炉温度控制器设计 程序仿真原理图

[复制链接]
跳转到指定楼层
楼主
针对电阻加热炉温控需求,本文设计了一套以AT89C51 单片机为核心的温度闭环控制系统。系统采K型热电偶搭配MAX6675转换芯片完成高温信号采集,依托芯片内置 12 位 ADC、冷端补偿及 SPI 通信功能,实现温度信号的数字化转换与稳定传输;使用 8 位共阳数码管实时展示温度数据与系统状态,通过独立按键完成目标温度、报警阈值、PID 参数的在线整定与工作模式切换。系统以数字 PID 算法作为核心控制策略,结合软件方式生成 PWM 波形,通过调节双向晶闸管导通占空比改变加热功率,进而实现电阻加热炉的恒温控制。同时电路增设声光报警模块,具备超温、传感器故障提示功能。经整体调试,该系统结构简单、成本低廉、抗干扰能力强、操作便捷,控温效果稳定,能够满足中小型电阻加热炉的温度控制要求,具备较强的实际应用价值。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


电路原理图如下:

程序流程图:

单片机K型热电偶电热炉源程序如下:
  1. #include "reg51.h"
  2. #include "max6675.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit smg1=P2^0;//数码管
  6. sbit smg2=P2^1;
  7. sbit smg3=P2^2;
  8. sbit smg4=P2^3;
  9. sbit smg5=P2^4;
  10. sbit smg6=P2^5;
  11. sbit smg7=P2^6;
  12. sbit smg8=P2^7;
  13. sbit k1=P1^0;//按钮
  14. sbit k2=P1^1;
  15. sbit k3=P1^2;
  16. sbit k4=P1^3;
  17. sbit k5=P1^4;
  18. sbit k6=P1^5;
  19. sbit k7=P1^6;
  20. sbit beep=P3^7;//蜂鸣器
  21. sbit out=P3^6;//输出控制
  22. uchar time=0;//系统定时
  23. uint wendu=0;//温度
  24. uchar pwm=0;//占空比
  25. uchar mode=0;//模式
  26. uint set=800;//设置温度
  27. uint limit=1000;//报警温度
  28. uchar ii=0;
  29. //数码管编码
  30. uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  31. uchar P_dat=1,I_dat=1,D_dat=1;//PID参数
  32. uint pid_dat[]={0,0,0,0,0}; //临时数据
  33. //PID计算,返回占空比
  34. uchar PID(uint mub,uint dat)//调整目标+测量数据
  35. {
  36.         uchar i=0;
  37.         uint j=0,sum=0,k=0;
  38.         //存储数据
  39.         for(i=0;i<4;i++)
  40.                 pid_dat[i]=pid_dat[i+1];
  41.         pid_dat[4]=dat;

  42.         //P调节
  43.         j=0;
  44.         if(dat<mub)
  45.         {
  46.                 j=j+(mub-dat)*P_dat;
  47.                 if(j>100)
  48.                         j=100;
  49.         }
  50.         else
  51.         {
  52.                 k=(dat-mub)*P_dat;
  53.                 if(j>k)
  54.                         j=j-k;
  55.         }
  56.         //I调节
  57.         sum=0;
  58.         for(i=0;i<5;i++)
  59.                 sum+=pid_dat[i];
  60.         sum=sum/5;
  61.         if(sum>mub)//减小
  62.         {
  63.                 k=(sum-mub)*I_dat;
  64.                 if(j>k)
  65.                         j=j-k;
  66.         }
  67.         else  //增加
  68.         {
  69.                 k=(mub-sum)*I_dat;
  70.                 j+=k;
  71.                 if(j>100)
  72.                         j=100;
  73.         }
  74.         //D调节
  75.         if(dat>pid_dat[3])//减小
  76.         {
  77.                 k=(dat-pid_dat[3])*D_dat;
  78.                 if(j>k)
  79.                         j=j-k;
  80.         }
  81.         else  //增加
  82.         {
  83.                 k=(pid_dat[3]-dat)*D_dat;
  84.                 j+=k;
  85.                 if(j>100)
  86.                         j=100;
  87.         }
  88.         return j;
  89. }
  90. //延时
  91. void delay(uint i)
  92. {
  93.         while(i--)
  94.         {
  95.                 if(ii<99)//占空比计时
  96.                         ii++;
  97.                 else
  98.                         ii=0;
  99.                 if(ii<pwm)//输出控制
  100.                         out=0;
  101.                 else
  102.                         out=1;
  103.         }
  104. }
  105. //主函数
  106. void main()
  107. {
  108.         uchar k=0;
  109.         TMOD|=0X01;//初始化定时器
  110.         TH0=0X3C;
  111.         TL0=0XB0;        
  112.         ET0=1;//打开定时器0中断允许
  113.         EA=1;//打开总中断
  114.         TR0=1;//打开定时器
  115.         while(1)
  116.         {               
  117.                 if(P1==0xff)
  118.                         k=0;
  119.                 //设置
  120.                 if(!k1 &&(k!=1))//设置切换
  121.                 {
  122.                         k=1;
  123.                         if(mode<5)
  124.                                 mode++;
  125.                         else
  126.                                 mode=0;
  127.                 }
  128.                 //设置调整温度
  129.                 if(mode==1)
  130.                 {
  131.                         if(!k2 &&(k!=2))//+1
  132.                         {
  133.                                 k=2;
  134.                                 if(set<9999)
  135.                                         set++;
  136.                         }
  137.                         if(!k3 &&(k!=3))//-1
  138.                         {
  139.                                 k=3;
  140.                                 if(set>0)
  141.                                         set--;
  142.                         }
  143.                         if(!k4 &&(k!=4))//+10
  144.                         {
  145.                                 k=4;
  146.                                 if(set<9999)
  147.                                         set+=10;
  148.                         }
  149.                         if(!k5 &&(k!=5))//-10
  150.                         {
  151.                                 k=5;
  152.                                 if(set>10)
  153.                                         set-=10;
  154.                         }
  155.                         if(!k6 &&(k!=6))//+100
  156.                         {
  157.                                 k=6;
  158.                                 if(set<9999)
  159.                                         set+=100;
  160.                         }
  161.                         if(!k7 &&(k!=7))//-100
  162.                         {
  163.                                 k=7;
  164.                                 if(set>100)
  165.                                         set-=100;
  166.                         }
  167.                 }
  168.                 //设置报警温度
  169.                 if(mode==2)
  170.                 {
  171.                         if(!k2 &&(k!=2))//+1
  172.                         {
  173.                                 k=2;
  174.                                 if(limit<9999)
  175.                                         limit++;
  176.                         }
  177.                         if(!k3 &&(k!=3))//-1
  178.                         {
  179.                                 k=3;
  180.                                 if(limit>0)
  181.                                         limit--;
  182.                         }
  183.                         if(!k4 &&(k!=4))//+10
  184.                         {
  185.                                 k=4;
  186.                                 if(limit<9999)
  187.                                         limit+=10;
  188.                         }
  189.                         if(!k5 &&(k!=5))//-10
  190.                         {
  191.                                 k=5;
  192.                                 if(limit>10)
  193.                                         limit-=10;
  194.                         }
  195.                         if(!k6 &&(k!=6))//+100
  196.                         {
  197.                                 k=6;
  198.                                 if(limit<9999)
  199.                                         limit+=100;
  200.                         }
  201.                         if(!k7 &&(k!=7))//-100
  202.                         {
  203.                                 k=7;
  204.                                 if(limit>100)
  205.                                         limit-=100;
  206.                         }
  207.                 }
  208.                 //设置P参数
  209.                 if(mode==3)
  210.                 {
  211.                         if(!k2 &&(k!=2))//+1
  212.                         {
  213.                                 k=2;
  214.                                 if(P_dat<99)
  215.                                         P_dat++;
  216.                         }
  217.                         if(!k3 &&(k!=3))//-1
  218.                         {
  219.                                 k=3;
  220.                                 if(P_dat>0)
  221.                                         P_dat--;
  222.                         }                        
  223.                 }
  224.                 //设置I参数
  225.                 if(mode==4)
  226.                 {
  227.                         if(!k2 &&(k!=2))//+1
  228.                         {
  229.                                 k=2;
  230.                                 if(I_dat<99)
  231.                                         I_dat++;
  232.                         }
  233.                         if(!k3 &&(k!=3))//-1
  234.                         {
  235.                                 k=3;
  236.                                 if(I_dat>0)
  237.                                         I_dat--;
  238.                         }                        
  239.                 }
  240.                 //设置D参数
  241.                 if(mode==5)
  242.                 {
  243.                         if(!k2 &&(k!=2))//+1
  244.                         {
  245.                                 k=2;
  246.                                 if(D_dat<99)
  247.                                         D_dat++;
  248.                         }
  249.                         if(!k3 &&(k!=3))//-1
  250.                         {
  251.                                 k=3;
  252.                                 if(D_dat>0)
  253.                                         D_dat--;
  254.                         }                        
  255.                 }
  256.                 //报警
  257.                 if(wendu>limit)
  258.                         beep=0;
  259.                 else
  260.                         beep=1;
  261.                 //显示
  262.                 if(mode==0)
  263.                 {
  264.                         P0=smgduan[wendu/1000];                smg5=0;delay(50);smg5=1;
  265.                         P0=smgduan[wendu%1000/100];        smg6=0;delay(50);smg6=1;
  266.                         P0=smgduan[wendu%100/10];        smg7=0;delay(50);smg7=1;
  267.                         P0=smgduan[wendu%10];                smg8=0;delay(50);smg8=1;
  268.                 }
  269.                 if(mode==1)
  270.                 {
  271.                         P0=smgduan[1];                                smg1=0;delay(50);smg1=1;
  272.                         P0=smgduan[set/1000];                smg5=0;delay(50);smg5=1;
  273.                         P0=smgduan[set%1000/100];        smg6=0;delay(50);smg6=1;
  274.                         P0=smgduan[set%100/10];                smg7=0;delay(50);smg7=1;
  275.                         P0=smgduan[set%10];                        smg8=0;delay(50);smg8=1;
  276.                 }
  277.                 if(mode==2)
  278.                 {
  279.                         P0=smgduan[2];                                smg1=0;delay(50);smg1=1;
  280.                         P0=smgduan[limit/1000];                smg5=0;delay(50);smg5=1;
  281.                         P0=smgduan[limit%1000/100];        smg6=0;delay(50);smg6=1;
  282.                         P0=smgduan[limit%100/10];        smg7=0;delay(50);smg7=1;
  283.                         P0=smgduan[limit%10];                smg8=0;delay(50);smg8=1;
  284.                 }
  285.                 if(mode==3)
  286.                 {
  287.                         P0=smgduan[3];                                smg1=0;delay(50);smg1=1;
  288.                         P0=smgduan[P_dat/10];                smg7=0;delay(50);smg7=1;
  289.                         P0=smgduan[P_dat%10];                smg8=0;delay(50);smg8=1;
  290.                 }
  291.                 if(mode==4)
  292.                 {
  293.                         P0=smgduan[4];                                smg1=0;delay(50);smg1=1;
  294.                         P0=smgduan[I_dat/10];                smg7=0;delay(50);smg7=1;
  295.                         P0=smgduan[I_dat%10];                smg8=0;delay(50);smg8=1;
  296.                 }
  297.                 if(mode==5)
  298.                 {
  299.                         P0=smgduan[5];                                smg1=0;delay(50);smg1=1;
  300.                         P0=smgduan[D_dat/10];                smg7=0;delay(50);smg7=1;
  301.                         P0=smgduan[D_dat%10];                smg8=0;delay(50);smg8=1;
  302.                 }                                                                          
  303.         }
  304. }

  305. //定时器0中断
  306. void Timer0() interrupt 1
  307. {
  308.         unsigned long j;
  309.         if(time<10)//0.5s
  310.                 time++;
  311.         else
  312.         {
  313.                 time=0;
  314.                 wendu=max_read();//测温
  315.                 j=wendu;
  316.                 j=j*100/138;
  317.                 wendu=j;
  318.                 pwm=PID(set,wendu);//PID计算
  319.         }
  320.         TH0=0X3C;
  321.         TL0=0XB0;
  322. }
复制代码

51hei.png (4.35 KB, 下载次数: 0)

51hei.png

第2组电阻加热炉温度控制系统的数字控制器设计.docx

3.66 MB, 下载次数: 0, 下载积分: 黑币 -5

TP401-V1.1.1-电热炉.zip

1.2 MB, 下载次数: 0, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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