找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1672|回复: 7
收起左侧

51单片机退火炉温控系统程序,怎么把18b20换成pt100或者热电偶传感器

[复制链接]
ID:996611 发表于 2021-12-24 18:59 | 显示全部楼层 |阅读模式
本帖最后由 白河 于 2021-12-24 22:57 编辑

如题,18b20温度检测范围有限,想用pt100或热电偶替换,怎么实现?
YMBF[3UT_9VY7P09PVC9(BD.png _ZE]FIV}S~EUD7]{_`)Q5VU.png @]S%SNT02ZU`4T6SNR3C)JN.png
程序及仿真图如下
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
/**********************************************************************
                            端口定义及宏定义
**********************************************************************/
sbit GW=P1^0;     //定义P1.0位为高温指示灯
sbit ZC=P1^1;      //定义P1.1位为正常指示灯
sbit DW=P1^2;     //定义P1.2位为低温指示灯
sbit SR=P1^3;      //定义P1.3位为散热电机
sbit JR=P1^4;      //定义P1.4位为加热电阻
sbit BUZ=P1^5;    //定义P1.5位为高温或低温报警铃
sbit CJ=P3^7;      //定义P3.7位为温度采集数据入口
sbit W1=P2^0;     //定义P2.0位为数码管第一位选通信号  
sbit W2=P2^1;     //定义P2.1位为数码管第二位选通信号
sbit W3=P2^2;     //定义P2.2位为数码管第三位选通信号
sbit W4=P2^3;     //定义P2.3位为数码管第四位选通信号
sbit W5=P2^4;     //定义P2.4位为数码管第五位选通信号
sbit W6=P2^5;     //定义P2.5位为数码管第六位选通信号
sbit KEY=P2^6;    //定义P2.6位为总开关
sbit XSD=P0^7;    //定义P0.7位为数码管小数点输入信号
#define XSG P0    //宏定义  定义P0口为数码管显示信息输入端
#define WDSX 80 //宏定义  定义温度上限为80
#define WDXX 40             //宏定义  定义温度下限为40
void delay1(unsigned char i);    //定义延时函数
void delay2(unsigned int t);     //定义延时函数,延时11us
void GWCL();               //定义高温处理函数
void DWCL();               //定义低温处理函数
void ZCCL();               //定义正常处理函数
Init_DS18B20(void);         //DS18B20的初始化函数
Readonechar(void);          //读一个字节函数
Writeonechar(unsigned int dat);  //写一个字节函数
Readtemperature(void);        //读取温度函数
void XS(unsigned int B,unsigned int S,unsigned int G);   //定义显示函数
/**********************************************************************
                            主函数
**********************************************************************/
main()
{
    unsigned int temp,b,s,g;    //定义显示值,百位,十位,个位
    if(KEY)
        {
             temp=Readtemperature();   //读取温度值
         b=temp/100;        //计算温度百位值
             s=(temp%100)/10;     //计算温度十位值
             g=(temp%100)%10;    //计算温度个位值
             XS(b,s,g);      //调用显示函数
         if(temp>WDSX)    //判断温度是否高于规定温度
         {
                     GWCL();    //调用高温处理函数
         }
  
             else if(temp<WDXX)    //判断温度是否低于规定温度
             {  
            DWCL();   //调用低温处理函数
             }
   
         else
         {
             ZCCL();    //正常函数
          }
     }
}
/**********************************************************************
                            延时函数1
**********************************************************************/
void delay1(unsigned char i)
{
    unsigned char j;
        for(i;i>0;i--)
        {
           for(j=256;j>0;j--);
        }
}
/**********************************************************************
                            短暂延时(11us)
**********************************************************************/
void delay2(unsigned int t)
{
    while(t--);
}  
/**********************************************************************
                          高温处理函数
**********************************************************************/
void GWCL()
{
   ZC=1;    //关闭正常指示灯
   DW=1;    //关闭低温指示灯
   JR=1;    //关闭加热电阻
   GW=0;    //高温指示灯亮
   BUZ=0;   //报警铃响
   SR=0;    //散热电机转动
}
/**********************************************************************
                          低温处理函数
**********************************************************************/
void DWCL()
{
   ZC=1;    //关闭正常指示灯
   GW=1;    //关闭高温指示灯
   SR=1;    //关闭散热电机
   DW=0;    //低温指示灯亮
   BUZ=0;   //报警铃响
   JR=0;    //加热电阻工作
}
/**********************************************************************
                          正常处理函数
**********************************************************************/
void ZCCL()
{
   GW=1;   //关闭高温指示灯
   SR=1;   //关闭散热电机
   DW=1;   //关闭低温指示灯
   JR=1;   //关闭加热电阻
   BUZ=1;  //关闭蜂鸣器
   ZC=0;   //正常指示灯亮
}
   
