性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

ReCclay
認(rèn)證:VIP會(huì)員
所在專題目錄 查看專題
【藍(lán)橋杯單片機(jī)組模塊】3、上手 CT107D 外設(shè)驅(qū)動(dòng)之?dāng)?shù)碼管模塊
【藍(lán)橋杯單片機(jī)組模塊】4、按鍵模塊
【藍(lán)橋杯單片機(jī)組模塊】5、EEPROM模塊
【藍(lán)橋杯單片機(jī)組模塊】6、AD/DA轉(zhuǎn)換模塊
【藍(lán)橋杯單片機(jī)組模塊】7、DS18B20溫度傳感器模塊
【藍(lán)橋杯單片機(jī)組模塊】8、DS1302時(shí)鐘模塊
作者動(dòng)態(tài) 更多
【FPGA基礎(chǔ)】基于 Pango Design Suite(PDS) 的FPGA開發(fā)流程
2021-05-14 11:22
【FPGA基礎(chǔ)】基于Quartus Prime 17.1 的FPGA開發(fā)流程
2021-05-08 17:49
【AD快速入門】8051最小系統(tǒng)繪制
2021-04-22 10:03
藍(lán)橋嵌入式之 ADC電壓采集與顯示
2021-04-14 11:48
藍(lán)橋嵌入式之 實(shí)時(shí)時(shí)鐘RTC
2021-04-13 14:50

【藍(lán)橋杯單片機(jī)組模塊】7、DS18B20溫度傳感器模塊

?導(dǎo)讀:《藍(lán)橋杯單片機(jī)組》專欄文章是博主2018年參加藍(lán)橋杯的單片機(jī)組比賽所做的學(xué)習(xí)筆記,在當(dāng)年的比賽中,博主是獲得了省賽一等獎(jiǎng),國賽二等獎(jiǎng)的成績。成績雖談不上最好,但至少問心無愧。如今2021年回頭再看該系列文章,仍然感觸頗多。為了能更好地幫助到單片機(jī)初學(xué)者,今年特地抽出時(shí)間對當(dāng)年的文章邏輯和結(jié)構(gòu)進(jìn)行重構(gòu),以達(dá)到初學(xué)者快速上手的目的。需要指出的是,由于本人水平有限,如有錯(cuò)誤還請讀者指出,非常感謝。那么,接下來讓我們一起開始愉快的學(xué)習(xí)吧。

上一節(jié)我們通過PCF8591這個(gè)期間入門學(xué)習(xí)了ADC相關(guān)知識(shí),本篇博文我們繼續(xù)再來學(xué)習(xí)一下一個(gè)常見的溫度傳感器模塊,它使用的通信協(xié)議是DS18B20,話不多說,開搞。程序代碼可到Github下載<傳送門>。

一、基礎(chǔ)理論

注意:18B20對時(shí)序要求嚴(yán)格,不可被中斷打斷!一旦打斷會(huì)出現(xiàn)亂碼,顯示的溫度是亂碼。所以切記,操作的時(shí)候關(guān)EA !

2018年3月30日更:中午吃完飯仔細(xì)想想這個(gè)里面還是有問題的,關(guān)了中斷意味著我們的實(shí)時(shí)任務(wù)處理不了了!可能導(dǎo)致部分功能就沒法實(shí)現(xiàn)了!既然現(xiàn)在面臨的問題是:溫度顯示是亂碼。那再想一下,原因還是我們直接從18b20讀然后直接實(shí)時(shí)顯示導(dǎo)致的,那我們不實(shí)時(shí)顯示,而是放到緩沖區(qū)里面。然后對溫度進(jìn)行合法性檢驗(yàn)再從緩沖區(qū)里讀出顯示不也可以嘛!


注意最下面程序中的軟件延時(shí)操作技巧,IT單片機(jī)和12T單片機(jī),關(guān)于nop延時(shí),可以看這里。<傳送門>

這里寫圖片描述

