女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

簡述溫度傳感器DS18B20原理內(nèi)附STM32例程代碼

STM32嵌入式開發(fā) ? 來源:STM32嵌入式開發(fā) ? 作者:STM32嵌入式開發(fā) ? 2021-11-17 09:33 ? 次閱讀

DS18B20是一款常用的高精度的單總線數(shù)字溫度測量芯片。具有體積小,硬件開銷低,抗干擾能力強,精度高的特點。

DS18B20原理

傳感器參數(shù)

  • 測溫范圍為-55℃到+125℃,在-10℃到+85℃范圍內(nèi)誤差為±0.4°

  • 返回16位二進制溫度數(shù)值

  • 主機和從機通信使用單總線,即使用單線進行數(shù)據(jù)的發(fā)送和接收

  • 在使用中不需要任何外圍元件,獨立芯片即可完成工作

  • 掉電保護功能 DS18B20 內(nèi)部含有 EEPROM ,通過配置寄存器可以設定數(shù)字轉換精度和報警溫度,在系統(tǒng)掉電以后,它仍可保存分辨率及報警溫度的設定值

  • 每個DS18B20都有獨立唯一的64位-ID,此特性決定了它可以將任意多的DS18b20掛載到一根總線上,通過ROM搜索讀取相應DS18B20的溫度值

  • 寬電壓供電,電壓2.5V~5.5V

  • DS18B20返回的16位二進制數(shù)代表此刻探測的溫度值,其高五位代表正負。如果高五位全部為1,則代表返回的溫度值為負值。如果高五位全部為0,則代表返回的溫度值為正值。后面的11位數(shù)據(jù)代表溫度的絕對值,將其轉換為十進制數(shù)值之后,再乘以0.0625即可獲得此時的溫度值

傳感器引腳及原理圖

DS18B20一共有三個引腳,分別是:

8f2b146a-4728-11ec-b939-dac502259ad0.png

單個DS18B20接線方式:VDD接到電源,DQ接單片機引腳,同時外加上拉電阻,GND接地。

注意這個上拉電阻是必須的,就是DQ引腳必須要一個上拉電阻。

DS18B20上拉電阻

首先來看一下什么是場效應管(MOSFET)。

MOS管是電壓控制型元器件,只要對柵極施加一定電壓,DS就會導通,MOS基礎相關文章:MOS管基本認識

漏極開路:MOS管的柵極G和輸入連接,源極S接公共端,漏極D懸空(開路)什么也沒有接,直接輸出 ,這時只能輸出低電平和高阻態(tài),不能輸出高電平。

那么這個時候會出現(xiàn)三種情況:

  • 下圖a為正常輸出(內(nèi)有上拉電阻):場效應管導通時,輸出低電位輸出低電位,截止時輸出高電位

  • 下圖b為漏極開路輸出,外接上拉電阻:場效應管導通時,驅動電流是從外部的VCC流經(jīng)電阻通過MOSFET到GND,輸出低電位,截止時輸出高電位

  • 下圖c為漏極開路輸出,無外接上拉電阻:場效應管導通時輸出低電位,截止呈高阻態(tài)(斷開)

8fda32ec-4728-11ec-b939-dac502259ad0.png

總結一下:

開漏輸出只能輸出低電平,不能輸出高電平。漏極開路輸出高電平時必須在輸出端與正電源(VCC)間外接一個上拉電阻。否則只能輸出高阻態(tài)。

DS18B20 是單線通信,即接收和發(fā)送都是這個通信腳進行的。其接收數(shù)據(jù)時為高電阻輸入,其發(fā)送數(shù)據(jù)時是開漏輸出,本身不具有輸出高電平的能力,即輸出0時通過MOS下拉為低電平,而輸出1時,則為高阻,需要外接上拉電阻將其拉為高電平。因此,需要外接上拉電阻,否則無法輸出1。

外接上拉電阻阻值:

DS18B20的工作電流約為1mA,VCC一般為5V,則電阻R=5V/1mA=5KΩ,所以正常選擇4.7K電阻,或者相近的電阻值。

DS18B20寄生電源

DS18B20的另一個特點是不需要再外部供電下即可工作。當總線高電平時能量由單線上拉電阻經(jīng)過DQ引腳獲得。高電平同時充電一個內(nèi)部電容,當總線低電平時由此電容供應能量。這種供電方法被稱為“寄生電源”。另外一種選擇是DSl8B20由接在VDD的外部電源供電。

DS18B20內(nèi)部構成

