久久精品卡通在线|一级片视频免费观看|91AⅤ在线爱插射在线|无码a片网站中欧美在线精品|国产亚洲99久久精品|欧洲久久精品日本无码高清片|国产主播高清福利在线|国产一极小视频观看|国产十免费十无码十在线|国产一级视频在线观看免费

您當(dāng)前的位置:鋼材 > 型鋼 > 市場(chǎng)分析

stm32f4內(nèi)部溫度傳感器,stm32溫度傳感器工作原理

來(lái)源:頭條 作者: chanong
分享到
關(guān)注德勤鋼鐵網(wǎng)在線(xiàn):
在線(xiàn)咨詢(xún):
  • 掃描或點(diǎn)擊關(guān)注德勤鋼鐵網(wǎng)在線(xiàn)客服

STM32本身內(nèi)置了溫度傳感器,但是由于芯片溫升較高等問(wèn)題,與實(shí)際溫度相差很大,所以本章介紹如何利用STM32讀取芯片的溫度來(lái)做。使用外部數(shù)字溫度傳感器獲得更準(zhǔn)確的環(huán)境溫度。在本章中,您將學(xué)**如何使用單總線(xiàn)技術(shù)實(shí)現(xiàn)STM32與外部溫度傳感器(DS18B20)之間的通信,并將從溫度傳感器獲取的溫度數(shù)據(jù)通過(guò)printf 輸出到串口助手上。本章分為以下學(xué)**目標(biāo): 1. 學(xué)**操作DS18B20。 1.1 DS18B20 概述DS18B20 是達(dá)拉斯半導(dǎo)體公司推出的一款具有“單線(xiàn)總線(xiàn)”接口的溫度傳感器。與傳統(tǒng)熱敏電阻等測(cè)溫元件相比,它是一種新型數(shù)字溫度傳感器,具有體積小、適用電壓范圍廣、與微處理器接口簡(jiǎn)單等優(yōu)點(diǎn)。簡(jiǎn)單、經(jīng)濟(jì)的1線(xiàn)總線(xiàn)結(jié)構(gòu)可以輕松構(gòu)建傳感器網(wǎng)絡(luò),并引入了構(gòu)建測(cè)量系統(tǒng)的新概念。測(cè)量溫度范圍為-55至+125C,精度為0。 5,F(xiàn)場(chǎng)溫度通過(guò)“一線(xiàn)總線(xiàn)”直接數(shù)字化傳輸,大大提高了系統(tǒng)的抗干擾能力?芍苯幼x取被測(cè)溫度,并可根據(jù)實(shí)際需求通過(guò)簡(jiǎn)單編程實(shí)現(xiàn)9-12位數(shù)字值讀取模式。我的工作時(shí)間為3:00 至5:00。 5V電壓范圍有多種封裝格式,使系統(tǒng)設(shè)計(jì)靈活方便,設(shè)置的分辨率和用戶(hù)設(shè)置的報(bào)警溫度存儲(chǔ)在EEPROM中,即使斷電也能保留。該圖顯示了其內(nèi)部結(jié)構(gòu)。