一共 2 個(gè)字節(jié),LSB 是低字節(jié),MSB 是高字節(jié),其中 MSb 是字節(jié)的高位,LSb 是字節(jié)的低位??梢钥闯鰜?,二進(jìn)制數(shù)字,每一位代表的溫度的含義,都表示出來了。其中 S表示的是符號位,低 11 位都是 2 的冪,用來表示最終的溫度。DS18B20 的溫度測量范圍是從-55 度到+125 度,而溫度數(shù)據(jù)的表現(xiàn)形式,有正負(fù)溫度,寄存器中每個(gè)數(shù)字如同卡尺的刻度一樣分布。

這里寫圖片描述

二進(jìn)制數(shù)字最低位變化 1,代表溫度變化 0.0625 度的映射關(guān)系。當(dāng) 0 度的時(shí)候,那就是0x0000,當(dāng)溫度 125 度的時(shí)候,對應(yīng)十六進(jìn)制是 0x07D0,當(dāng)溫度是零下 55 度的時(shí)候,對應(yīng)的數(shù)字是 0xFC90。反過來說,當(dāng)數(shù)字是 0x0001 的時(shí)候,那溫度就是 0.0625 度了。

對應(yīng)的協(xié)議為 1-wire!!!

1.1、初始化

這里寫圖片描述

和 I 2 C 的尋址類似,1-Wire 總線開始也需要檢測這條總線上是否存在 DS18B20 這個(gè)器件。如果這條總線上存在 DS18B20,總線會(huì)根據(jù)時(shí)序要求返回一個(gè)低電平脈沖,如果不存在的話,也就不會(huì)返回脈沖,即總線保持為高電平,所以習(xí)慣上稱之為檢測存在脈沖。

存在脈沖檢測過程,首先單片機(jī)要拉低這個(gè)引腳,持續(xù)大概 480us 到 960us 之間的時(shí)間即可,我們的程序中持續(xù)了 500us。然后,單片機(jī)釋放總線,就是給高電平,DS18B20 等待大概 15 到 60us 后,會(huì)主動(dòng)拉低這個(gè)引腳大概是 60 到 240us,而后 DS18B20 會(huì)主動(dòng)釋放總線,這樣 IO 口會(huì)被上拉電阻自動(dòng)拉高。

由于 DS18B20 時(shí)序要求非常嚴(yán)格,所以在操作時(shí)序的時(shí)候,為了防止中斷干擾總線時(shí)序,先關(guān)閉總中斷。然后第一步,拉低 DS18B20 這個(gè)引腳,持續(xù) 500us;第二步,IO釋放總線,延時(shí) 60us;第三步,讀取存在脈沖,并且等待存在脈沖結(jié)束。

這里寫圖片描述

1.2、ROM 操作指令

總線上可以掛多個(gè)器件,通過不同的器件地址來訪問不同的器件。同樣,1-Wire 總線也可以掛多個(gè)器件,但是它只有一條線,如何區(qū)分不同的器件呢?

在每個(gè) DS18B20 內(nèi)部都有一個(gè)唯一的 64 位長的序列號,這個(gè)序列號值就存在 DS18B20內(nèi)部的 ROM 中。開始的 8 位是產(chǎn)品類型編碼(DS18B20 是 0x10),接著的 48 位是每個(gè)器件唯一的序號,最后的 8 位是 CRC 校驗(yàn)碼。DS18B20 可以引出去很長的線,最長可以到幾十米,測不同位置的溫度。單片機(jī)可以通過和DS18B20 之間的通信,獲取每個(gè)傳感器所采集到的溫度信息,也可以同時(shí)給所有的 DS18B20 發(fā)送一些指令。

Skip ROM(跳過 ROM):0xCC。當(dāng)總線上只有一個(gè)器件的時(shí)候,可以跳過 ROM,不進(jìn)行 ROM 檢測。

1.3、RAM 存儲(chǔ)器操作指令

RAM 讀取指令,常用的就兩條

Read Scratchpad(讀暫存寄存器):0xBE

DS18B20 的溫度數(shù)據(jù)是 2 個(gè)字節(jié),我們讀取數(shù)據(jù)的時(shí)候,先讀取到的低位,然后才是高位!

Convert Temperature(啟動(dòng)溫度轉(zhuǎn)換):0x44