/**********************************************************************
                          DS18B20初始化函数
**********************************************************************/
Init_DS18B20(void)
{
   unsigned int x=0;
   CJ=1;   //CJ的复位信号
   delay2(8);    //延时
   CJ=0;  //将CJ电平拉低
   delay2(80);   //延时大于480ms以上
   CJ=1;  //将CJ电平拉高
   delay2(14);  //延时60us以上
   x=CJ;   //如果x=1,初始化失败,如果x=0,初始化成功
   delay2(20);  //延时
}
/**********************************************************************
                         写一个字节
**********************************************************************/
Writeonechar(unsigned int dat)
{
   unsigned int i=0;
   for(i=8;i>0;i--)
   {
      CJ=0;  //低电平脉冲信号
          CJ=dat&0x01;    //最低位移出
          delay2(5);
          CJ=1;  //高电平信号
          dat>>=1;   //dat右移一位,最高位补0
        }
        delay2(4);
}
/**********************************************************************
                            读取一个字节
**********************************************************************/
Readonechar(void)
{
   unsigned int i=0;
   unsigned int dat=0;
   for(i=8;i>0;i--)
   {
      CJ=0;   //低电平脉冲信号
          dat>>=1;   //dat右移一位,最高位补0  
          CJ=1;  // 高电平脉冲信号
          if(CJ)
          {
             dat|=0x80;
          }
          delay2(4);  //延时
   }
   return(dat);    //返回dat值
}
/**********************************************************************
                           读取温度
**********************************************************************/
Readtemperature(void)
{
   unsigned int L=0;    //定义温度低八位
   unsigned int H=0;    //定义温度高八位
   unsigned int tem;
   Init_DS18B20();
   Writeonechar(0xCC);  //跳过读序列号操作
   Writeonechar(0x44);  //启动温度转换
   Init_DS18B20();
   Writeonechar(0xCC);  //跳过读序列号操作
   Writeonechar(0xBE);  //读取温度寄存器
   L = Readonechar();  //读取温度值低位
   H = Readonechar();  //读取温度值高位
   L=L>>4;
   tem=H<<4;
   tem=tem|L;
   return (tem);
}
/**********************************************************************
                          数码管显示函数
**********************************************************************/
void XS(unsigned int B,unsigned int S,unsigned int G)
{
    unsigned char code TAB[]={0xc0,0xf9,0xa4,0xb0,
                              0x99,0x92,0x82,0xf8,
                              0x80,0x90,0x88,0x83,
                              0xc6,0xa1,0x86,0x8e,
                              0x9c}; //数码管段码表
    XSG=TAB[B];
    W1=1;     //选通数码管第一位
    delay1(200);   //延时
    W1=0;     //关闭数码管第一位
    W2=1;
    XSG=TAB[S];
    delay1(200);
    W2=0;
    W3=1;
    XSG=TAB[G];
    XSD=0;                 //显示小数点
    delay1(200);
W3=0;
W4=1;
    XSG=TAB[0];
    delay1(200);
    W4=0;
    W5=1;
    XSG=TAB[16];          //显示“。”
    delay1(100);
    W5=0;
    W6=1;
    XSG=TAB[12];         //显示“C”
    delay1(100);
    W6=0;
}
回复

使用道具 举报

ID:883242 发表于 2021-12-24 22:20 | 显示全部楼层
退火炉的温度太高,连Pt100都用不了,直接上热电偶才可以。
回复

使用道具 举报

ID:996611 发表于 2021-12-24 22:30 | 显示全部楼层
Hephaestus 发表于 2021-12-24 22:20
退火炉的温度太高,连Pt100都用不了,直接上热电偶才可以。

那也行的,就是不会弄,学的不太好
回复

使用道具 举报

ID:996611 发表于 2021-12-24 22:56 | 显示全部楼层
Hephaestus 发表于 2021-12-24 22:20
退火炉的温度太高,连Pt100都用不了,直接上热电偶才可以。

那用热电偶怎么弄
回复

使用道具 举报

ID:8222 发表于 2021-12-24 22:56 | 显示全部楼层
这单片机没有AD功能,需要带AD功能的单片机或者增加一块ADC芯片,另外,铂电阻或者热电阻输出的电压太低,需要增加放大电路,所有代码都要重写。
回复

使用道具 举报

ID:996611 发表于 2021-12-24 23:01 | 显示全部楼层
温xyz 发表于 2021-12-24 22:56
这单片机没有AD功能,需要带AD功能的单片机或者增加一块ADC芯片,另外,铂电阻或者热电阻输出的电压太低, ...

我网上找到一个用热电偶做的,正试着照着那个做一下
回复

使用道具 举报

ID:155507 发表于 2021-12-27 21:19 | 显示全部楼层
回复

使用道具 举报

ID:883242 发表于 2021-12-27 21:52 | 显示全部楼层
用热电偶专用片子也行,反正不考虑成本。实际做产品要用两三块钱的国产24位ADC加软件修正。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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