課程名稱:機器人原理和應用實驗類型: 設計型 實驗項目名稱:DS18B20溫度傳感器實驗 實驗地點: 實驗日期:年 月日 成績:
一、實驗目的及要求 - 復習掌握Keil軟件的使用。
- 掌握DS18B20的工作原理。
- 能編寫DS18B20的控制程序和編程方法。
二、實驗環境及要求 1.普中實驗開發版一塊, 杜邦線若干,端子線一個,溫度傳感器DS18B20一個 2.PC機一臺 3.軟件環境:OS:WIN7、Keil uVision4、普中科技自動下載軟件 三、實驗原理 (一 )應用背景概述 測量溫度的關鍵是溫度傳感器。隨著技術飛速發展,傳感器已進入第三代數字傳感器。本測溫系統采用的DS18B20就是屬于這種傳感器。DS18B20是美國DALLAS半導體公司生產的單總線數字溫度傳感器,它可以實現數字化輸出和測試,并且有控制功能強、傳輸距離遠、抗干擾能力強、接口方便、微功耗等優點,因而被廣泛應用在工業、農業、軍事等領域的控制儀器、測控系統中。 (二) DS18B20的原理及特性介紹 1.DS18B20的幾個特點: a. DS18B20因為采用了單總線技術,可通過串行口線,也可通過其他I/O口線與微機直接接 傳感器直接輸出被測溫度值(二進制數)。 b.其測量溫度范圍為:-55℃————+125℃, c.測量分辨率為:0.0625℃,是其他傳感器無法相比的。 
圖1 DS18B20外部形狀及管腳 d.內含64位只讀存儲器ROM,(內存出廠序列號,是對應每一個器件的唯一號),還又RAM 存有溫度當前轉換值及符號。 e.用戶可分別設定每個器件的溫度上、下限。 f.內含寄生電源。 2. DS18b20的結構: a. 64位光刻ROM ,可以看作是DS18B20的地址序列號,如表一所示。 
表1
b.高速暫存器RAM共占0、1兩個單元: 
表2 兩個8位的RAM中,存放二進制的數,高五位是符號位,如果溫度大于0℃,這五位數為0,將測到的數值乘以0.0625,即得到實際的溫度值;如果溫度小于0℃,高五位為1,測到的數值需要取反加1,再乘以0.0625 ,才得到實際的溫度值。 c. 九個寄存器的名稱及作用: 
表3 (三) DS18B20 的控制方法 DS18B20的操作是通過執行操作命令實現的, 其控制程序是按照DS18B20的通訊協議編制的。單片機與DS18B20交換數據,CPU按照單總線協議在總線上產生復位時序和讀寫時序來實現的。其中包含復位脈沖、響應脈沖、讀、寫時序,只有響應脈沖是DS18B20發出的,其他都有單片機發出。時序的具體要求如下: (1) 復位脈沖:單片機發出一個寬為480—960μs的負脈沖之后再發出5—60μs的正脈沖,此時DS18B20會發出一個60—240μs的響應脈沖,復位時序結束。也就是呼應階段。 (2) 寫時間片:寫一位二進制的信息,周期至少為61μS,其中含1μS的恢復時間,單片機啟動寫程序后15—60μs期間DS18B20自動采樣數據線,低電平為“0”,高電平為“1”。單片機寫“0”時,要持續低電平60—120μs,寫“1”時,要在啟動后15μs之內使數據線變為高電平。 (3) 讀時間片:讀一位二進制數據,周期及恢復時間要求與寫時間片相同。單片機啟動讀時序之后,至少保持1μs低電平,然后在接近啟動后15μs之前讀入數據。低電平為“0”,高電平為“1”。 
圖2 初始化時序