當(dāng)我們發(fā)送一個(gè)啟動(dòng)溫度轉(zhuǎn)換的指令后,DS18B20 開始進(jìn)行轉(zhuǎn)換。從轉(zhuǎn)換開始到獲取溫度,DS18B20 是需要時(shí)間的,而這個(gè)時(shí)間長短取決于 DS18B20 的精度。前邊說 DS18B20 最高可以用 12 位來存儲(chǔ)溫度,但是也可以用 11 位,10 位和 9 位一共四種格式。位數(shù)越高,精度越高,9 位模式最低位變化 1 個(gè)數(shù)字溫度變化 0.5 度,同時(shí)轉(zhuǎn)換速度也要快一些。

這里寫圖片描述

其中寄存器 R1 和 R0 決定了轉(zhuǎn)換的位數(shù),出廠默認(rèn)值就 11,也就是 12 位表示溫度,最大的轉(zhuǎn)換時(shí)間是 750ms。當(dāng)啟動(dòng)轉(zhuǎn)換后,至少要再等 750ms 之后才能讀取溫度,否則讀到的溫度有可能是錯(cuò)誤的值。

1.4、DS18B20 的位讀寫時(shí)序

寫相關(guān)

當(dāng)要給 DS18B20 寫入 0 的時(shí)候,單片機(jī)直接將引腳拉低,持續(xù)時(shí)間大于 60us 小于 120us就可以了。圖上顯示的意思是,單片機(jī)先拉低 15us 之后,DS18B20 會(huì)在從 15us 到 60us 之間的時(shí)間來讀取這一位,DS18B20 最早會(huì)在 15us 的時(shí)刻讀取,典型值是在 30us 的時(shí)刻讀取,最多不會(huì)超過 60us,DS18B20 必然讀取完畢,所以持續(xù)時(shí)間超過 60us 即可。

當(dāng)要給 DS18B20 寫入 1 的時(shí)候,單片機(jī)先將這個(gè)引腳拉低,拉低時(shí)間大于 1us,然后馬上釋放總線,即拉高引腳,并且持續(xù)時(shí)間也要大于 60us。和寫 0 類似的是,DS18B20 會(huì)在15us 到 60us 之間來讀取這個(gè) 1

這里寫圖片描述

讀相關(guān)

當(dāng)要讀取 DS18B20 的數(shù)據(jù)的時(shí)候,我們的單片機(jī)首先要拉低這個(gè)引腳,并且至少保持1us 的時(shí)間,然后釋放引腳,釋放完畢后要盡快讀取。從拉低這個(gè)引腳到讀取引腳狀態(tài),不能超過 15us。大家從圖 16-18 可以看出來,主機(jī)采樣時(shí)間,也就是 MASTER SAMPLES,是在 15us 之內(nèi)必須完成的。

這里寫圖片描述

常用的帶小數(shù)的數(shù)據(jù)處理方法有兩種,一種是定義成浮點(diǎn)型直接處理,第二種是定義成整型,然后把小數(shù)和整數(shù)部分分離出來,在合適的位置點(diǎn)上小數(shù)點(diǎn)即可。

特別強(qiáng)調(diào):DS18B20 的時(shí)序比較嚴(yán)格,寫的過程中最好不要有中斷打斷,但是在兩個(gè)“位”之間的間隔,是大于 1 小于無窮的,那在這個(gè)時(shí)間段,我們是可以開中斷來處理其它程序的。

二、動(dòng)手實(shí)驗(yàn)

貼出DS18B20的底層代碼...

#include "config.h"void Delay(u8 us){  do{  _nop_();  _nop_();  _nop_();  _nop_();  _nop_();  _nop_();  _nop_();  _nop_(); }while(--us);}bit Get18B20Ack(){ bit ack;  DS18B20_IO = 0; Delay(250); Delay(250); DS18B20_IO = 1; Delay(60); ack = DS18B20_IO; while(!DS18B20_IO);  return ack;  }void DS18B20Write(u8 dat){  u8 mask; for(mask=0x01; mask!=0; mask<<=1) {  DS18B20_IO = 0;  Delay(2);   if(dat&mask)  {    DS18B20_IO = 1;  }  else  {    DS18B20_IO = 0;  }  Delay(60);  DS18B20_IO = 1; }}u8 DS18B20Read(){  u8 mask, dat=0;  for(mask=0x01; mask!=0; mask<<=1) {  DS18B20_IO = 0;  Delay(2);  DS18B20_IO = 1;  Delay(2);   if(DS18B20_IO)  {    dat |= mask;  }  Delay(60); }  return dat; }bit Start18B20(){  bit ack; ack = Get18B20Ack(); if(ack == 0) {   DS18B20Write(0xCC);  DS18B20Write(0x44);  } return ~ack;}bit Get18B20Temp(int *temp){  bit ack; u8 LSB, MSB; ack = Get18B20Ack(); if(ack == 0) {   DS18B20Write(0xCC);  DS18B20Write(0xBE);  LSB = DS18B20Read();  MSB = DS18B20Read();  *temp = ((u16)MSB<<8) + LSB; } return ~ack;} 

