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