ROM中的64位序列號(hào)是出廠(chǎng)前光刻的,可以認(rèn)為是DS18B20的地址序列號(hào)。每個(gè)DS18B20 的64 位序列號(hào)都是唯一的。 64 位ROM 包括:前8 位是產(chǎn)品系列代碼,接下來(lái)的48 位是DS18B20 序列號(hào),最后8 位是之前的56 位循環(huán)冗余校驗(yàn)碼(CRC=X8)。 +X5+X4+1)。 ROM的功能是使每個(gè)DS18B20都是獨(dú)一無(wú)二的,并允許多個(gè)DS18B20連接到一條總線(xiàn)上。所有單總線(xiàn)設(shè)備都需要嚴(yán)格的信號(hào)時(shí)序以確保數(shù)據(jù)完整性。 DS18B20有六種信號(hào)類(lèi)型:復(fù)位脈沖、確認(rèn)脈沖、寫(xiě)0、寫(xiě)1、讀0和讀1。除確認(rèn)脈沖外,所有這些信號(hào)均由主機(jī)同步。所有命令和數(shù)據(jù)首先發(fā)送字節(jié)的低位。這里我們簡(jiǎn)單介紹一下這些信號(hào)的時(shí)序。 1) 復(fù)位脈沖和響應(yīng)脈沖單個(gè)總線(xiàn)上的所有通信都以初始化序列開(kāi)始。主機(jī)輸出低電平并保持低電平至少480us,以產(chǎn)生復(fù)位脈沖。然后主機(jī)釋放總線(xiàn),4.7K 上拉電阻將單總線(xiàn)拉高,延遲15-60 us,進(jìn)入接收模式(Rx)。然后,DS18B20 將總線(xiàn)拉低60 至240 us,并生成低電平響應(yīng)脈沖,如果為低電平,則延遲480 us。 2)寫(xiě)時(shí)序包括寫(xiě)0時(shí)序和寫(xiě)1時(shí)序。所有寫(xiě)入序列至少需要60微秒,并且兩個(gè)獨(dú)立寫(xiě)入序列之間至少需要1微秒恢復(fù)時(shí)間。兩個(gè)序列均以主機(jī)將總線(xiàn)拉低開(kāi)始。寫(xiě)1時(shí)序:主機(jī)輸出低電平,延時(shí)2us,然后釋放總線(xiàn),延時(shí)60us。寫(xiě)0時(shí)序:主機(jī)輸出低電平,延時(shí)60us,然后釋放總線(xiàn),延時(shí)2us。 3)讀時(shí)序單總線(xiàn)設(shè)備只有在主機(jī)發(fā)出讀時(shí)序時(shí)才向主機(jī)發(fā)送數(shù)據(jù),因此主機(jī)發(fā)出數(shù)據(jù)讀命令后,從機(jī)立即產(chǎn)生讀時(shí)序,以便發(fā)送數(shù)據(jù)。所有讀取序列至少需要60s,并且兩個(gè)獨(dú)立讀取序列之間需要至少1s的恢復(fù)時(shí)間。每個(gè)讀取序列均由主機(jī)發(fā)起,主機(jī)將總線(xiàn)拉低至少1us。主設(shè)備必須在讀取序列期間釋放總線(xiàn),并在序列開(kāi)始后15us 內(nèi)采樣總線(xiàn)狀態(tài)。一般讀取時(shí)序流程如下:主機(jī)延時(shí)2us輸出低電平,延時(shí)12us切換到輸入模式,然后讀取單總線(xiàn)當(dāng)前電平,延時(shí)50us。了解完單總線(xiàn)時(shí)序后,我們來(lái)看一下DS18B20 的典型溫度讀取流程: DS18B20 的典型溫度讀取流程為: 復(fù)位發(fā)出SKIP ROM 命令(0XCC) 啟動(dòng)轉(zhuǎn)換命令(0X44) 延遲復(fù)位SKIP 發(fā)送ROM 命令(0XCC) 發(fā)送存儲(chǔ)器讀命令(0XBE) 連續(xù)讀取2 個(gè)字節(jié)的數(shù)據(jù)(溫度等)。結(jié)尾。我們?cè)谶@里對(duì)DS18B20 進(jìn)行介紹,但更詳細(xì)的介紹請(qǐng)參閱DS18B20 技術(shù)手冊(cè)。 1.2 DS18B20電路圖

從原理圖中我們可以看出,DS18B20 使用的是單片機(jī)PG11。 1.3 初始化DS18B20 1. 在初始化之前,我們需要先初始化IO 端口。

/**************************************************** * **** ************************************* 函數(shù)名稱(chēng): ds18b20_init* 函數(shù)功能: IO端口時(shí)鐘初始化功能* 輸入: 無(wú)* 輸出: 無(wú)******************************************** **** * **** ******************************/void ds18b20_init(){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOG,ENABLE) ) ;GPIO_InitStructure.GPIO_Pin=dq;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIO_ds18b20,GPIO_InitStructure);}引腳定義在頭文件中。

#define dq (GPIO_Pin_11) //PG11#define GPIO_ds18b20 GPIOG#define ds18b20_dq_H GPIO_SetBits(GPIO_ds18b20,dq)#define ds18b20_dq_L GPIO_ResetBits(GPIO_ds18b20,dq) 2. DS18B20 初始化主機(jī)發(fā)送第一次。 480 到960 微秒的低電平脈沖,然后將總線(xiàn)釋放到高電平,并在接下來(lái)的480 微秒內(nèi)檢測(cè)總線(xiàn)。如果看到低電平,則表示總線(xiàn)上的設(shè)備已響應(yīng)。當(dāng)沒(méi)有低電平時(shí),始終存在高電平,表示總線(xiàn)上沒(méi)有任何設(shè)備響應(yīng)。 DS18B20作為從設(shè)備,一上電就檢測(cè)總線(xiàn)上是否有低電平480到960微秒,如果有,則等待15到60微秒后總線(xiàn)變?yōu)楦唠娖。關(guān)閉總線(xiàn)電源并通過(guò)持續(xù)60 至240 微秒的低脈沖進(jìn)行響應(yīng),向主機(jī)發(fā)出設(shè)備已準(zhǔn)備就緒的信號(hào)。如果沒(méi)有檢測(cè)到,則繼續(xù)檢查并等待。 3.初始化時(shí)序圖

4、例程代碼:

/**************************************************** * **** ************************************* 函數(shù)名稱(chēng): ds18b20init* 函數(shù)功能: DS18B20初始化時(shí)序* 輸入: 無(wú)* 輸出: 無(wú)******************************************** ************** * ****** ****************************** **/void ds18b20init(){DQOUTINT();//輸出ds18b20_dq_L;lay_us(480);//延遲480 微秒ds18b20_dq_H;lay_us(480);//延遲480 微秒}1.4 DS18B20 讀操作下發(fā)的各種操作命令主機(jī)包括向DS18B20 寫(xiě)入0 和1。由寫(xiě)入組成的命令字節(jié)。接收數(shù)據(jù)時(shí),進(jìn)程讀取同樣從DS18B20 發(fā)送的0 或1。因此,首先要了解主機(jī)是如何寫(xiě)0、寫(xiě)1、讀0、讀1的。寫(xiě)入周期最短為60 微秒,最長(zhǎng)為120 微秒。當(dāng)寫(xiě)周期開(kāi)始時(shí),主器件將總線(xiàn)拉低1 微秒,以指示寫(xiě)周期開(kāi)始。然后,如果主機(jī)想要寫(xiě)入0,則將總線(xiàn)設(shè)置為低電平,如果主機(jī)想要寫(xiě)入1,則將總線(xiàn)設(shè)置為高電平至少60微秒,直到寫(xiě)入周期完成,然后釋放它。為了恢復(fù)總線(xiàn),允許總線(xiàn)變高至少1 微秒。 DS18B20 檢測(cè)到總線(xiàn)被拉低后,會(huì)等待15 微秒,并開(kāi)始對(duì)總線(xiàn)進(jìn)行15 s 至45 s 采樣。采樣期間總線(xiàn)處于高電平。這是1。如果采樣期間總線(xiàn)為低電平,1. 讀操作時(shí)序圖

2. 加載運(yùn)行程序

/**************************************************** * **** ************************************* 函數(shù)名稱(chēng): DS18b20rd* 函數(shù)功能: DS18B20讀取數(shù)據(jù)時(shí)序* 輸入: 無(wú)* 輸出: 值**************************************** ********** ** *** ********************************** **********/u8 DS18b20rd(){u8 i=0,value=0; for( i=0 ;i8;i++){value=1;DQOUTINT();//輸出ds18b20_dq_L;//下拉Late_us(4);//延遲4 微米ds18b20_dq_H;lay_us(10);//延遲10 微米DQININT() ;//輸入設(shè)置if(GPIO_ReadInputDataBit(GPIO_ds18b20,dq)==1){ value|=0x80; //從低位讀取數(shù)據(jù)}delay_us(45);//delay 45的微妙之處}返回值; }1.5 DS18B20寫(xiě)數(shù)據(jù)讀操作的時(shí)序也分為兩個(gè)過(guò)程:讀0時(shí)序和讀1時(shí)序。讀周期開(kāi)始于主機(jī)將單總線(xiàn)拉低1微秒,然后將單總線(xiàn)釋放到高電平,允許DS18B20在單總線(xiàn)上發(fā)送數(shù)據(jù)。作為從機(jī),DS18B20在檢測(cè)到總線(xiàn)為低電平1微秒后開(kāi)始發(fā)送數(shù)據(jù),如果要發(fā)送0,則將總線(xiàn)拉低,直到讀周期結(jié)束。如果要發(fā)送1,則將總線(xiàn)釋放到高電平。主機(jī)首先將總線(xiàn)拉低1微秒,釋放總線(xiàn),并在15微秒內(nèi)完成總線(xiàn)采樣和檢測(cè),包括之前1微秒的總線(xiàn)電平下拉。為低電平,確認(rèn)為0。如果采樣期間總線(xiàn)為高電平,則檢查為1。讀取計(jì)時(shí)過(guò)程至少需要60 微秒才能完成。 1、寫(xiě)操作時(shí)序圖

2.編寫(xiě)運(yùn)行程序

/**************************************************** * **** ************************************* 函數(shù)名稱(chēng): ds18b20wr* 函數(shù)功能: DS18B20寫(xiě)入數(shù)據(jù)時(shí)序* 輸入: dat* 輸出: 無(wú)******************************************** ********** * **** ********************************** *****/void ds18b20wr(u8 dat){u8 i=0;DQOUTINT(); //輸出for(i=0;i8;i++){ds18b20_dq_L;//下拉延遲15 if((dat0x01)==1){ds18b20_dq_H;}else{ds18b20_dq_L;}delay_us( 60) ;//延遲60 Subtle ds18b20_dq_H;dat=1;//準(zhǔn)備發(fā)送下一位數(shù)據(jù)}} 1.6 DS18B20寄存器介紹1. 內(nèi)部結(jié)構(gòu)DS18B20主要由四部分組成。 1)64位光刻ROM 刻刻ROM中的64位序列號(hào)是在出廠(chǎng)前照相刻刻的,可以認(rèn)為是DS18B20的地址序列號(hào)。 64位光刻ROM的配置是前8位(地址:28H)是產(chǎn)品型號(hào),接下來(lái)的48位是DS18B20的序列號(hào),每個(gè)DS18B20都有不同的序列號(hào)。因此,這可以認(rèn)為是DS18B20的地址序列碼,最后8位是前面的56位循環(huán)冗余校驗(yàn)碼(CRC=X8+X5+X4+1)。由于每個(gè)DS18B20都有不同的ROM數(shù)據(jù),因此單片機(jī)可以通過(guò)一條總線(xiàn)對(duì)多個(gè)DS18B20進(jìn)行尋址,從而達(dá)到一條總線(xiàn)上有多個(gè)DS18B20的目的。

2) 溫度傳感器3) 非易失性溫度報(bào)警觸發(fā)器TH 和TL4) 配置寄存器。 2. DS18B20 的存儲(chǔ)器由高速暫存RAM 和非易失性電可擦除(E2) RAM 組成。

我們來(lái)看一下配置寄存器的第四個(gè)字節(jié)(CONFIG)。

R0 和R1 的默認(rèn)設(shè)置為11。這是12 位分辨率,因此1 位代表0.0625 攝氏度。 1.7DS18B20命令介紹

1.8 溫度讀取操作1. 溫度讀取操作DS18B20 轉(zhuǎn)換后的溫度值以2 字節(jié)補(bǔ)碼格式存儲(chǔ)在高速緩存的字節(jié)0 和1 中。所以如果你只是想讀取溫度值,你可以只讀取臨時(shí)寄存器的第0和第1字節(jié)。讀取一次D18B20的溫度: a) 初始化DS18B20。 b) 跳過(guò)ROM操作(可以在ROM中讀取DS18B20的地址、型號(hào)、配置分辨率;由于只使用了一顆DS18B20,所以不需要讀取地址型號(hào),默認(rèn)的12位分辨率即可直接使用。) c) 發(fā)送溫度轉(zhuǎn)換命令。 d) 跳過(guò)ROM 操作。 e) 發(fā)送溫度讀取命令。 f) 讀取溫度值。 2 補(bǔ)碼簡(jiǎn)介什么是補(bǔ)碼? 1) 正數(shù)的補(bǔ)碼就是正數(shù)本身。 2) 負(fù)數(shù)的補(bǔ)碼是將原數(shù)的符號(hào)反轉(zhuǎn)并加1。 DS18B20 中存儲(chǔ)的溫度值是以補(bǔ)碼格式存儲(chǔ)的,因此讀出的溫度值將是實(shí)際溫度值的補(bǔ)碼,必須轉(zhuǎn)換為原始代碼。 1)如果溫度為正,則原碼就是補(bǔ)碼本身,所以在12位分辨率下,溫度公式為:溫度值=讀數(shù)值*0.06252)如果溫度為負(fù),則原碼減去補(bǔ)碼。因此,在12 位分辨率下,公式為: 溫度值=-(讀數(shù)減1 并取反)* 0.06253。 讀取溫度編程功能

