本帖最后由 白河 于 2021-12-24 22:57 編輯
如題,18b20溫度檢測范圍有限,想用pt100或熱電偶替換,怎么實現(xiàn)?
YMBF[3UT_9VY7P09PVC9(BD.png (55.15 KB, 下載次數(shù): 23)
下載附件
2021-12-24 18:57 上傳
_ZE]FIV}S~EUD7]{_`)Q5VU.png (39.41 KB, 下載次數(shù): 36)
下載附件
2021-12-24 18:57 上傳
@]S%SNT02ZU`4T6SNR3C)JN.png (10.86 KB, 下載次數(shù): 25)
下載附件
2021-12-24 18:57 上傳
程序及仿真圖如下
#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;
}
|