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

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5606|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)讀取ds18b20溫度值并定時(shí)通過(guò)串口和數(shù)碼管顯示

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
   本次實(shí)驗(yàn)我們?cè)诹私鉁囟葌鞲衅鞯墓ぷ髟砝锿瑫r(shí)可以初步了解如何下那個(gè)上位機(jī)發(fā)送數(shù)據(jù)并顯示出來(lái)。   DS18B20是一款常用的高精度的單總線數(shù)字溫度測(cè)量芯片。具有體積小,硬件開(kāi)銷低,抗干擾能力強(qiáng),精度高的特點(diǎn)


   傳感器參數(shù):   
     測(cè)溫范圍為-55℃到+125℃,在-10℃到+85℃范圍內(nèi)誤差為±0.4°。返回16位二進(jìn)制溫度數(shù)值。
     主機(jī)和從機(jī)通信使用單總線,即使用單線進(jìn)行數(shù)據(jù)的發(fā)送和接收
     在使用中不需要任何外圍元件,獨(dú)立芯片即可完成工作。
     掉電保護(hù)功能 DS18B20 內(nèi)部含有 EEPROM ,通過(guò)配置寄存器可以設(shè)定數(shù)字轉(zhuǎn)換精度和報(bào)警溫度,在系統(tǒng)掉電以后,它仍可保存分辨率及報(bào)警溫度的設(shè)定值。
     每個(gè)DS18B20都有獨(dú)立唯一的64位-ID,此特性決定了它可以將任意多的DS18b20掛載到一根總線上,通過(guò)ROM搜索讀取相應(yīng)DS18B20的溫度值
     寬電壓供電,電壓2.5V~5.5V
      DS18B20返回的16位二進(jìn)制數(shù)代表此刻探測(cè)的溫度值,其高五位代表正負(fù)。如果高五位全部為1,則代表返回的溫度值為負(fù)值。如果高五位全部為0,則代表返回的溫度值為正值。后面的11位數(shù)據(jù)代表溫度的絕對(duì)值,將其轉(zhuǎn)換為十進(jìn)制數(shù)值之后,再乘以0.0625即可獲得此時(shí)的溫度值。

傳感器引腳及原理圖
  DS18B20傳感器的引腳及封裝圖如下:


DS18B20一共有三個(gè)引腳,分別是:
       GND:電源地線    DQ:數(shù)字信號(hào)輸入/輸出端。   VDD:外接供電電源輸入端。

       單個(gè)DS18B20接線方式: VDD接到電源,DQ接單片機(jī)引腳,同時(shí)外加上拉電阻,GND接地
       注意這個(gè)上拉電阻是必須的,就是DQ引腳必須要一個(gè)上拉電阻

總結(jié):
       開(kāi)漏輸出只能輸出低電平,不能輸出高電平。漏極開(kāi)路輸出高電平時(shí)必須在輸出端與正電源(VCC)間外接一個(gè)上拉電阻。否則只能輸出高阻態(tài)。
DS18B20 是單線通信,即接收和發(fā)送都是這個(gè)通信腳進(jìn)行的。 其接收數(shù)據(jù)時(shí)為高電阻輸入,其發(fā)送數(shù)據(jù)時(shí)是開(kāi)漏輸出,本身不具有輸出高電平的能力,即輸出0時(shí)通過(guò)MOS下拉為低電平,而輸出1時(shí),則為高阻,需要外接上拉電阻將其拉為高電平。 因此,需要外接上拉電阻,否則無(wú)法輸出1。
外接上拉電阻阻值:
      DS18B20的工作電流約為1mA,VCC一般為5V,則電阻R=5V/1mA=5KΩ,
      所以正常選擇4.7K電阻,或者相近的電阻值。
DS18B20寄生電源

        DSl8B20的另一個(gè)特點(diǎn)是不需要再外部供電下即可工作。當(dāng)總線高電平時(shí)能量由單線上拉電阻經(jīng)過(guò)DQ引腳獲得。高電平同時(shí)充電一個(gè)內(nèi)部電容,當(dāng)總線低電平時(shí)由此電容供應(yīng)能量。這種供電方法被稱為“寄生電源”。另外一種選擇是DSl8B20由接在VDD的外部電源供電