/**************************************************** * **** ******************************** 函數(shù)名稱(chēng): readtemp* 函數(shù)功能: DS18B2 溫度寄存器設(shè)置,溫度讀取* 輸入: 無(wú)* 輸出: 值******************************************** * ****** ************************************/double readtemp() //讀取溫度需要復(fù)位{u16 temp;u8 a,b;double value;ds18b20init(); //初始化ds18b20wr(0xcc); //忽略發(fā)送ROM 命令ds18b20wr(0x44); //發(fā)送溫度轉(zhuǎn)換命令Send Late_ms (800); ds18b20init(); //ds18b20wr(0xcc); //發(fā)送ROM忽略命令ds18b20wr(0xbe); //發(fā)送臨時(shí)寄存器讀命令a=DS18b20rd(); //寄存器溫度的低8位b=DS18b20rd();//溫度位的高8位temp=b;temp=(temp8)+a;if((temp0xf800)==0xf800){temp=(~temp)+1;value=temp* (-0.0625);}else{ value=temp*0.0625; }返回值;}1.9 例程主函數(shù)

/**************************************************** * **** ***************************************** 函數(shù)名稱(chēng): main* 說(shuō)明: 主程序。 * 輸入: 無(wú)* 輸出: 無(wú)* 返回值: 無(wú)***************************************** ****************************************************** *****************/int main(){double temp;printf_init();//printf初始化ds18b20_init();//DS18B20初始化while(1){temp=readtemp (); //讀取溫度printf('當(dāng)前溫度為: %0.4lf \r \n',temp);}}主程序的作用是讀取溫度。其值通過(guò)printf 輸出打印到串口助手,如下所示:

下載程序后,打開(kāi)串口,查看DTR,然后取消?梢酝ㄟ^(guò)發(fā)送字符來(lái)顯示。

責(zé)任編輯:德勤鋼鐵網(wǎng) 標(biāo)簽:

熱門(mén)搜索

相關(guān)文章

廣告
德勤鋼鐵網(wǎng) |市場(chǎng)分析

stm32f4內(nèi)部溫度傳感器,stm32溫度傳感器工作原理

chanong

|

STM32本身內(nèi)置了溫度傳感器,但是由于芯片溫升較高等問(wèn)題,與實(shí)際溫度相差很大,所以本章介紹如何利用STM32讀取芯片的溫度來(lái)做。使用外部數(shù)字溫度傳感器獲得更準(zhǔn)確的環(huán)境溫度。在本章中,您將學(xué)**如何使用單總線(xiàn)技術(shù)實(shí)現(xiàn)STM32與外部溫度傳感器(DS18B20)之間的通信,并將從溫度傳感器獲取的溫度數(shù)據(jù)通過(guò)printf 輸出到串口助手上。本章分為以下學(xué)**目標(biāo): 1. 學(xué)**操作DS18B20。 1.1 DS18B20 概述DS18B20 是達(dá)拉斯半導(dǎo)體公司推出的一款具有“單線(xiàn)總線(xiàn)”接口的溫度傳感器。與傳統(tǒng)熱敏電阻等測(cè)溫元件相比,它是一種新型數(shù)字溫度傳感器,具有體積小、適用電壓范圍廣、與微處理器接口簡(jiǎn)單等優(yōu)點(diǎn)。簡(jiǎn)單、經(jīng)濟(jì)的1線(xiàn)總線(xiàn)結(jié)構(gòu)可以輕松構(gòu)建傳感器網(wǎng)絡(luò),并引入了構(gòu)建測(cè)量系統(tǒng)的新概念。測(cè)量溫度范圍為-55至+125C,精度為0。 5,F(xiàn)場(chǎng)溫度通過(guò)“一線(xiàn)總線(xiàn)”直接數(shù)字化傳輸,大大提高了系統(tǒng)的抗干擾能力。可直接讀取被測(cè)溫度,并可根據(jù)實(shí)際需求通過(guò)簡(jiǎn)單編程實(shí)現(xiàn)9-12位數(shù)字值讀取模式。我的工作時(shí)間為3:00 至5:00。 5V電壓范圍有多種封裝格式,使系統(tǒng)設(shè)計(jì)靈活方便,設(shè)置的分辨率和用戶(hù)設(shè)置的報(bào)警溫度存儲(chǔ)在EEPROM中,即使斷電也能保留。該圖顯示了其內(nèi)部結(jié)構(gòu)。

ROM中的64位序列號(hào)是出廠(chǎng)前光刻的,可以認(rèn)為是DS18B20的地址序列號(hào)。每個(gè)DS18B20 的64 位序列號(hào)都是唯一的。 64 位ROM 包括:前8 位是產(chǎn)品系列代碼,接下來(lái)的48 位是DS18B20 序列號(hào),最后8 位是之前的56 位循環(huán)冗余校驗(yàn)碼(CRC=X8)。 +X5+X4+1)。 ROM的功能是使每個(gè)DS18B20都是獨(dú)一無(wú)二的,并允許多個(gè)DS18B20連接到一條總線(xiàn)上。所有單總線(xiàn)設(shè)備都需要嚴(yán)格的信號(hào)時(shí)序以確保數(shù)據(jù)完整性。 DS18B20有六種信號(hào)類(lèi)型:復(fù)位脈沖、確認(rèn)脈沖、寫(xiě)0、寫(xiě)1、讀0和讀1。除確認(rèn)脈沖外,所有這些信號(hào)均由主機(jī)同步。所有命令和數(shù)據(jù)首先發(fā)送字節(jié)的低位。這里我們簡(jiǎn)單介紹一下這些信號(hào)的時(shí)序。 1) 復(fù)位脈沖和響應(yīng)脈沖單個(gè)總線(xiàn)上的所有通信都以初始化序列開(kāi)始。主機(jī)輸出低電平并保持低電平至少480us,以產(chǎn)生復(fù)位脈沖。然后主機(jī)釋放總線(xiàn),4.7K 上拉電阻將單總線(xiàn)拉高,延遲15-60 us,進(jìn)入接收模式(Rx)。然后,DS18B20 將總線(xiàn)拉低60 至240 us,并生成低電平響應(yīng)脈沖,如果為低電平,則延遲480 us。 2)寫(xiě)時(shí)序包括寫(xiě)0時(shí)序和寫(xiě)1時(shí)序。所有寫(xiě)入序列至少需要60微秒,并且兩個(gè)獨(dú)立寫(xiě)入序列之間至少需要1微秒恢復(fù)時(shí)間。兩個(gè)序列均以主機(jī)將總線(xiàn)拉低開(kāi)始。寫(xiě)1時(shí)序:主機(jī)輸出低電平,延時(shí)2us,然后釋放總線(xiàn),延時(shí)60us。寫(xiě)0時(shí)序:主機(jī)輸出低電平,延時(shí)60us,然后釋放總線(xiàn),延時(shí)2us。 3)讀時(shí)序單總線(xiàn)設(shè)備只有在主機(jī)發(fā)出讀時(shí)序時(shí)才向主機(jī)發(fā)送數(shù)據(jù),因此主機(jī)發(fā)出數(shù)據(jù)讀命令后,從機(jī)立即產(chǎn)生讀時(shí)序,以便發(fā)送數(shù)據(jù)。所有讀取序列至少需要60s,并且兩個(gè)獨(dú)立讀取序列之間需要至少1s的恢復(fù)時(shí)間。每個(gè)讀取序列均由主機(jī)發(fā)起,主機(jī)將總線(xiàn)拉低至少1us。主設(shè)備必須在讀取序列期間釋放總線(xiàn),并在序列開(kāi)始后15us 內(nèi)采樣總線(xiàn)狀態(tài)。一般讀取時(shí)序流程如下:主機(jī)延時(shí)2us輸出低電平,延時(shí)12us切換到輸入模式,然后讀取單總線(xiàn)當(dāng)前電平,延時(shí)50us。了解完單總線(xiàn)時(shí)序后,我們來(lái)看一下DS18B20 的典型溫度讀取流程: DS18B20 的典型溫度讀取流程為: 復(fù)位發(fā)出SKIP ROM 命令(0XCC) 啟動(dòng)轉(zhuǎn)換命令(0X44) 延遲復(fù)位SKIP 發(fā)送ROM 命令(0XCC) 發(fā)送存儲(chǔ)器讀命令(0XBE) 連續(xù)讀取2 個(gè)字節(jié)的數(shù)據(jù)(溫度等)。結(jié)尾。我們?cè)谶@里對(duì)DS18B20 進(jìn)行介紹,但更詳細(xì)的介紹請(qǐng)參閱DS18B20 技術(shù)手冊(cè)。 1.2 DS18B20電路圖

