欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

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

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

程序及仿真圖如下
#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;
}

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

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

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

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



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




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