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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 11838|回復(fù): 0
收起左側(cè)

DS18B20溫度傳感器實(shí)驗(yàn)

[復(fù)制鏈接]
ID:429575 發(fā)表于 2018-11-19 22:51 | 顯示全部樓層 |閱讀模式

課程名稱:機(jī)器人原理和應(yīng)用實(shí)驗(yàn)類型:    設(shè)計(jì)型

實(shí)驗(yàn)項(xiàng)目名稱:DS18B20溫度傳感器實(shí)驗(yàn)

實(shí)驗(yàn)地點(diǎn): 實(shí)驗(yàn)日期:年 月日

成績(jī):


一、實(shí)驗(yàn)?zāi)康募耙?/strong>

  • 復(fù)習(xí)掌握Keil軟件的使用
  • 掌握DS18B20的工作原理
  • 能編寫DS18B20的控制程序和編程方法

二、實(shí)驗(yàn)環(huán)境及要求

1.普中實(shí)驗(yàn)開發(fā)版一塊, 杜邦線若干,端子線一個(gè),溫度傳感器DS18B20一個(gè)

2.PC機(jī)一臺(tái)

3.軟件環(huán)境:OS:WIN7、Keil uVision4、普中科技自動(dòng)下載軟件

三、實(shí)驗(yàn)原理

   (一 )應(yīng)用背景概述
  測(cè)量溫度的關(guān)鍵是溫度傳感器。隨著技術(shù)飛速發(fā)展,傳感器已進(jìn)入第三代數(shù)字傳感器。本測(cè)溫系統(tǒng)采用的DS18B20就是屬于這種傳感器。DS18B20是美國(guó)DALLAS半導(dǎo)體公司生產(chǎn)的單總線數(shù)字溫度傳感器,它可以實(shí)現(xiàn)數(shù)字化輸出和測(cè)試,并且有控制功能強(qiáng)、傳輸距離遠(yuǎn)、抗干擾能力強(qiáng)、接口方便、微功耗等優(yōu)點(diǎn),因而被廣泛應(yīng)用在工業(yè)、農(nóng)業(yè)、軍事等領(lǐng)域的控制儀器、測(cè)控系統(tǒng)中。
(二) DS18B20的原理及特性介紹
  1.DS18B20的幾個(gè)特點(diǎn):
  a. DS18B20因?yàn)椴捎昧藛慰偩技術(shù),可通過(guò)串行口線,也可通過(guò)其他I/O口線與微機(jī)直接接 傳感器直接輸出被測(cè)溫度值(二進(jìn)制數(shù))。
  b.其測(cè)量溫度范圍為:-55℃————+125℃,
  c.測(cè)量分辨率為:0.0625℃,是其他傳感器無(wú)法相比的。

圖1 DS18B20外部形狀及管腳
  d.內(nèi)含64位只讀存儲(chǔ)器ROM,(內(nèi)存出廠序列號(hào),是對(duì)應(yīng)每一個(gè)器件的唯一號(hào)),還又RAM 存有溫度當(dāng)前轉(zhuǎn)換值及符號(hào)。
  e.用戶可分別設(shè)定每個(gè)器件的溫度上、下限。
  f.內(nèi)含寄生電源。
  2. DS18b20的結(jié)構(gòu):
  a. 64位光刻ROM ,可以看作是DS18B20的地址序列號(hào),如表一所示。

表1


 b.高速暫存器RAM共占0、1兩個(gè)單元:

表2
  兩個(gè)8位的RAM中,存放二進(jìn)制的數(shù),高五位是符號(hào)位,如果溫度大于0℃,這五位數(shù)為0,將測(cè)到的數(shù)值乘以0.0625,即得到實(shí)際的溫度值;如果溫度小于0℃,高五位為1,測(cè)到的數(shù)值需要取反加1,再乘以0.0625 ,才得到實(shí)際的溫度值。
  c. 九個(gè)寄存器的名稱及作用:

表3
(三) DS18B20 的控制方法
        DS18B20的操作是通過(guò)執(zhí)行操作命令實(shí)現(xiàn)的, 其控制程序是按照DS18B20的通訊協(xié)議編制的。單片機(jī)與DS18B20交換數(shù)據(jù),CPU按照單總線協(xié)議在總線上產(chǎn)生復(fù)位時(shí)序和讀寫時(shí)序來(lái)實(shí)現(xiàn)的。其中包含復(fù)位脈沖、響應(yīng)脈沖、讀、寫時(shí)序,只有響應(yīng)脈沖是DS18B20發(fā)出的,其他都有單片機(jī)發(fā)出。時(shí)序的具體要求如下:
  (1) 復(fù)位脈沖:?jiǎn)纹瑱C(jī)發(fā)出一個(gè)寬為480—960μs的負(fù)脈沖之后再發(fā)出5—60μs的正脈沖,此時(shí)DS18B20會(huì)發(fā)出一個(gè)60—240μs的響應(yīng)脈沖,復(fù)位時(shí)序結(jié)束。也就是呼應(yīng)階段。
  (2) 寫時(shí)間片:寫一位二進(jìn)制的信息,周期至少為61μS,其中含1μS的恢復(fù)時(shí)間,單片機(jī)啟動(dòng)寫程序后15—60μs期間DS18B20自動(dòng)采樣數(shù)據(jù)線,低電平為“0”,高電平為“1”。單片機(jī)寫“0”時(shí),要持續(xù)低電平60—120μs,寫“1”時(shí),要在啟動(dòng)后15μs之內(nèi)使數(shù)據(jù)線變?yōu)楦唠娖健?/div>
  (3) 讀時(shí)間片:讀一位二進(jìn)制數(shù)據(jù),周期及恢復(fù)時(shí)間要求與寫時(shí)間片相同。單片機(jī)啟動(dòng)讀時(shí)序之后,至少保持1μs低電平,然后在接近啟動(dòng)后15μs之前讀入數(shù)據(jù)。低電平為“0”,高電平為“1”。