從原理圖中我們可以看出,DS18B20 使用的是單片機(jī)PG11。 1.3 初始化DS18B20 1. 在初始化之前,我們需要先初始化IO 端口。

/**************************************************** * **** ************************************* 函數(shù)名稱(chēng): ds18b20_init* 函數(shù)功能: IO端口時(shí)鐘初始化功能* 輸入: 無(wú)* 輸出: 無(wú)******************************************** **** * **** ******************************/void ds18b20_init(){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOG,ENABLE) ) ;GPIO_InitStructure.GPIO_Pin=dq;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIO_ds18b20,GPIO_InitStructure);}引腳定義在頭文件中。

#define dq (GPIO_Pin_11) //PG11#define GPIO_ds18b20 GPIOG#define ds18b20_dq_H GPIO_SetBits(GPIO_ds18b20,dq)#define ds18b20_dq_L GPIO_ResetBits(GPIO_ds18b20,dq) 2. DS18B20 初始化主機(jī)發(fā)送第一次。 480 到960 微秒的低電平脈沖,然后將總線(xiàn)釋放到高電平,并在接下來(lái)的480 微秒內(nèi)檢測(cè)總線(xiàn)。如果看到低電平,則表示總線(xiàn)上的設(shè)備已響應(yīng)。當(dāng)沒(méi)有低電平時(shí),始終存在高電平,表示總線(xiàn)上沒(méi)有任何設(shè)備響應(yīng)。 DS18B20作為從設(shè)備,一上電就檢測(cè)總線(xiàn)上是否有低電平480到960微秒,如果有,則等待15到60微秒后總線(xiàn)變?yōu)楦唠娖。關(guān)閉總線(xiàn)電源并通過(guò)持續(xù)60 至240 微秒的低脈沖進(jìn)行響應(yīng),向主機(jī)發(fā)出設(shè)備已準(zhǔn)備就緒的信號(hào)。如果沒(méi)有檢測(cè)到,則繼續(xù)檢查并等待。 3.初始化時(shí)序圖

