找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机设计的读取K型感温头并控制强电设备的系统

[复制链接]
跳转到指定楼层
楼主
ID:209219 发表于 2017-6-8 15:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
温度传感器种类繁多,在学校比较常用DS18B20,DTH11,做些简单室温检测。后来逐渐接触到一些工业级的温感,前些时间做过一个NTC型感温头的控制系统,温度的变化引起电阻的变化,这就需要用AD转化测出阻值,利用函数公式求温度,或者利用查询法测出温度,感觉略显麻烦,不过NTC有NTC的优势。最近主要是在用K型感温头来做实验,关于各种感温头的优势和劣势,大家可以去百度看看。好了,话不多说,上图,上程序:

/*
功能:自动检测温度,开机加热20分,进入恒温75℃±2℃,
      按键k4----强制加热
          具有未放置加热锅提示、感温头损坏或未连接提示、
          加热状态和恒温状态自动切换和手动切换等功能   
         
修改时间:17/6/3
*/



原理图和PCB图如下:


单片机源程序:
  1. #include <REGX52.H>
  2. #include "intrins.h"
  3. #include "dingyi.c"

  4. void main()
  5. {
  6.         TIMER_INIT();                        //定时器初始化
  7.         
  8.         while(1)
  9.         {               
  10.                 anjian();                //按键扫描        
  11.                 temp=Re_Convert();        // 热电偶数据读取,返回温度
  12.                 Temp_Change();            //加热状态切换
  13.         }
  14. }



  15. void t0_time() interrupt 1           //定时中断
  16. {
  17.   TH0=(65536-48000)/256;// 给高8位赋值
  18.   TL0=(65536-48000)%256;//给低8位赋值
  19.   num++;
  20.   if(num==10)
  21.   {
  22.     num=0;
  23.     miao--;
  24.         led=0;
  25.         if(miao<=0)
  26.         {
  27.           miao=60;
  28.           fen--;
  29.           if(fen<0)                 //加热时间到,则关闭加热,关闭定时器 ,切换到恒温状态
  30.           {
  31.                   TR0=0;
  32.                   led=1;
  33.                   jiare=1;
  34.                   biaozhi=1;
  35.                   delay(10);                 
  36.           }
  37.     }
  38.   }

  39. }

  40. //********************************************************//



  41. #define  uint unsigned int
  42. #define uchar unsigned char
  43. sbit SCK=P1^7;
  44. sbit CS =P1^6;
  45. sbit SO =P1^5;         //MAX6675接口

  46. sbit led=P1^0;
  47. sbit k4 =P3^3;         //强制加热按键
  48. sbit jiare=P3^2; //加热控制继电器

  49. uint temp,m,c=0;
  50. uchar num,Flag_connect;
  51. char fen=10,miao=0;
  52. uchar biaozhi=0;

  53. uint Re_Convert();
  54. void anjian();
  55. void Temp_Change();
  56. void TIMER_INIT();
  57. uint Re_Convert(); //热电偶数据读取,返回温度

  58. void delay(uint x)
  59. {
  60.         uint i,j;
  61.         for(i=x;i>0;i--)
  62.           for(j=440;j>0;j--);
  63. }


  64. void TIMER_INIT()
  65. {
  66.         TH0=(65536-50000)/256;// 给高8位赋值
  67.     TL0=(65536-50000)%256;//给低8位赋值
  68.     TMOD=0X01;// 设置T0工作方式为1,定时模式
  69.         TR0=1;//  开始定时器0
  70.     ET0=1;// 开始定时器0中断
  71.         EA=1;

  72.         led=0;
  73.         jiare=0;  //加热开
  74. }


  75. void anjian()          //按键扫描
  76. {
  77.         if(k4==0)                                 //强制加热
  78.         {
  79.                   delay(10);
  80.                 if(k4==0)
  81.                 {
  82.                    while(k4==0)
  83.                    {
  84.                                    delay(10);
  85.                                 m++;                                
  86.                    }
  87.                    if(m>=200)
  88.                         {
  89.                                 biaozhi=2;
  90.                                 m=0;
  91.                         }
  92.                         if(m>0&&m<200)
  93.                         {
  94.                            m=0;
  95.                            biaozhi++;
  96.                            if(biaozhi>=2)
  97.                            biaozhi=0;
  98.                         }
  99.                 }
  100.         }
  101.         
  102. }

  103. void Temp_Change()           //加热状态切换
  104. {

  105.         if(Flag_connect==0)          //判断k型热电偶是否连接
  106.         {
  107.                 if(temp<=220)           //判断加热盘温度是否过高,即是否放锅        
  108.                 {
  109.                         if(biaozhi==0)                   //加热状态
  110.                         {
  111.                           led=0;
  112.                           jiare=0;          //加热开
  113.                           TR0=1;          //定时器开
  114.                         }

  115.                         if(biaozhi==1)                 //恒温状态
  116.                         {
  117.                           TR0=0;          //定时器关                  
  118.                       miao=0;                          
  119.                       fen=10;          //加热时间复位
  120.                           if(temp>=80)
  121.                           {
  122.                                   jiare=1;        //加热关
  123.                                 
  124.                           }
  125.                           else               
  126.                           {
  127.                                   if(temp<=75)
  128.                                 {
  129.                                   jiare=0;          //加热开
  130.                                 }
  131.                           }
  132.                           delay(180);
  133.                           c++;
  134.                           if(c>=5)
  135.                           {                          
  136.                                 led=~led;
  137.                                 c=0;
  138.                           }
  139.                         }
  140.                         if(biaozhi==2)
  141.                         {
  142.                                 led=1;
  143.                                 jiare=1;
  144.                         }                        
  145.                 }
  146.                 else                         //        加热盘温度是过高,
  147.                 {
  148.                         led=1;
  149.                         jiare=1;        //加热关闭
  150.                 }
  151.         }
  152.    else          //Flag_connect为1表示 热电偶未连接,
  153.    {
  154.                     led=1;
  155.                         jiare=1;        //加热关闭
  156.         }        
  157. }

  158. uint Re_Convert() //热电偶数据读取,返回温度
  159. {
  160.         unsigned char i;   
  161.         unsigned int dat;
  162.          
  163.         i   = 0;   
  164.         dat = 0;
  165.         CS  = 1;
  166.         _nop_();   
  167.         
  168.         CS  = 0;
  169.         _nop_();
  170.         _nop_();
  171.         SCK = 0;     
  172.         _nop_();
  173.         for(i=0; i<16; i++)                //get D15-D0 from 6675  
  174.         {      
  175.                 SCK = 1;   
  176.                 dat = dat<<1;
  177.                   
  178.                 if( SO==1 )   
  179.                         dat = dat|0x01;
  180.                 else
  181.                     dat=dat|0x00;
  182.                           
  183.                 SCK = 0;
  184.                 _nop_();   
  185.         }
  186.         CS = 1;
  187.         Flag_connect=dat&0x04;                         //读出数据的D2位是热电偶掉线标志位,该位为1表示掉线,
  188.                                             //该位为0表示连接
  189.     Flag_connect=Flag_connect>>2;         //MAX6675是否在线
  190.         
  191.         dat = dat<<1;                                                   //读出来的数据的D3~D14是温度值
  192.     dat = dat>>4;
  193.     dat = dat/4;                                                //测得的温度单位是0.25,所以要乘以0.25
  194.         return dat;   

  195. }
复制代码


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2017-6-8 17:34 | 只看该作者
绝对好资料啊,楼主能分享下头文件吗?最好传个工程压缩包啊
回复

使用道具 举报

板凳
ID:209219 发表于 2017-6-9 08:20 | 只看该作者
admin 发表于 2017-6-8 17:34
绝对好资料啊,楼主能分享下头文件吗?最好传个工程压缩包啊

#include <REGX52.H>、#include "intrins.h"这两个KEil自带。
#include "dingyi.c"已用分割符在文中区分开来了,后半部分就是。
回复

使用道具 举报

地板
ID:209219 发表于 2017-6-9 13:36 | 只看该作者
匹配PCB板的程序

WN_CDG温控板程序.rar

31.33 KB, 下载次数: 22, 下载积分: 黑币 -5

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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