圖3 讀/寫時序 (4) ROM 操作命令的執行: 在 ROM 操作命令中,有兩條命令專門用于獲取傳感器序列號:讀ROM命令(33H)和搜索ROM命令(FOH)。讀ROM命令只在總線上只有一個傳感器的情況下使用。具體 的 搜 索過程為:(1)單片機發出復位脈沖進行初始化,連接在P3。5口上的傳感器則發出存在脈沖做出響應。(2)單片機在單總線上發出搜索ROM命令。(3)單片機從單總線上讀一位數據。ds18b20的工作時序分別有初始化時序、寫時序、讀時序、轉換時序等,根據傳感器的這些時序要求編寫出子程序、主程序 
表4 四、實驗內容及步驟 1.DS18B20模塊電路原理圖 
2.連線: JP10端口連接JP12端口,也就是STC89C51的P0端口連接74HC245, STC89C51的P2.2,P2.3,P2.4端口連接U12的A,B,C端口。溫度傳感器DS18B20出廠時就安裝好了。 
3.簡述DS18B20溫度轉換規則。 答:
該實驗項目包括main.c, temp.c, temp.h三個文件。 以下為main.c文件內容: #include "reg52.h"
#include"temp.h"
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
char num=0;
uchar DisplayData[8];
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void datapros(int temp) //此函數功能是
{
float tp;
if(temp< 0) //添加注釋:
{
DisplayData[0] = 0x40;
temp=temp-1;
temp=~temp; //添加注釋:
tp=temp;
temp=tp*0.0625*100+0.5; //添加注釋:
}
else //添加注釋:
{
DisplayData[0] = 0x00;
tp=temp;
temp=tp*0.0625*100+0.5;
}
DisplayData[1] = smgduan[temp / 10000];
DisplayData[2] = smgduan[temp % 10000 / 1000];
DisplayData[3] = smgduan[temp % 1000 / 100] | 0x80;
DisplayData[4] = smgduan[temp % 100 / 10];
DisplayData[5] = smgduan[temp % 10];
}
void DigDisplay() //此函數功能是
{
uchar i;
for(i=0;i<6;i++)
{
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第 位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第 位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第 位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第 位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第 位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第 位
}
P0=DisplayData;
delayms(1);
P0=0x00; //添加注釋:
}
}
void main()
{
while(1)
{
datapros(Ds18b20ReadTemp()); //添加注釋:
DigDisplay(); //添加注釋:
}
}
以下為temp.c文件內容
#include"temp.h"
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
uchar Ds18b20Init()
{
uchar i;
DSPORT = 0; //將總線拉低480us~960us
i = 70;
while(i--); //延時642us
DSPORT = 1;//然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
i = 0;
while(DSPORT) //等待DS18B20拉低總線
{
delayms(1);
i++;
if(i>5)//等待>5MS
{
return 0;//初始化失敗
}
}
return 1;//初始化成功
}
void Ds18b20WriteByte(uchar dat)
{
uint i, j;
for(j=0; j<8; j++)
{
DSPORT = 0; //每寫入一位數據之前先把總線拉低1us
i++;
DSPORT = dat & 0x01; //然后寫入一個數據,從最低位開始
i=6;
while(i--); //延時68us,持續時間最少60us
DSPORT = 1; //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
dat >>= 1;
}
}
uchar Ds18b20ReadByte()
{
uchar byte, bi;
uint i, j;
for(j=8; j>0; j--)
{
DSPORT = 0;//先將總線拉低1us
i++;
DSPORT = 1;//然后釋放總線
i++;
i++;//延時6us等待數據穩定
bi = DSPORT; //讀取數據,從最低位開始讀取
/*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
byte = (byte >> 1) | (bi << 7);
i = 4; //讀取完之后等待48us再接著讀取下一個數
while(i--);
}
return byte;
}
void Ds18b20ChangTemp()
{
Ds18b20Init();
delayms(1);
Ds18b20WriteByte(0xcc); //添加注釋:
Ds18b20WriteByte(0x44); //添加注釋:
}
void Ds18b20ReadTempCom()
{
Ds18b20Init();
delayms(1);
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0xbe); //添加注釋:
}
int Ds18b20ReadTemp()
{
int temp = 0;
uchar tmh, tml;
Ds18b20ChangTemp(); //添加注釋:
Ds18b20ReadTempCom(); //添加注釋:
tml = Ds18b20ReadByte(); //添加注釋:
tmh = Ds18b20ReadByte(); //添加注釋:
temp = tmh;
temp <<= 8;
temp |= tml;
return temp;
}
以下為temp.h文件內容:
#ifndef __TEMP_H_
#define __TEMP_H_
#include<reg52.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//--定義使用的IO口--//
sbit DSPORT=P3^7;
//--聲明全局函數--//
void delayms(uint );
uchar Ds18b20Init();
void Ds18b20WriteByte(uchar com);
uchar Ds18b20ReadByte();
void Ds18b20ChangTemp();
void Ds18b20ReadTempCom();
int Ds18b20ReadTemp();
#endif
5. 要求添加上面代碼的注釋。
6. 調試程序、并下載到普中實驗板,觀察實驗現象。實驗效果要求演示給指導教師。
實驗現象是:
7. 回答DS18B20的單總線編程需要注意事項。
答:
四、提高實驗
1. 請指出溫度顯示的最小刻度是多少?
2. 請畫出該實驗的datapros()函數的軟件流程圖?
3. 修改程序,實現溫度顯示能顯示出小數后3位,整數保留3位。
完整的Word格式文檔51黑下載地址:
機器人原理實驗報告二20181029.doc
(1.18 MB, 下載次數: 26)
2018-11-19 22:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|