4、例程代碼:

/**************************************************** * **** ************************************* 函數(shù)名稱(chēng): ds18b20init* 函數(shù)功能: DS18B20初始化時(shí)序* 輸入: 無(wú)* 輸出: 無(wú)******************************************** ************** * ****** ****************************** **/void ds18b20init(){DQOUTINT();//輸出ds18b20_dq_L;lay_us(480);//延遲480 微秒ds18b20_dq_H;lay_us(480);//延遲480 微秒}1.4 DS18B20 讀操作下發(fā)的各種操作命令主機(jī)包括向DS18B20 寫(xiě)入0 和1。由寫(xiě)入組成的命令字節(jié)。接收數(shù)據(jù)時(shí),進(jìn)程讀取同樣從DS18B20 發(fā)送的0 或1。因此,首先要了解主機(jī)是如何寫(xiě)0、寫(xiě)1、讀0、讀1的。寫(xiě)入周期最短為60 微秒,最長(zhǎng)為120 微秒。當(dāng)寫(xiě)周期開(kāi)始時(shí),主器件將總線(xiàn)拉低1 微秒,以指示寫(xiě)周期開(kāi)始。然后,如果主機(jī)想要寫(xiě)入0,則將總線(xiàn)設(shè)置為低電平,如果主機(jī)想要寫(xiě)入1,則將總線(xiàn)設(shè)置為高電平至少60微秒,直到寫(xiě)入周期完成,然后釋放它。為了恢復(fù)總線(xiàn),允許總線(xiàn)變高至少1 微秒。 DS18B20 檢測(cè)到總線(xiàn)被拉低后,會(huì)等待15 微秒,并開(kāi)始對(duì)總線(xiàn)進(jìn)行15 s 至45 s 采樣。采樣期間總線(xiàn)處于高電平。這是1。如果采樣期間總線(xiàn)為低電平,1. 讀操作時(shí)序圖

2. 加載運(yùn)行程序

/**************************************************** * **** ************************************* 函數(shù)名稱(chēng): DS18b20rd* 函數(shù)功能: DS18B20讀取數(shù)據(jù)時(shí)序* 輸入: 無(wú)* 輸出: 值**************************************** ********** ** *** ********************************** **********/u8 DS18b20rd(){u8 i=0,value=0; for( i=0 ;i8;i++){value=1;DQOUTINT();//輸出ds18b20_dq_L;//下拉Late_us(4);//延遲4 微米ds18b20_dq_H;lay_us(10);//延遲10 微米DQININT() ;//輸入設(shè)置if(GPIO_ReadInputDataBit(GPIO_ds18b20,dq)==1){ value|=0x80; //從低位讀取數(shù)據(jù)}delay_us(45);//delay 45的微妙之處}返回值; }1.5 DS18B20寫(xiě)數(shù)據(jù)讀操作的時(shí)序也分為兩個(gè)過(guò)程:讀0時(shí)序和讀1時(shí)序。讀周期開(kāi)始于主機(jī)將單總線(xiàn)拉低1微秒,然后將單總線(xiàn)釋放到高電平,允許DS18B20在單總線(xiàn)上發(fā)送數(shù)據(jù)。作為從機(jī),DS18B20在檢測(cè)到總線(xiàn)為低電平1微秒后開(kāi)始發(fā)送數(shù)據(jù),如果要發(fā)送0,則將總線(xiàn)拉低,直到讀周期結(jié)束。如果要發(fā)送1,則將總線(xiàn)釋放到高電平。主機(jī)首先將總線(xiàn)拉低1微秒,釋放總線(xiàn),并在15微秒內(nèi)完成總線(xiàn)采樣和檢測(cè),包括之前1微秒的總線(xiàn)電平下拉。為低電平,確認(rèn)為0。如果采樣期間總線(xiàn)為高電平,則檢查為1。讀取計(jì)時(shí)過(guò)程至少需要60 微秒才能完成。 1、寫(xiě)操作時(shí)序圖

2.編寫(xiě)運(yùn)行程序

/**************************************************** * **** ************************************* 函數(shù)名稱(chēng): ds18b20wr* 函數(shù)功能: DS18B20寫(xiě)入數(shù)據(jù)時(shí)序* 輸入: dat* 輸出: 無(wú)******************************************** ********** * **** ********************************** *****/void ds18b20wr(u8 dat){u8 i=0;DQOUTINT(); //輸出for(i=0;i8;i++){ds18b20_dq_L;//下拉延遲15 if((dat0x01)==1){ds18b20_dq_H;}else{ds18b20_dq_L;}delay_us( 60) ;//延遲60 Subtle ds18b20_dq_H;dat=1;//準(zhǔn)備發(fā)送下一位數(shù)據(jù)}} 1.6 DS18B20寄存器介紹1. 內(nèi)部結(jié)構(gòu)DS18B20主要由四部分組成。 1)64位光刻ROM 刻刻ROM中的64位序列號(hào)是在出廠(chǎng)前照相刻刻的,可以認(rèn)為是DS18B20的地址序列號(hào)。 64位光刻ROM的配置是前8位(地址:28H)是產(chǎn)品型號(hào),接下來(lái)的48位是DS18B20的序列號(hào),每個(gè)DS18B20都有不同的序列號(hào)。因此,這可以認(rèn)為是DS18B20的地址序列碼,最后8位是前面的56位循環(huán)冗余校驗(yàn)碼(CRC=X8+X5+X4+1)。由于每個(gè)DS18B20都有不同的ROM數(shù)據(jù),因此單片機(jī)可以通過(guò)一條總線(xiàn)對(duì)多個(gè)DS18B20進(jìn)行尋址,從而達(dá)到一條總線(xiàn)上有多個(gè)DS18B20的目的。

2) 溫度傳感器3) 非易失性溫度報(bào)警觸發(fā)器TH 和TL4) 配置寄存器。 2. DS18B20 的存儲(chǔ)器由高速暫存RAM 和非易失性電可擦除(E2) RAM 組成。

我們來(lái)看一下配置寄存器的第四個(gè)字節(jié)(CONFIG)。

R0 和R1 的默認(rèn)設(shè)置為11。這是12 位分辨率,因此1 位代表0.0625 攝氏度。 1.7DS18B20命令介紹

1.8 溫度讀取操作1. 溫度讀取操作DS18B20 轉(zhuǎn)換后的溫度值以2 字節(jié)補(bǔ)碼格式存儲(chǔ)在高速緩存的字節(jié)0 和1 中。所以如果你只是想讀取溫度值,你可以只讀取臨時(shí)寄存器的第0和第1字節(jié)。讀取一次D18B20的溫度: a) 初始化DS18B20。 b) 跳過(guò)ROM操作(可以在ROM中讀取DS18B20的地址、型號(hào)、配置分辨率;由于只使用了一顆DS18B20,所以不需要讀取地址型號(hào),默認(rèn)的12位分辨率即可直接使用。) c) 發(fā)送溫度轉(zhuǎn)換命令。 d) 跳過(guò)ROM 操作。 e) 發(fā)送溫度讀取命令。 f) 讀取溫度值。 2 補(bǔ)碼簡(jiǎn)介什么是補(bǔ)碼? 1) 正數(shù)的補(bǔ)碼就是正數(shù)本身。 2) 負(fù)數(shù)的補(bǔ)碼是將原數(shù)的符號(hào)反轉(zhuǎn)并加1。 DS18B20 中存儲(chǔ)的溫度值是以補(bǔ)碼格式存儲(chǔ)的,因此讀出的溫度值將是實(shí)際溫度值的補(bǔ)碼,必須轉(zhuǎn)換為原始代碼。 1)如果溫度為正,則原碼就是補(bǔ)碼本身,所以在12位分辨率下,溫度公式為:溫度值=讀數(shù)值*0.06252)如果溫度為負(fù),則原碼減去補(bǔ)碼。因此,在12 位分辨率下,公式為: 溫度值=-(讀數(shù)減1 并取反)* 0.06253。 讀取溫度編程功能

