標(biāo)題: 51單片機退火爐溫控系統(tǒng)程序,怎么把18b20換成pt100或者熱電偶傳感器 [打印本頁]

作者: 白河    時間: 2021-12-24 18:59
標(biāo)題: 51單片機退火爐溫控系統(tǒng)程序,怎么把18b20換成pt100或者熱電偶傳感器
本帖最后由 白河 于 2021-12-24 22:57 編輯

如題,18b20溫度檢測范圍有限,想用pt100或熱電偶替換,怎么實現(xiàn)?

程序及仿真圖如下
#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位為溫度采集數(shù)據(jù)入口
sbit W1=P2^0;     //定義P2.0位為數(shù)碼管第一位選通信號  
sbit W2=P2^1;     //定義P2.1位為數(shù)碼管第二位選通信號
sbit W3=P2^2;     //定義P2.2位為數(shù)碼管第三位選通信號
sbit W4=P2^3;     //定義P2.3位為數(shù)碼管第四位選通信號
sbit W5=P2^4;     //定義P2.4位為數(shù)碼管第五位選通信號
sbit W6=P2^5;     //定義P2.5位為數(shù)碼管第六位選通信號
sbit KEY=P2^6;    //定義P2.6位為總開關(guān)
sbit XSD=P0^7;    //定義P0.7位為數(shù)碼管小數(shù)點輸入信號
#define XSG P0    //宏定義  定義P0口為數(shù)碼管顯示信息輸入端
#define WDSX 80 //宏定義  定義溫度上限為80
#define WDXX 40             //宏定義  定義溫度下限為40
void delay1(unsigned char i);    //定義延時函數(shù)
void delay2(unsigned int t);     //定義延時函數(shù),延時11us
void GWCL();               //定義高溫處理函數(shù)
void DWCL();               //定義低溫處理函數(shù)
void ZCCL();               //定義正常處理函數(shù)
Init_DS18B20(void);         //DS18B20的初始化函數(shù)
Readonechar(void);          //讀一個字節(jié)函數(shù)
Writeonechar(unsigned int dat);  //寫一個字節(jié)函數(shù)
Readtemperature(void);        //讀取溫度函數(shù)
void XS(unsigned int B,unsigned int S,unsigned int G);   //定義顯示函數(shù)
/**********************************************************************
                            主函數(shù)
**********************************************************************/
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);      //調(diào)用顯示函數(shù)
         if(temp>WDSX)    //判斷溫度是否高于規(guī)定溫度
         {
                     GWCL();    //調(diào)用高溫處理函數(shù)
         }
  
             else if(temp<WDXX)    //判斷溫度是否低于規(guī)定溫度
             {  
            DWCL();   //調(diào)用低溫處理函數(shù)
             }
   
         else
         {
             ZCCL();    //正常函數(shù)
          }
     }
}
/**********************************************************************
                            延時函數(shù)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--);
}  
/**********************************************************************
                          高溫處理函數(shù)
**********************************************************************/
void GWCL()
{
   ZC=1;    //關(guān)閉正常指示燈
   DW=1;    //關(guān)閉低溫指示燈
   JR=1;    //關(guān)閉加熱電阻
   GW=0;    //高溫指示燈亮
   BUZ=0;   //報警鈴響
   SR=0;    //散熱電機轉(zhuǎn)動
}
/**********************************************************************
                          低溫處理函數(shù)
**********************************************************************/
void DWCL()
{
   ZC=1;    //關(guān)閉正常指示燈
   GW=1;    //關(guān)閉高溫指示燈
   SR=1;    //關(guān)閉散熱電機
   DW=0;    //低溫指示燈亮
   BUZ=0;   //報警鈴響
   JR=0;    //加熱電阻工作
}
/**********************************************************************
                          正常處理函數(shù)
**********************************************************************/
void ZCCL()
{
   GW=1;   //關(guān)閉高溫指示燈
   SR=1;   //關(guān)閉散熱電機
   DW=1;   //關(guān)閉低溫指示燈
   JR=1;   //關(guān)閉加熱電阻
   BUZ=1;  //關(guān)閉蜂鳴器
   ZC=0;   //正常指示燈亮
}
   
/**********************************************************************
                          DS18B20初始化函數(shù)
**********************************************************************/
Init_DS18B20(void)
{
   unsigned int x=0;
   CJ=1;   //CJ的復(fù)位信號
   delay2(8);    //延時
   CJ=0;  //將CJ電平拉低
   delay2(80);   //延時大于480ms以上
   CJ=1;  //將CJ電平拉高
   delay2(14);  //延時60us以上
   x=CJ;   //如果x=1,初始化失敗,如果x=0,初始化成功
   delay2(20);  //延時
}
/**********************************************************************
                         寫一個字節(jié)
**********************************************************************/
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);
}
/**********************************************************************
                            讀取一個字節(jié)
**********************************************************************/
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);  //啟動溫度轉(zhuǎn)換
   Init_DS18B20();
   Writeonechar(0xCC);  //跳過讀序列號操作
   Writeonechar(0xBE);  //讀取溫度寄存器
   L = Readonechar();  //讀取溫度值低位
   H = Readonechar();  //讀取溫度值高位
   L=L>>4;
   tem=H<<4;
   tem=tem|L;
   return (tem);
}
/**********************************************************************
                          數(shù)碼管顯示函數(shù)
**********************************************************************/
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}; //數(shù)碼管段碼表
    XSG=TAB[B];
    W1=1;     //選通數(shù)碼管第一位
    delay1(200);   //延時
    W1=0;     //關(guān)閉數(shù)碼管第一位
    W2=1;
    XSG=TAB[S];
    delay1(200);
    W2=0;
    W3=1;
    XSG=TAB[G];
    XSD=0;                 //顯示小數(shù)點
    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;
}

作者: Hephaestus    時間: 2021-12-24 22:20
退火爐的溫度太高,連Pt100都用不了,直接上熱電偶才可以。
作者: 白河    時間: 2021-12-24 22:30
Hephaestus 發(fā)表于 2021-12-24 22:20
退火爐的溫度太高,連Pt100都用不了,直接上熱電偶才可以。

那也行的,就是不會弄,學(xué)的不太好
作者: 白河    時間: 2021-12-24 22:56
Hephaestus 發(fā)表于 2021-12-24 22:20
退火爐的溫度太高,連Pt100都用不了,直接上熱電偶才可以。

那用熱電偶怎么弄
作者: 溫xyz    時間: 2021-12-24 22:56
這單片機沒有AD功能,需要帶AD功能的單片機或者增加一塊ADC芯片,另外,鉑電阻或者熱電阻輸出的電壓太低,需要增加放大電路,所有代碼都要重寫。
作者: 白河    時間: 2021-12-24 23:01
溫xyz 發(fā)表于 2021-12-24 22:56
這單片機沒有AD功能,需要帶AD功能的單片機或者增加一塊ADC芯片,另外,鉑電阻或者熱電阻輸出的電壓太低, ...

我網(wǎng)上找到一個用熱電偶做的,正試著照著那個做一下
作者: angmall    時間: 2021-12-27 21:19
用熱電偶做的



http://www.torrancerestoration.com/bbs/dpj-205326-1.html
作者: Hephaestus    時間: 2021-12-27 21:52
用熱電偶專用片子也行,反正不考慮成本。實際做產(chǎn)品要用兩三塊錢的國產(chǎn)24位ADC加軟件修正。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1