DS18B20內(nèi)部構(gòu)成
        主要由以下3部分組成: 64 位ROM,高速暫存器,存儲(chǔ)器
64 位ROM存儲(chǔ)獨(dú)有的序列號(hào)
        ROM中的64位序列號(hào)是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼,每個(gè)DS18B20的64位序列號(hào)均不相同。這樣就可以實(shí)現(xiàn)一根總線上掛接多個(gè)DS18B20的目的。
高速暫存器包含:
     溫度傳感器
     一個(gè)字節(jié)的溫度上限和溫度下限報(bào)警觸發(fā)器(TH和TL)
     配置寄存器允許用戶設(shè)定9位,10位,11位和12位的溫度分辨率,分別對(duì)應(yīng)著溫度的分辨率為:0.5°C,0.25°C,0.125°C,0.0625°C,默認(rèn)為12位分辨率,
存儲(chǔ)器:由一個(gè)高速的RAM和一個(gè)可擦除的EEPROM組成,EEPROM存儲(chǔ)高溫和低溫觸發(fā)器(TH和TL)以及配置寄存器的值,(就是存儲(chǔ)低溫和高溫報(bào)警值以及溫度分辨率)


DS18B20高速緩存器
高速暫存器由9個(gè)字節(jié)組成
       字節(jié)0~1 是溫度存儲(chǔ)器,用來(lái)存儲(chǔ)轉(zhuǎn)換好的溫度。第0個(gè)字節(jié)存儲(chǔ)溫度低8位,第一個(gè)字節(jié)存儲(chǔ)溫度高8位
       字節(jié)2~3 是用戶用來(lái)設(shè)置最高報(bào)警和最低報(bào)警值(TH和TL)。
       字節(jié)4 是配置寄存器,用來(lái)配置轉(zhuǎn)換精度,可以設(shè)置為9~12 位。
       字節(jié)5~7 保留位。芯片內(nèi)部使用
       字節(jié)8 CRC校驗(yàn)位。是64位ROM中的前56位編碼的校驗(yàn)碼。由CRC發(fā)生器產(chǎn)生。
DS18B20溫度讀取與計(jì)算
       DS18B20采用16位補(bǔ)碼的形式來(lái)存儲(chǔ)溫度數(shù)據(jù),溫度是攝氏度。當(dāng)溫度轉(zhuǎn)換命令發(fā)布后,經(jīng)轉(zhuǎn)換所得的溫度值以二字節(jié)補(bǔ)碼形式存放在高速暫存存儲(chǔ)器的第0和第1個(gè)字節(jié)。
      高字節(jié)的五個(gè)S為符號(hào)位,溫度為正值時(shí)S=1,溫度為負(fù)值時(shí)S=0
      剩下的11位為溫度數(shù)據(jù)位,對(duì)于12位分辨率,所有位全部有效,對(duì)于11位分辨率,位0(bit0)無(wú)定義,對(duì)于10位分辨率,位0和位1無(wú)定義,對(duì)于9位分辨率,位0,位1,和位2無(wú)定義
對(duì)應(yīng)的溫度計(jì)算:
      當(dāng)五個(gè)符號(hào)位S=0時(shí),溫度為正值,直接將后面的11位二進(jìn)制轉(zhuǎn)換為十進(jìn)制,再乘以0.0625(12位分辨率),就可以得到溫度值;
      當(dāng)五個(gè)符號(hào)位S=1時(shí),溫度為負(fù)值,先將后面的11位二進(jìn)制補(bǔ)碼變?yōu)樵a(符號(hào)位不變,數(shù)值位取反后加1),再計(jì)算十進(jìn)制值。再乘以0.0625(12位分辨率),就可以得到溫度值;
      例如:
            +125℃的數(shù)字輸出07D0(00000111 11010000)
          轉(zhuǎn)換成10進(jìn)制是2000,對(duì)應(yīng)攝氏度:0.0625x2000=125°C
            -55℃的數(shù)字輸出為 FC90。
        首先取反,然后+1,轉(zhuǎn)換成原碼為:11111011 01101111
            數(shù)值位轉(zhuǎn)換成10進(jìn)制是870,對(duì)應(yīng)攝氏度:-0.0625x870=-55°C


代碼:

unsigned int Templ,Temp2,Temperature;  //Templ低八位,Temp2高八位
unsigned char Minus Flag=0;  //負(fù)溫度標(biāo)志位

if(Tenp2&0xFC)//判斷符號(hào)位是否為1
{
        Minus Flag=l; //負(fù)溫度標(biāo)志位置1
        Temperature=((Temp2<<8)|Temp1); //高八位第八位進(jìn)行整合
        Temperature=((Temperature)+1); //講補(bǔ)碼轉(zhuǎn)換為原碼,求反,補(bǔ)1
        Temperature*=0.0625;//求出十進(jìn)制
}
else   //溫度為正值
{
        Minus Flag=0;  //負(fù)溫度標(biāo)志位置0
        Temperature =((Temp2<<8) |Temp1)*0.0625;
}

配置寄存器
      在配置寄存器中,我們可以通過(guò)R0和R1設(shè)置DS18B20的轉(zhuǎn)換分辨率,DS18B20在上電后默認(rèn)R0=1和R1=1(12分辨率),寄存器中的第7位和第0位到4位保留給設(shè)備內(nèi)部使用。
單總線系統(tǒng)
      在每個(gè)DS18B20內(nèi)部都有一個(gè)唯一的64位長(zhǎng)的序列號(hào),這個(gè)序列號(hào)值就存在DS18B20內(nèi)部的ROM中。開(kāi)始的8位是產(chǎn)品類型編碼(DS18B20是10H),接著的48位是每個(gè)器件唯一的序號(hào),最后的8位是CRC校驗(yàn)碼。
      一線總線系統(tǒng)使用單總線主控來(lái)控制一個(gè)或多個(gè)從機(jī)設(shè)備。每個(gè)DS18B20都有獨(dú)立唯一的64位-ID,此特性決定了它可以將任意多的DS18b20掛載到一根總線上,通過(guò)ROM搜索讀取相應(yīng)DS18B20的溫度值。
DS18B20工作步驟
   DS18B20的工作步驟可以分為三步:
       1.初始化DS18B20
       2.執(zhí)行ROM指令
       3.執(zhí)行DS18B20功能指令
       其中第二步執(zhí)行ROM指令,也就是訪問(wèn)每個(gè)DS18B20,搜索64位序列號(hào),讀取匹配的序列號(hào)值,然后匹配對(duì)應(yīng)的DS18B20,如果我們僅僅使用單個(gè)DS18B20,可以直接跳過(guò)ROM指令。而跳過(guò)ROM指令的字節(jié)是0xCC。
      1.初始化DS18B20
      任何器件想要使用,首先就是需要初始化,對(duì)于DS18B20單總線設(shè)備,首先初始化單總線為高電平,然后總線開(kāi)始也需要檢測(cè)這條總線上是否存在DS18B20這個(gè)器件。如果這條總線上存在DS18B20,總線會(huì)根據(jù)時(shí)序要求返回一個(gè)低電平脈沖,如果不存在的話,也就不會(huì)返回脈沖,即總線保持為高電平。
初始化具體時(shí)序步驟如下:
       1.單片機(jī)拉低總線至少480us,產(chǎn)生復(fù)位脈沖,然后釋放總線(拉高電平)。
       2.這時(shí)DS8B20檢測(cè)到請(qǐng)求之后,會(huì)拉低信號(hào),大約60~240us表示應(yīng)答。
       3.DS8B20拉低電平的60~240us之間,單片機(jī)讀取總線的電平,如果是低電平,那么表示初始化成功
       4.DS18B20拉低電平60~240us之后,會(huì)釋放總線。

