找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机K型热电偶测控系统程序设计 Proteus仿真电路图,元器件清单

[复制链接]
跳转到指定楼层
楼主
高温测控系统,具有良好的人机交互,PWM控制
里面有Proteus仿真图,源程序,元器件清单

元件    型号    数量
单片机    AT89C51    1
电容    30pf    2
电容    10uf    1
晶振    12MHZ    1
电阻    10k    1
电阻    1k    5
电阻    100欧    1
三极管    PNP    5
蜂鸣器    有源    1
LED    红色    1
按钮        6
热电偶    TCN    4
模数芯片    MAX6675    4
显示器    LCD1602    1
排阻    10k    1
继电器    5V    4

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


程序流程图:



单片机源程序如下:
  1. #include "reg51.h"
  2. #include "max6675.h"
  3. #include "lcd1602.h"
  4. #include"pid_pwm.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. sbit k1=P3^2;//按钮
  8. sbit k2=P3^3;
  9. sbit k3=P3^4;
  10. sbit k4=P3^5;
  11. sbit k5=P3^6;
  12. sbit out1=P2^4;//加热器
  13. sbit out2=P2^5;
  14. sbit out3=P2^6;
  15. sbit out4=P2^7;
  16. sbit beep=P3^7;//蜂鸣器
  17. uchar time=0;
  18. float wendu=0;//温度
  19. uint lim=1100;//设置值
  20. uchar mode=0;//模式
  21. uchar pwm1=0,pwm2=0,pwm3=0,pwm4=0;
  22. uchar disp1[]="0000.0";
  23. uchar disp2[]="Set:0000 C      ";
  24. //主函数
  25. void main()
  26. {
  27.         uchar i=0;
  28.         init_1602();//初始化显示
  29.         disp1[10]=0xdf;
  30.         disp2[8]=0xdf;
  31.         TMOD|=0X01;
  32.         TH0=0X3C;
  33.         TL0=0XB0;        
  34.         ET0=1;//打开定时器0中断允许
  35.         EA=1;//打开总中断
  36.         TR0=1;//打开定时器
  37.         while(1)
  38.         {
  39.                  if(!k1)//设置
  40.                  {
  41.                          mode=!mode;
  42.                          while(!k1);
  43.                  }
  44.                  if(mode==1)
  45.                  {
  46.                          if(!k2)//加
  47.                         {
  48.                                 if(lim<1300)
  49.                                         lim++;
  50.                                 while(!k2);
  51.                         }
  52.                         if(!k3)//减
  53.                         {
  54.                                 if(lim>0)
  55.                                         lim--;
  56.                                 while(!k3);
  57.                         }
  58.                         if(!k4)//加
  59.                         {
  60.                                 if(lim<1300)
  61.                                         lim+=10;
  62.                                 while(!k4);
  63.                         }
  64.                         if(!k5)//减
  65.                         {
  66.                                 if(lim>10)
  67.                                         lim-=10;
  68.                                 while(!k5);
  69.                         }
  70.                  }                 
  71.                 //控制输出
  72.                 if(i<99)
  73.                         i++;
  74.                 else
  75.                         i=0;
  76.                 if(i<pwm1)
  77.                         out1=0;
  78.                 else
  79.                         out1=1;
  80.                 if(i<pwm2)
  81.                         out2=0;
  82.                 else
  83.                         out2=1;
  84.                 if(i<pwm3)
  85.                         out3=0;
  86.                 else
  87.                         out3=1;
  88.                 if(i<pwm4)
  89.                         out4=0;
  90.                 else
  91.                         out4=1;
  92.         }
  93. }
  94. //定时器中断
  95. void Timer0() interrupt 1
  96. {
  97.         uint i;
  98.         uchar j=0;
  99.         if(time<10)//0.5s
  100.                 time++;
  101.         else
  102.         {
  103.                 time=0;
  104.                 if(mode==0)
  105.                 {
  106.                 j=0;
  107.                 wendu=max_read(1);//测温1
  108.                 i=wendu*10;
  109.                 disp1[0]=i/10000+0x30;
  110.                 disp1[1]=i%10000/1000+0x30;
  111.                 disp1[2]=i%1000/100+0x30;
  112.                 disp1[3]=i%100/10+0x30;
  113.                 disp1[5]=i%10+0x30;
  114.                 write_string(1,0,disp1);
  115.                 pwm1=PID(lim,wendu);//PID控制
  116.                 //判断报警
  117.                 if((wendu<1000)||(wendu>1250))
  118.                          j++;
  119.                 wendu=max_read(2);//测温2
  120.                 i=wendu*10;
  121.                 disp1[0]=i/10000+0x30;
  122.                 disp1[1]=i%10000/1000+0x30;
  123.                 disp1[2]=i%1000/100+0x30;
  124.                 disp1[3]=i%100/10+0x30;
  125.                 disp1[5]=i%10+0x30;
  126.                 write_string(1,8,disp1);
  127.                 if(wendu<lim)//占空比计算
  128.                 {
  129.                         if(wendu>lim-100)
  130.                                 pwm2=lim-wendu;
  131.                         else
  132.                                 pwm2=100;
  133.                 }
  134.                 //判断报警
  135.                 if((wendu<1000)||(wendu>1250))
  136.                          j++;
  137.                 wendu=max_read(3);//测温3
  138.                 i=wendu*10;
  139.                 disp1[0]=i/10000+0x30;
  140.                 disp1[1]=i%10000/1000+0x30;
  141.                 disp1[2]=i%1000/100+0x30;
  142.                 disp1[3]=i%100/10+0x30;
  143.                 disp1[5]=i%10+0x30;
  144.                 write_string(2,0,disp1);
  145.                 if(wendu<lim)//占空比计算
  146.                 {
  147.                         if(wendu>lim-100)
  148.                                 pwm3=lim-wendu;
  149.                         else
  150.                                 pwm3=100;
  151.                 }
  152.                 //判断报警
  153.                 if((wendu<1000)||(wendu>1250))
  154.                          j++;
  155.                 wendu=max_read(4);//测温4
  156.                 i=wendu*10;
  157.                 disp1[0]=i/10000+0x30;
  158.                 disp1[1]=i%10000/1000+0x30;
  159.                 disp1[2]=i%1000/100+0x30;
  160.                 disp1[3]=i%100/10+0x30;
  161.                 disp1[5]=i%10+0x30;
  162.                 write_string(2,8,disp1);
  163.                 if(wendu<lim)//占空比计算
  164.                 {
  165.                         if(wendu>lim-100)
  166.                                 pwm4=lim-wendu;
  167.                         else
  168.                                 pwm4=100;
  169.                 }
  170.                 //判断报警
  171.                 if((wendu<1000)||(wendu>1250))
  172.                          j++;
  173.                 if(j>0)
  174.                         beep=0;
  175.                 else
  176.                         beep=1;               
  177.                 }
  178.                 else//设置模式
  179.                 {
  180.                 disp2[4]=lim/1000+0x30;
  181.                 disp2[5]=lim%1000/100+0x30;
  182.                 disp2[6]=lim%100/10+0x30;
  183.                 disp2[7]=lim%10+0x30;
  184.                 write_string(1,0,"SET:            ");
  185.                 write_string(2,0,disp2);
  186.                 }
  187.                
  188.         }
  189.         TH0=0X3C;
  190.         TL0=0XB0;
  191. }
复制代码


所有资料51hei提供下载:
资料.7z (244.82 KB, 下载次数: 78)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:100749 发表于 2021-5-10 16:21 | 只看该作者
程序有错误,本想拿来用的,还要改程序
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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