后記

如果想實(shí)現(xiàn),顯示小數(shù)點(diǎn)后×位,也是可以的。 小數(shù)在數(shù)碼管上的處理,兩種思路:

  • 統(tǒng)一定義為整型,最后再加小數(shù)點(diǎn)。
  • 還有一種是定義為浮點(diǎn)型,然后擴(kuò)大相應(yīng)的倍數(shù)再加小數(shù)點(diǎn)。(emmm,,,好像一樣。^_^)

這里說一種自己的實(shí)現(xiàn):通過datasheet其實(shí)是可以知道它的精度是0.0625的,然后我們?nèi)绻肴〉叫?shù)點(diǎn)后兩位的話,其實(shí)算出來的整數(shù)后乘以6.25就行。

這里寫圖片描述

這里寫圖片描述

小結(jié):本篇文章主要介紹了單片機(jī)學(xué)習(xí)中的一個(gè)重要模塊:DS18B20。在該部分學(xué)習(xí)中并沒有什么太難的知識(shí)點(diǎn),反而是一些技巧性的東西比較多,這個(gè)多多總結(jié)就可以了。

希望大家多多支持我的原創(chuàng)文章。如有錯(cuò)誤,請大家及時(shí)指正,非常感謝。

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 355
收藏 341
關(guān)注 431
成為作者 賺取收益
全部留言
0/200
  • dy-i2UfRuvP 2021-05-19 13:22
    精彩,很多東西還沒接觸到
    回復(fù)
  • dy-iipPZRPN 2021-05-13 22:45
    對我很有幫助
    回復(fù)
  • dy-3EbVR6Ei 2021-05-13 22:36
    思路清晰,受益匪淺
    回復(fù)
  • dy-Xq2JxpfN 2021-05-13 22:18
    學(xué)習(xí)了
    回復(fù)
  • dy-9g42stbW 2021-05-13 22:10
    佩服樓主
    回復(fù)
  • dy-mLj7kl5v 2021-05-13 20:43
    對我很有幫助
    回復(fù)
  • dy-apcih3c1 2021-05-13 20:26
    思路清晰,受益匪淺
    回復(fù)
  • dy-k78ZHtFD 2021-05-13 20:09
    學(xué)習(xí)了
    回復(fù)
  • dy-nAWdnPGS 2021-05-13 18:55
    請教一下
    回復(fù)
  • dy-prSX6RBY 2021-05-13 18:48
    比論文強(qiáng)一萬倍
    回復(fù)
  • dy-jqGVYqsF 2021-05-13 16:53
    學(xué)習(xí)了
    回復(fù)
  • dy-VIQ9auhf 2021-05-13 15:06
    請教一下
    回復(fù)
  • dy-7mura2gg 2021-05-13 14:50
    精彩,很多東西還沒接觸到
    回復(fù)
  • dy-YN3DYTeH 2021-05-13 14:41
    學(xué)習(xí)了
    回復(fù)
  • dy-9hjGevyn 2021-05-13 13:58
    對我很有幫助
    回復(fù)
  • dy-H1WY5jXH 2021-05-13 13:25
    感謝分享
    回復(fù)
  • dy-wVQjSHHX 2021-05-13 13:09
    不亞于看了一篇高質(zhì)量論文
    回復(fù)
  • dy-88VlYaFf 2021-05-12 15:53
    感謝分享
    回復(fù)
  • dy-9QTV6UZW 2021-05-12 15:30
    對我很有幫助
    回復(fù)
  • dy-WYS5BCmB 2021-05-12 15:16
    什么時(shí)候更新
    回復(fù)