代碼如下:
/*****初始化DS18B20*****/
unsigned int Init_DS18B20(void)
{
  unsigned int x=0;
  DQ = 1;      //DQ復(fù)位
  delay(4);    //稍做延時(shí)
  DQ = 0;      //單片機(jī)將DQ拉低
  delay(60);   //精確延時(shí),大于480us
  DQ = 1;      //拉高總線
  delay(8);
  x = DQ;      //稍做延時(shí)后,如果x=0則初始化成功,x=1則初始化失敗
  delay(4);
  return x;
}
2.寫(xiě)時(shí)序
      總線控制器通過(guò)控制單總線高低電平持續(xù)時(shí)間從而把邏輯1或0寫(xiě)DS18B20中。每次只傳輸1位數(shù)據(jù)
      單片機(jī)想要給DS18B20寫(xiě)入一個(gè)0時(shí),需要將單片機(jī)引腳拉低,保持低電平時(shí)間要在60~120us之間,然后釋放總線;單片機(jī)想要給DS18B20寫(xiě)入一個(gè)1時(shí),需要將單片機(jī)引腳拉低,拉低時(shí)間需要大于1us,然后在15us內(nèi)拉高總線。
      在寫(xiě)時(shí)序起始后15μs到60μs期間,DS18B20處于采樣單總線電平狀態(tài)。如果在此期間總線為高電平,則向DS18B20寫(xiě)入1;如果總線為低電平,則向DSl8B20寫(xiě)入0。
      注意:2次寫(xiě)周期之間至少間隔1us
/*****寫(xiě)一個(gè)字節(jié)*****/
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
    DQ = 0;
    DQ = dat&0x01;  //與1按位與運(yùn)算,dat最低位為1時(shí)DQ總線為1,dat最低位為0時(shí)DQ總線為0
        delay(4);
    DQ = 1;
    dat>>=1;
  }
  delay(4);
}
DS18B20寫(xiě)入的功能命令:
ROM指令:
       采用多個(gè)DS18B20時(shí),需要寫(xiě)ROM指令來(lái)控制總線上的某個(gè)DS18B20
       如果是單個(gè)DS18B20,直接寫(xiě)跳過(guò)ROM指令0xCC即可
       RAM指令,DS18B20的一些功能指令
       常用的是:
       溫度轉(zhuǎn)換 0x44
       開(kāi)啟溫度讀取轉(zhuǎn)換,讀取好的溫度會(huì)存儲(chǔ)在高速暫存器的第0個(gè)和第一個(gè)字節(jié)中
       讀取溫度 0xBE
       讀取高速暫存器存儲(chǔ)的數(shù)據(jù)
讀時(shí)序:讀時(shí)隙由主機(jī)拉低總線電平至少1μs然后再釋放總線,讀取DS18B20發(fā)送過(guò)來(lái)的1或者0
       DS18B20在檢測(cè)到總線被拉低1微秒后,便開(kāi)始送出數(shù)據(jù),若是要送出0就把總線拉為低電平直到讀周期結(jié)束。若要送出1則釋放總線為高電平。
       注意:所有讀時(shí)隙必須至少需要60us,且在兩次獨(dú)立的時(shí)隙之間至少需要1ps的恢復(fù)時(shí)間
       同時(shí)注意:主機(jī)只有在發(fā)送讀暫存器命令(0xBE)或讀電源類型命令(0xB4)后,立即生成讀時(shí)隙指令,DS18B20才能向主機(jī)傳送數(shù)據(jù)。 也就是先發(fā)讀取指令,再發(fā)送讀時(shí)隙
       最后一點(diǎn): 寫(xiě)時(shí)序注意是先寫(xiě)命令的低字節(jié),比如寫(xiě)入跳過(guò)ROM指令0xCC(11001100),寫(xiě)的順序是“零、零、壹、壹、零、零、壹、壹”,
讀時(shí)序時(shí)是先讀低字節(jié),在讀高字節(jié),也就是先讀取高速暫存器的第0個(gè)字節(jié)(溫度的低8位),在讀取高速暫存器的第1個(gè)字節(jié)(溫度的高8位) 我們正常使用DS18B20讀取溫度讀取兩個(gè)溫度字節(jié)即



全部資料51hei下載地址:
讀溫度值串口ds18b20.7z (60 KB, 下載次數(shù): 124)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

無(wú)效樓層,該帖已經(jīng)被刪除
無(wú)效樓層,該帖已經(jīng)被刪除
地板
ID:891154 發(fā)表于 2022-11-27 10:44 | 只看該作者
沒(méi)有用.....
回復(fù)

使用道具 舉報(bào)

5#
ID:262 發(fā)表于 2022-11-27 14:34 | 只看該作者
樓上有用啊 我仿真結(jié)果如下

51hei.gif (57.24 KB, 下載次數(shù): 56)

51hei.gif
回復(fù)

使用道具 舉報(bào)

6#
無(wú)效樓層,該帖已經(jīng)被刪除

本版積分規(guī)則

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

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

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