|
1、本實(shí)驗(yàn)所用單片機(jī)已經(jīng)將DS18B20的數(shù)據(jù)腳連接到單片機(jī)的P3.7,所以只需要將板子連接到電腦即可,不需要接其他線。
2、打開上位機(jī).exe文件,選擇COM3-連接,溫度窗口就會(huì)有溫度輸出。
源碼:
/*********************************************************************************************
功能:下位機(jī)通過串口把DS18B20的監(jiān)測(cè)數(shù)據(jù)發(fā)送到上位機(jī)并顯示
/**********************************************************************************************/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P3^7; // 接DS18B20的數(shù)據(jù)端
/***********************************
函數(shù):DelayMs(uint z)
----------------------
說明:毫秒級(jí)的延時(shí)
參數(shù):z 代表要延時(shí)的毫秒數(shù)
返回值:無
***********************************/
void DelayMs(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/***********************************
void ReSet(void)
------------------
說明:復(fù)位啟動(dòng)DS18B20
參數(shù):無
返回值:無
***********************************/
void ReSet(void)
{
uint i;
DQ=0;
i=100;
while(i--);
DQ=1;
i=4;
while(i--);
while(DQ);
while(~DQ);
i=4;
while(i--);
}
/***********************************
uchar ReadByte(void)
------------------
說明:讀取DS18B20的一個(gè)字節(jié)
參數(shù):無
返回值:返回讀取到的字節(jié)
***********************************/
uchar ReadByte(void)
{
uchar i,j,b,dat=0;
for(j=0;j<8;j++)
{
DQ=0;
i++;
DQ=1;
i=3; // 延時(shí)15us
while(--i);
b=DQ;
i=10;
while(i--);
dat=(b<<7)|(dat>>1);
}
return(dat);
}
/************************************************
void WriteByte(uchar b)
------------------
說明:寫數(shù)據(jù)的一個(gè)字節(jié),滿足寫1和寫0的時(shí)隙要求
參數(shù):b代表要寫入到DS18B20的內(nèi)容
返回值:無
************************************************/
void WriteByte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=0;j<8;j++)
{
btmp=b&0x01;
b=b>>1; // 取下一位(由低位向高位)
if(btmp)
{
DQ=0;
i++;
i++;
DQ=1;
i=10;
while(i--); // 整個(gè)寫1時(shí)隙不低于60us
}
else
{
DQ=0;
i=10;
while(i--); // 保持低在60us到120us之間
DQ=1;
i++;
i++;
}
}
}
/************************************************
uint ReadTemp(void)
------------------
說明:讀取溫度值
參數(shù):無
返回值:返回讀取到的溫度
************************************************/
uint ReadTemp(void)
{
uchar TempLow,TempHig; // 溫度值低位、高位字節(jié)
float tt;
uint temp;
ReSet(); // 產(chǎn)生復(fù)位脈沖,初始化DS18B20
WriteByte(0xcc); // skip rom 命令
WriteByte(0x44); // convert T 命令
ReSet();
WriteByte(0xcc); // skip rom 命令
WriteByte(0xbe); // read 溫度命令
TempLow=ReadByte(); // 溫度值低位字節(jié)(其中低4位為二進(jìn)制的"小數(shù)"部分)
TempHig=ReadByte(); // 高位值高位字節(jié)(其中高5位為符號(hào)位)
temp=TempHig;
temp<<=8;
temp=temp|TempLow;
tt=temp*0.0625;
temp=tt*10+0.5;
return (temp);
}
/***********************************
函數(shù):void send(uint dat)
---------------------------
說明:將測(cè)得的距離通過串口發(fā)送出去
參數(shù):dat是測(cè)得的距離
返回值:無
***********************************/
void Send(uint dat)
{
SBUF=(dat/1000)+ 48; // 發(fā)送 千 位
while(!TI);
TI=0;
SBUF=(dat%1000/100)+ 48; // 發(fā)送 百 位
while(!TI);
TI=0;
SBUF=(dat%100/10)+48; // 發(fā)送 十 位
while(!TI);
TI=0;
SBUF=(dat%10)+48; // 發(fā)送 個(gè) 位
while(!TI);
TI=0;
}
/***********************************
函數(shù):void InitUart()
----------------------
說明:對(duì)串口進(jìn)行初始化
參數(shù):無
返回值:無
***********************************/
void InitUart()
{
SCON = 0x50; //串口工作方式1,允許串口接收(SCON = 0x40 時(shí)禁止串口接收)
PCON = 0x80; //波特率倍頻(屏蔽本句波特率為2400)
TMOD = 0x20; //定時(shí)器T/C1工作方式2
TH1 = 0xF3; //定時(shí)器初值高8位設(shè)置
TL1 = 0xF3; //定時(shí)器初值低8位設(shè)置
EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
ES = 1; //允許UART串口的中斷
TR1 = 1; //定時(shí)器啟動(dòng)
}
/***********************
函數(shù):void main(void)
----------------------
說明:主函數(shù)
參數(shù):無
返回值:無
***********************/
void main()
{
uint temp; // 用來保存讀取到的溫度值
InitUart();
while(1)
{
temp=ReadTemp();
Send(temp);
DelayMs(200);
}
}
/*****************************************************************************/
/*****************************************************************************/
篇幅原因只展示部分代碼,詳細(xì)代碼以及上位機(jī)程序請(qǐng)下載查看。
51hei.png (3.44 KB, 下載次數(shù): 32)
下載附件
2021-4-3 16:27 上傳
單片機(jī)代碼下載:
溫度檢測(cè)系統(tǒng).zip
(59.84 KB, 下載次數(shù): 24)
2021-4-3 16:10 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|