/**************************************************** * **** ******************************** 函數(shù)名稱(chēng): readtemp* 函數(shù)功能: DS18B2 溫度寄存器設(shè)置,溫度讀取* 輸入: 無(wú)* 輸出: 值******************************************** * ****** ************************************/double readtemp() //讀取溫度需要復(fù)位{u16 temp;u8 a,b;double value;ds18b20init(); //初始化ds18b20wr(0xcc); //忽略發(fā)送ROM 命令ds18b20wr(0x44); //發(fā)送溫度轉(zhuǎn)換命令Send Late_ms (800); ds18b20init(); //ds18b20wr(0xcc); //發(fā)送ROM忽略命令ds18b20wr(0xbe); //發(fā)送臨時(shí)寄存器讀命令a=DS18b20rd(); //寄存器溫度的低8位b=DS18b20rd();//溫度位的高8位temp=b;temp=(temp8)+a;if((temp0xf800)==0xf800){temp=(~temp)+1;value=temp* (-0.0625);}else{ value=temp*0.0625; }返回值;}1.9 例程主函數(shù)

/**************************************************** * **** ***************************************** 函數(shù)名稱(chēng): main* 說(shuō)明: 主程序。 * 輸入: 無(wú)* 輸出: 無(wú)* 返回值: 無(wú)***************************************** ****************************************************** *****************/int main(){double temp;printf_init();//printf初始化ds18b20_init();//DS18B20初始化while(1){temp=readtemp (); //讀取溫度printf('當(dāng)前溫度為: %0.4lf \r \n',temp);}}主程序的作用是讀取溫度。其值通過(guò)printf 輸出打印到串口助手,如下所示:

下載程序后,打開(kāi)串口,查看DTR,然后取消?梢酝ㄟ^(guò)發(fā)送字符來(lái)顯示。


市場(chǎng)分析