主要由以下3部分組成:

  • 64 位ROM

  • 高速暫存器

  • 存儲器

64位ROM存儲獨有的序列號,ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼,每個DS18B20的64位序列號均不相同。這樣就可以實現(xiàn)一根總線上掛接多個DS18B20的目的。

高速暫存器包含:

  • 溫度傳感器

  • 一個字節(jié)的溫度上限和溫度下限報警觸發(fā)器(TH和TL)

  • 配置寄存器允許用戶設定9位,10位,11位和12位的溫度分辨率,分別對應著溫度的分辨率為:0.5°C,0.25°C,0.125°C,0.0625°C,默認為12位分辨率

存儲器:由一個高速的RAM和一個可擦除的EEPROM組成,EEPROM存儲高溫和低溫觸發(fā)器(TH和TL)以及配置寄存器的值,(就是存儲低溫和高溫報警值以及溫度分辨率)

DS18B20溫度讀取與計算

DS18B20采用16位補碼的形式來存儲溫度數(shù)據(jù),溫度是攝氏度。當溫度轉換命令發(fā)布后,經(jīng)轉換所得的溫度值以二字節(jié)補碼形式存放在高速暫存存儲器的第0和第1個字節(jié)。

高字節(jié)的五個S為符號位,溫度為正值時S=1,溫度為負值時S=0。

剩下的11位為溫度數(shù)據(jù)位,對于12位分辨率,所有位全部有效,對于11位分辨率,位0(bit0)無定義,對于10位分辨率,位0和位1無定義,對于9位分辨率,位0,位1,和位2無定義。

對應的溫度計算:

當五個符號位S=0時,溫度為正值,直接將后面的11位二進制轉換為十進制,再乘以0.0625(12位分辨率),就可以得到溫度值。

當五個符號位S=1時,溫度為負值,先將后面的11位二進制補碼變?yōu)樵a(符號位不變,數(shù)值位取反后加1),再計算十進制值。再乘以0.0625(12位分辨率),就可以得到溫度值。

舉兩個例子:

  • 數(shù)字輸出07D0(00000111 11010000),轉換成10進制是2000,對應攝氏度:0.0625x2000=125°C

  • 數(shù)字輸出為 FC90,首先取反,然后+1,轉換成原碼為:11111011 01101111,數(shù)值位轉換成10進制是870,對應攝氏度:-0.0625x870=-55°C

上述例子,用C語言來實現(xiàn)的代碼,如下:

unsignedintTemp1,Temp2,Temperature;//Temp1低八位,Temp2高八位unsigned char Minus Flag=0;  //負溫度標志位
if(Temp2&0xFC)//判斷符號位是否為1{  Minus Flag=l; //負溫度標志位置1  Temperature=((Temp2<<8)|Temp1); //高八位第八位進行整合  Temperature=((Temperature)+1); //講補碼轉換為原碼,求反,補1  Temperature*=0.0625;//求出十進制}else   //溫度為正值{  Minus Flag=0;  //負溫度標志位置0  Temperature =((Temp2<<8) |Temp1)*0.0625;}

DS18B20工作步驟

DS18B20的工作步驟可以分為三步:

  • 初始化DS18B20

  • 執(zhí)行ROM指令

  • 執(zhí)行DS18B20功能指令

其中第二步執(zhí)行ROM指令,也就是訪問每個DS18B20,搜索64位序列號,讀取匹配的序列號值,然后匹配對應的DS18B20,如果我們僅僅使用單個DS18B20,可以直接跳過ROM指令。而跳過ROM指令的字節(jié)是0xCC。

初始化DS18B20

任何器件想要使用,首先就是需要初始化,對于DS18B20單總線設備,首先初始化單總線為高電平,然后總線開始也需要檢測這條總線上是否存在DS18B20這個器件。如果這條總線上存在DS18B20,總線會根據(jù)時序要求返回一個低電平脈沖,如果不存在的話,也就不會返回脈沖,即總線保持為高電平。

初始化具體時序步驟如下:

  • 單片機拉低總線至少480us,產(chǎn)生復位脈沖,然后釋放總線(拉高電平)

  • 這時DS8B20檢測到請求之后,會拉低信號,大約60~240us表示應答

  • DS8B20拉低電平的60~240us之間,單片機讀取總線的電平,如果是低電平,那么表示初始化成功

  • DS18B20拉低電平60~240us之后,會釋放總線

DS18B20的初始化代碼如下:

/*****初始化DS18B20*****/unsigned int Init_DS18B20(void){unsigned int x=0;  DQ = 1;      //DQ復位  delay(4);    //稍做延時  DQ = 0;      //單片機將DQ拉低  delay(60);   //精確延時,大于480us  DQ = 1;      //拉高總線  delay(8);  x = DQ;      //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗  delay(4); return x;}

寫時序

總線控制器通過控制單總線高低電平持續(xù)時間從而把邏輯1或0寫DS18B20中。每次只傳輸1位數(shù)據(jù)。

單片機想要給DS18B20寫入一個0時,需要將單片機引腳拉低,保持低電平時間要在60~120us之間,然后釋放總線。

單片機想要給DS18B20寫入一個1時,需要將單片機引腳拉低,拉低時間需要大于1us,然后在15us內(nèi)拉高總線。

在寫時序起始后15μs到60μs期間,DS18B20處于采樣單總線電平狀態(tài)。如果在此期間總線為高電平,則向DS18B20寫入1;如果總線為低電平,則向DSl8B20寫入0。

注意:2次寫周期之間至少間隔1us。

924b8a3a-4728-11ec-b939-dac502259ad0.png

DS18B20寫時序的代碼如下:

/*****寫一個字節(jié)*****/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--)  {    DQ = 0;    DQ = dat&0x01;  //與1按位與運算,dat最低位為1時DQ總線為1,dat最低位為0時DQ總線為0  delay(4);    DQ = 1;    dat>>=1;   }  delay(4);}

采用多個DS18B20時,需要寫ROM指令來控制總線上的某個DS18B20。如果是單個DS18B20,直接寫跳過ROM指令0xCC即可。DS18B20寫入ROM功能指令如下表:

DS18B20的一些RAM功能指令如下表。其中常用的是溫度轉換指令,開啟溫度讀取轉換,讀取好的溫度會存儲在高速暫存器的第0個和第一個字節(jié)中。另一個常用的是讀取溫度指令,讀取高速暫存器存儲的數(shù)據(jù)。

讀時序

讀時隙由主機拉低總線電平至少1μs然后再釋放總線,讀取DS18B20發(fā)送過來的1或者0。

DS18B20在檢測到總線被拉低1微秒后,便開始送出數(shù)據(jù),若是要送出0就把總線拉為低電平直到讀周期結束。若要送出1則釋放總線為高電平。

注意:所有讀時隙必須至少需要60us,且在兩次獨立的時隙之間至少需要1ps的恢復時間。

同時注意:主機只有在發(fā)送讀暫存器命令(0xBE)或讀電源類型命令(0xB4)后,立即生成讀時隙指令,DS18B20才能向主機傳送數(shù)據(jù)。也就是先發(fā)讀取指令,再發(fā)送讀時隙。

最后一點:寫時序注意是先寫命令的低字節(jié),比如寫入跳過ROM指令0xCC(11001100),寫的順序是“零、零、壹、壹、零、零、壹、壹”。

讀時序時是先讀低字節(jié),在讀高字節(jié),也就是先讀取高速暫存器的第0個字節(jié)(溫度的低8位),在讀取高速暫存器的第1個字節(jié)(溫度的高8位) 我們正常使用DS18B20讀取溫度讀取兩個溫度字節(jié)即可。

STM32例程

DS18B20.c代碼:

#include "ds18b20.h"#include "delay.h"
//復位DS18B20void DS18B20_Rst(void){                   DS18B20_IO_OUT();   //SET PG11 OUTPUT    DS18B20_DQ_OUT=0;   //拉低DQ    delay_us(750);      //拉低750us    DS18B20_DQ_OUT=1;   //DQ=1   delay_us(15);       //15US}//等待DS18B20的回應//返回1:未檢測到DS18B20的存在//返回0:存在u8 DS18B20_Check(void){     u8 retry=0;  DS18B20_IO_IN();  //SET PG11 INPUT   while (DS18B20_DQ_IN&&retry<200)  {    retry++;    delay_us(1);  };   if(retry>=200)return 1;else retry=0;while (!DS18B20_DQ_IN&&retry<240)  {    retry++;    delay_us(1);  };if(retry>=240)return 1;      return 0;}//從DS18B20讀取一個位//返回值:1/0u8 DS18B20_Read_Bit(void){    u8 data;  DS18B20_IO_OUT();  //SET PG11 OUTPUT    DS18B20_DQ_OUT=0;   delay_us(2);    DS18B20_DQ_OUT=1;   DS18B20_IO_IN();  //SET PG11 INPUT  delay_us(12);if(DS18B20_DQ_IN)data=1;else data=0;       delay_us(50);           return data;}//從DS18B20讀取一個字節(jié)//返回值:讀到的數(shù)據(jù)u8 DS18B20_Read_Byte(void){            u8 i,j,dat;    dat=0;for (i=1;i<=8;i++)   {        j=DS18B20_Read_Bit();        dat=(j<<7)|(dat>>1);    }                return dat;}//寫一個字節(jié)到DS18B20//dat:要寫入的字節(jié)void DS18B20_Write_Byte(u8 dat){                 u8 j;    u8 testb;  DS18B20_IO_OUT();  //SET PG11 OUTPUT;for (j=1;j<=8;j++)   {        testb=dat&0x01;        dat=dat>>1;if (testb)         {            DS18B20_DQ_OUT=0;  // Write 1            delay_us(2);                                        DS18B20_DQ_OUT=1;            delay_us(60);                     }else        {            DS18B20_DQ_OUT=0;  // Write 0            delay_us(60);                         DS18B20_DQ_OUT=1;            delay_us(2);                                  }    }}//開始溫度轉換void DS18B20_Start(void){                                  DS18B20_Rst();         DS18B20_Check();       DS18B20_Write_Byte(0xcc);  // skip rom    DS18B20_Write_Byte(0x44);  // convert} 

//初始化DS18B20的IO口 DQ 同時檢測DS的存在//返回1:不存在//返回0:存在       u8 DS18B20_Init(void){   GPIO_InitTypeDef  GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);   //使能PORTG口時鐘 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;        //PORTG.11 推挽輸出   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   GPIO_Init(GPIOG, &GPIO_InitStructure);

   GPIO_SetBits(GPIOG,GPIO_Pin_11);    //輸出1

   DS18B20_Rst();

return DS18B20_Check();}  //從ds18b20得到溫度值//精度:0.1C//返回值:溫度值 (-550~1250) short DS18B20_Get_Temp(void){    u8 temp;    u8 TL,TH;short tem;    DS18B20_Start ();        // ds1820 start convert    DS18B20_Rst();    DS18B20_Check();       DS18B20_Write_Byte(0xcc);  // skip rom    DS18B20_Write_Byte(0xbe);  // convert          TL=DS18B20_Read_Byte();   // LSB       TH=DS18B20_Read_Byte();   // MSB  
if(TH>7)    {        TH=~TH;        TL=~TL;         temp=0;          //溫度為負      }else temp=1;        //溫度為正            tem=TH;           //獲得高八位    tem<<=8;        tem+=TL;          //獲得底八位    tem=(float)tem*0.625;    //轉換     if(temp)return tem;     //返回溫度值else return -tem;    }

DS18B20.h代碼:

#ifndef __DS18B20_H #define __DS18B20_H #include "sys.h"

//IO方向設置#define DS18B20_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}#define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}//IO操作函數(shù)                         #define  DS18B20_DQ_OUT PGout(11) //數(shù)據(jù)端口  PA0 #define  DS18B20_DQ_IN  PGin(11)  //數(shù)據(jù)端口  PA0 
u8 DS18B20_Init(void);//初始化DS18B20short DS18B20_Get_Temp(void);//獲取溫度void DS18B20_Start(void);//開始溫度轉換void DS18B20_Write_Byte(u8 dat);//寫入一個字節(jié)u8 DS18B20_Read_Byte(void);//讀出一個字節(jié)u8 DS18B20_Read_Bit(void);//讀出一個位u8 DS18B20_Check(void);//檢測是否存在DS18B20void DS18B20_Rst(void);//復位DS18B20    #endif

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2564

    文章

    52664

    瀏覽量

    764181
  • STM32
    +關注

    關注

    2290

    文章

    11018

    瀏覽量

    362653
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70302

原文標題:溫度傳感器DS18B20原理,附STM32例程代碼

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    單片機實例項目:DS18B20溫度傳感器

    單片機實例項目:DS18B20溫度傳感器,推薦下載!
    發(fā)表于 06-03 20:59

    基于FPGA的DS18B20數(shù)字溫度傳感器測溫實例

    本文將使用三段式狀態(tài)機(Moore型)的寫法來對DS18B20進行測溫操作,以便了解DS18B20和熟悉三段式狀態(tài)機的寫法。
    的頭像 發(fā)表于 03-17 11:06 ?1324次閱讀
    基于FPGA的<b class='flag-5'>DS18B20</b>數(shù)字<b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>測溫實例

    DS18B20實時溫度傳感器中文資料

    DS18B20 是一種單總線數(shù)字溫度傳感器,它被廣泛應用于各種領域,例如氣象監(jiān)測、室內(nèi)溫度控制、工業(yè)自動化等。DS18B20 采用了單總線接
    發(fā)表于 02-28 17:02 ?5次下載

    基于FPGA的溫度傳感器(ds18b20)驅動設計

    本篇主要討論基于FPGA的溫度傳感器ds18b20)驅動設計---第一版 設計實現(xiàn):利用FPGA驅動DS18b20,讀取到溫度數(shù)值顯示到數(shù)
    的頭像 發(fā)表于 01-16 14:08 ?1091次閱讀
    基于FPGA的<b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>(<b class='flag-5'>ds18b20</b>)驅動設計

    【正點原子STM32H7R3開發(fā)套件試用體驗】DS18B20、DHT11溫濕度采集

    環(huán)境溫濕度數(shù)據(jù)的主要流程和關鍵代碼,并對這兩款常見傳感器進行了介紹。 DS18B20 DS18B20 數(shù)字溫度計是 DALLAS 公司生產(chǎn)的
    發(fā)表于 01-01 11:16

    《DNESP32S3使用指南-IDF版_V1.6》第二十九章 DS18B20實驗

    第二十九章 DS18B20實驗 本章,我們將介紹ESP32-S3如何讀取外部溫度傳感器溫度,來得到較為準確的環(huán)境溫度。我們將學習單總線技術
    發(fā)表于 12-25 09:43

    CW32模塊使用 DS18B20溫度傳感器

    DS18B20數(shù)字溫度傳感器提供9位至12位精度的溫度測量,并具有非易失性用戶可編程上下觸發(fā)點報警功能。DS18B20通過單總線通信,根據(jù)定
    的頭像 發(fā)表于 11-26 17:47 ?611次閱讀
    CW32模塊使用 <b class='flag-5'>DS18B20</b><b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>

    DS18B20溫度傳感器的工作原理和硬件設計

    通過本文可以了解DS18B20溫度傳感器工作原理、硬件設計、DS18B20單總線接口驅動編寫。
    的頭像 發(fā)表于 10-24 14:38 ?1.1w次閱讀
    <b class='flag-5'>DS18B20</b><b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>的工作原理和硬件設計

    ds18b20傳感器的使用方法

    DS18B20是一種廣泛使用的數(shù)字溫度傳感器,它基于1-Wire(單總線)通信協(xié)議。這種傳感器因其高精度、易用性和低成本而受到歡迎。 DS18B20
    的頭像 發(fā)表于 10-18 14:52 ?2635次閱讀

    ds18b20溫度傳感器怎么接線

    DS18B20是一種廣泛使用的數(shù)字溫度傳感器,它基于1-Wire(一線)通信協(xié)議工作。這種傳感器因其高精度、易用性和低成本而受到歡迎。 DS18B2
    的頭像 發(fā)表于 10-18 14:50 ?4106次閱讀

    ds18b20溫度傳感器如何使用

    DS18B20是一款廣泛使用的數(shù)字溫度傳感器,它具有高精度、低功耗和易于使用的特點。 DS18B20溫度
    的頭像 發(fā)表于 09-03 16:51 ?1530次閱讀

    ds18b20溫度傳感器是什么類型

    DS18B20溫度傳感器是一種數(shù)字溫度傳感器,它屬于單總線(One-Wire)數(shù)字溫度
    的頭像 發(fā)表于 09-03 16:46 ?1993次閱讀

    ds18b20溫度傳感器和dht11的區(qū)別

    DS18B20和DHT11都是常用的溫度和濕度傳感器,它們在許多項目和應用中都有廣泛的應用。 1. 工作原理 DS18B20 DS18B20
    的頭像 發(fā)表于 09-03 16:44 ?4729次閱讀

    基于51單片機DS18B20溫度采集控制風扇設計

    本資源內(nèi)容概要:? ? ? ?這是基于51單片機DS18B20溫度采集控制風扇設計包含了電路圖源文件(Altiumdesigner軟件打開)、C語言程序源代碼(keil軟件打開)、元件清單
    發(fā)表于 06-26 10:43 ?0次下載

    DS18B20溫度傳感器工作原理

    DS18B20以其獨特的工作原理、卓越的技術參數(shù)和廣泛的應用場景,成為了市場的明星產(chǎn)品。 深入了解DS18B20的工作原理 DS18B20溫度傳感
    的頭像 發(fā)表于 06-19 16:01 ?2235次閱讀