圖2 初始化時(shí)序

圖3 讀/寫時(shí)序
  (4) ROM 操作命令的執(zhí)行:
  在 ROM 操作命令中,有兩條命令專門用于獲取傳感器序列號(hào):讀ROM命令(33H)和搜索ROM命令(FOH)。讀ROM命令只在總線上只有一個(gè)傳感器的情況下使用。具體 的 搜 索過(guò)程為:(1)單片機(jī)發(fā)出復(fù)位脈沖進(jìn)行初始化,連接在P3。5口上的傳感器則發(fā)出存在脈沖做出響應(yīng)。(2)單片機(jī)在單總線上發(fā)出搜索ROM命令。(3)單片機(jī)從單總線上讀一位數(shù)據(jù)。ds18b20的工作時(shí)序分別有初始化時(shí)序、寫時(shí)序、讀時(shí)序、轉(zhuǎn)換時(shí)序等,根據(jù)傳感器的這些時(shí)序要求編寫出子程序、主程序

表4

實(shí)驗(yàn)內(nèi)容及步驟

1.DS18B20模塊電路原理圖

2.連線:

JP10端口連接JP12端口也就是STC89C51的P0端口連接74HC245, STC89C51的P2.2,P2.3,P2.4端口連接U12的A,B,C端口。溫度傳感器DS18B20出廠時(shí)就安裝好了。

3.簡(jiǎn)述DS18B20溫度轉(zhuǎn)換規(guī)則

答:






  • 編寫DS18B20的讀取溫度程序

該實(shí)驗(yàn)項(xiàng)目包括main.c,  temp.c,  temp.h三個(gè)文件。

以下為main.c文件內(nèi)容:

#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)               //此函數(shù)功能是                          
{
                 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()    //此函數(shù)功能是                          
{
              uchar i;
              for(i=0;i<6;i++)
              {
                            switch(i)              //位選,選擇點(diǎn)亮的數(shù)碼管,
                            {
                                          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文件內(nèi)容
#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--);        //延時(shí)642us
              DSPORT = 1;//然后拉高總線,如果DS18B20做出反應(yīng)會(huì)將在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;                                   //每寫入一位數(shù)據(jù)之前先把總線拉低1us
                            i++;
                            DSPORT = dat & 0x01;  //然后寫入一個(gè)數(shù)據(jù),從最低位開始
                            i=6;
                            while(i--); //延時(shí)68us,持續(xù)時(shí)間最少60us
                            DSPORT = 1;              //然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫入第二個(gè)數(shù)值
                            dat >>= 1;
              }
}

uchar Ds18b20ReadByte()
{
              uchar byte, bi;
              uint i, j;            
              for(j=8; j>0; j--)
              {
                            DSPORT = 0;//先將總線拉低1us
                            i++;
                            DSPORT = 1;//然后釋放總線
                            i++;
                            i++;//延時(shí)6us等待數(shù)據(jù)穩(wěn)定
                            bi = DSPORT;              //讀取數(shù)據(jù),從最低位開始讀取
                            /*將byte左移一位,然后與上右移7位后的bi,注意移動(dòng)之后移掉那位補(bǔ)0。*/
                            byte = (byte >> 1) | (bi << 7);                                                                                    
                            i = 4;                            //讀取完之后等待48us再接著讀取下一個(gè)數(shù)
                            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文件內(nèi)容:
#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;

//--聲明全局函數(shù)--//
void delayms(uint );
uchar Ds18b20Init();
void Ds18b20WriteByte(uchar com);
uchar Ds18b20ReadByte();
void  Ds18b20ChangTemp();
void  Ds18b20ReadTempCom();
int   Ds18b20ReadTemp();

#endif
5. 要求添加上面代碼的注釋。
6. 調(diào)試程序、并下載到普中實(shí)驗(yàn)板,觀察實(shí)驗(yàn)現(xiàn)象。實(shí)驗(yàn)效果要求演示給指導(dǎo)教師。
實(shí)驗(yàn)現(xiàn)象是:                                                                                                      
                                                               
7. 回答DS18B20的單總線編程需要注意事項(xiàng)。
答:


四、提高實(shí)驗(yàn)
1.   請(qǐng)指出溫度顯示的最小刻度是多少?

2.   請(qǐng)畫出該實(shí)驗(yàn)的datapros()函數(shù)的軟件流程圖?

3.   修改程序,實(shí)現(xiàn)溫度顯示能顯示出小數(shù)后3位,整數(shù)保留3位。



完整的Word格式文檔51黑下載地址:

機(jī)器人原理實(shí)驗(yàn)報(bào)告二20181029.doc (1.18 MB, 下載次數(shù): 26)



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表