STM32制作DS18B20溫度傳感器_第1頁
STM32制作DS18B20溫度傳感器_第2頁
STM32制作DS18B20溫度傳感器_第3頁
STM32制作DS18B20溫度傳感器_第4頁
STM32制作DS18B20溫度傳感器_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、折騰了一晚上,才把DS18B20 的驅動移植到 STM32 上來。以前在 51上使用過單個和多個連接的DS18B20 ,有現(xiàn)成的程序了,以為很快就能弄好,結果還是被卡住了,下面說下幾個關鍵點吧:首先是延時的問題, STM32 上若用軟件延時的話不太好算時間,所以要么用定時器要么用SysTick 這個定時器來完成延時的計算。相比之下用 SysTick 來的簡單方便點。接著是 STM32 IO 腳的配置問題,因為51是雙向的 IO ,所以作為輸入輸出都比較方便。STM32 的 IO 是準雙向的 IO,網上查了下資料,說將 STM32 的 IO 配置成開漏輸出,然后外接上拉即可實現(xiàn)雙向IO。于是我也

2、按規(guī)定做了,但調了老半天都不成功,是因為DS18B20 沒有響應的信號。在煩躁之際只有試下將接DQ 的 IO 分別拉低和拉高看能不能讀入正確的信號。結果果然是讀入數(shù)據(jù)不對,原來我將IO 配成開漏輸出后相當然的以為讀數(shù)據(jù)是用GPIO_ReadOutputDataBit(),這正是問題所在,后來將讀入的函數(shù)改為GPIO_ReadInputDataBit()就 OK了?,F(xiàn)在溫度是現(xiàn)實出來了,但跟我家里那臺德勝收音機上顯示的溫度相差 2度,都不知道是哪個準了,改天再找個溫度計驗證下。下面引用一段DS18B20 的時序描述,寫的很詳細:DS18B20 的控制流程根據(jù) DS18B20 的通信協(xié)議, DS1

3、8B20 只能作為從機,而單片機系統(tǒng)作為主機,單片機控制 DS18B20 完成一次溫度轉換必須經過 3個步驟:復位、發(fā)送 ROM 指令、發(fā)送 RAM 指令。每次對 DS18B20 的操作都要進行以上三個步驟。.復位過程為:單片機將數(shù)據(jù)線拉低至少 480uS ,然后釋放數(shù)據(jù)線,等待 15-60uS 讓 DS18B20 接收信號, DS18B20 接收到信號后,會把數(shù)據(jù)線拉低 60-240uS ,主機檢測到數(shù)據(jù)線被拉低后標識復位成功;發(fā)送 ROM 指令: ROM 指令表示主機對系統(tǒng)上所接的全部 DS18B20 進行尋址,以確定對那一個 DS18B20 進行操作,或者是讀取某個 DS18B20 的

4、ROM 序列號。發(fā)送 RAM 指令:RAM 指令用于單片機對DS18B20 內部 RAM 進行操作,如讀取寄存器的值,或者設置寄存器的值。具體的 RAM 和 RAM 指令請查閱 DS18B20 的數(shù)據(jù)手冊。下面簡單介紹:1、ROM 操作命令 : DS18B20采用一線通信接口。因為一線通信接口,必須在先完成 ROM設定,否則記憶和控制功能將無法使用。一旦總線檢測到從屬器件的存在,它便可以發(fā)出器件ROM操作指令, 所有ROM操作指令均為 8位長度,主要提供以下功能命令:1 )讀 ROM(指令碼 0X33H):當總線上只有一個節(jié)點(器件)時,讀此節(jié)點的 64位序列號。如果總線上存在多于一個的節(jié)點,

5、 則此指令不能使用。2 )ROM匹配(指令碼 0X55H):此命令后跟 64位的 ROM序列號,總線上只有與此序列號相同的 DS18B20才會做出反應;該指令用于選中某個DS18B20,然后對該 DS18B20進行讀寫操作。.3 )搜索 ROM(指令碼 0XF0H): 用于確定接在總線上DS18B20的個數(shù)和識別所有的 64位 ROM序列號。當系統(tǒng)開始工作,總線主機可能不知道總線上的器件個數(shù)或者不知道其64位 ROM序列號,搜索命令用于識別所有連接于總線上的 64位 ROM序列號。4 )跳過 ROM(指令碼 0XCCH): 此指令只適合于總線上只有一個節(jié)點;該命令通過允許總線主機不提供64位

6、ROM序列號而直接訪問RAM,以節(jié)省操作時間。5 )報警檢查(指令碼 0XECH):此指令與搜索ROM指令基本相同,差別在于只有溫度超過設定的上限或者下限值的DS18B20才會作出響應。只要 DS18B20一上電,告警條件就保持在設置狀態(tài),直到另一次溫度測量顯示出非告警值, 或者改變 TH或 TL 的設置使得測量值再一次位于允許的范圍之內。儲存在EEPROM內的觸發(fā)器用于告警。2、RAM指令DS18B20有六條 RAM命令:1) 溫度轉換(指令碼 0X44H): 啟動 DS18B20進行溫度轉換,結果存入內部 RAM。2) 讀暫存器(指令碼 0XBEH):讀暫存器 9個字節(jié)內容, 此指令從 R

7、AM的第 1個字節(jié)(字節(jié) 0)開始讀取,直到九個字節(jié)(字節(jié)8,CRC值)被讀出為止。如果不需要讀出所有字節(jié)的內容,那么主機可以在任何時候發(fā)出復位信號以中止讀操作。3) 寫暫存器(指令碼 0X4EH): 將上下限溫度報警值和配置數(shù)據(jù)寫入到 RAM的2、3、4字節(jié),此命令后跟需要些入到這三個字節(jié)的數(shù)據(jù)。.4) 復制暫存器(指令碼 0X48H):把暫存器的 2、3、4字節(jié)復制到 EEPROM中,用以掉電保存。5) 重新調 E2RAM(指令碼 0XB8H):把 EEROM中的溫度上下限及配置字節(jié)恢復到 RAM的2、3、4字節(jié),用以上電后恢復以前保存的報警值及配置字節(jié)。6) 讀電源供電方式(指令碼 0X

8、B4H):啟動 DS18B20發(fā)送電源供電方式的信號給主 CPU。對于在此命令送至 DS18B20后所發(fā)出的第一次讀出數(shù)據(jù)的時間片,器件都會給出其電源方式的信號?!?0”表示寄生電源供電?!?1”表示外部電源供電。下面是結合實際測試總結出來的DS18B20 的操作流程:1、DS18B20的初始化( 1) 先將數(shù)據(jù)線置高電平“ 1”。( 2) 延時(該時間要求的不是很嚴格,但是盡可能的短一點) 。( 3) 數(shù)據(jù)線拉到低電平“ 0”。( 4) 延時 490微秒(該時間的時間范圍可以從 480到960微秒)。( 5) 數(shù)據(jù)線拉到高電平“ 1”。( 6) 延時等待(如果初始化成功則在 15到60毫秒時

9、間之內產生一個由 DS18B20所返回的低電平“ 0”。據(jù)該狀態(tài)可以來確定它的存在, 但是應注意不能無限的進行等待,不然會使程序進入死循環(huán), 所以要進行超時控制)。.( 7) 若 CPU讀到了數(shù)據(jù)線上的低電平“ 0”后,還要做延時,其延時的時間從發(fā)出的高電平算起(第( 5)步的時間算起)最少要 480微秒。( 8) 將數(shù)據(jù)線再次拉高到高電平“ 1”后結束。2、DS18B20的寫操作( 1) 數(shù)據(jù)線先置低電平“ 0”。( 2) 延時確定的時間為 2( 小于 15) 微秒。( 3) 按從低位到高位的順序發(fā)送字節(jié)(一次只發(fā)送一位) 。( 4) 延時時間為 62(大于 60)微秒。( 5) 將數(shù)據(jù)線拉

10、到高電平,延時 2( 小于 15) 微秒。( 6) 重復上(1)到(6)的操作直到所有的字節(jié)全部發(fā)送完為止。( 7) 最后將數(shù)據(jù)線拉高。3、 DS18B20的讀操作( 1)將數(shù)據(jù)線拉高“ 1”。( 2)延時 2微秒。( 3)將數(shù)據(jù)線拉低“ 0”。( 4)延時 2(小于 15)微秒。( 5)將數(shù)據(jù)線拉高“ 1”,同時端口應為輸入狀態(tài)。( 6)延時 4(小于 15)微秒。( 7)讀數(shù)據(jù)線的狀態(tài)得到 1個狀態(tài)位,并進行數(shù)據(jù)處理。( 8)延時 62(大于 60)微秒。順便把程序也貼上來吧,給大家參考下。.使用的方法:只要調用一次ds18b20_start()來初始化 DS18B20,然后每次讀溫度時直

11、接調用 ds18b20_read()就可以了。如ds18b20_start();while(1)for(i=1000000;i0;i-);val = ds18b20_read();cppview plaincopy/=/ DS18B20.C By ligh /= #include STM32Lib/stm32f10x.h#include DS18B20.h #define EnableINT() #define DisableINT() #define DS_PORT GPIOA #define DS_DQIO GPIO_Pin_1#define DS_RCC_PORT RCC_APB2Per

12、iph_GPIOA#define DS_PRECISION 0x7f / 精度配置寄存器 1f=9 位 ; 3f=10 位; 5f=11 位 ; 7f=12 位; #define DS_AlarmTH 0x64#define DS_AlarmTL 0x8a #define DS_CONVERT_TICK 1000#define ResetDQ() GPIO_ResetBits(DS_PORT,DS_DQIO) #define SetDQ() GPIO_SetBits(DS_PORT,DS_DQIO).#define GetDQ() GPIO_ReadInputDataBit(DS_PORT,D

13、S_DQIO)staticunsignedcharTempX_TAB16=0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09;voidDelay_us(u32 Nus)SysTick-LOAD=Nus*9;/時間加載SysTick-CTRL|=0x01;/開始倒數(shù)while (!(SysTick-CTRL&(1CTRL=0X00000000;/關閉計數(shù)器SysTick-VAL=0X00000000;/清空計數(shù)器unsignedcharResetDS18B20(void )unsigned

14、charresport;SetDQ();Delay_us(50);ResetDQ();Delay_us(500);/500us(該時間的時間范圍可以從480 到960 微秒)SetDQ();Delay_us(40);/40us/resport = GetDQ();while (GetDQ();Delay_us(500);/500usSetDQ();returnresport;voidDS18B20WriteByte(unsignedchar Dat)unsignedchari;.for (i=8;i0;i-)ResetDQ();/在 15u 內送數(shù)到數(shù)據(jù)線上,DS18B20在 15-60u讀數(shù)

15、Delay_us(5);/5usif (Dat & 0x01)SetDQ();elseResetDQ();Delay_us(65);/65usSetDQ();Delay_us(2);/連續(xù)兩位間應大于1usDat = 1;unsignedcharDS18B20ReadByte(void )unsignedchari,Dat;SetDQ();Delay_us(5);for (i=8;i0;i-)Dat = 1;ResetDQ();/從讀時序開始到采樣信號線必須在15u 內,且采樣盡量安排在15u 的最后Delay_us(5);/5usSetDQ();Delay_us(5);/5usif (Get

16、DQ()Dat|=0x80;else.Dat&=0x7f;Delay_us(65);/65usSetDQ();returnDat;voidReadRom(unsignedchar*Read_Addr)unsignedchari;DS18B20WriteByte(ReadROM);for (i=8;i0;i-)*Read_Addr=DS18B20ReadByte();Read_Addr+;voidDS18B20Init(unsignedchar Precision,unsignedchar AlarmTH,unsignedcharAlarmTL)DisableINT();ResetDS18B20

17、();DS18B20WriteByte(SkipROM);DS18B20WriteByte(WriteScratchpad);DS18B20WriteByte(AlarmTL);DS18B20WriteByte(AlarmTH);DS18B20WriteByte(Precision);ResetDS18B20();DS18B20WriteByte(SkipROM);DS18B20WriteByte(CopyScratchpad);EnableINT();.while (!GetDQ(); /等待復制完成/voidDS18B20StartConvert(void )DisableINT();Re

18、setDS18B20();DS18B20WriteByte(SkipROM);DS18B20WriteByte(StartConvert);EnableINT();voidDS18B20_Configuration(void )GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS_RCC_PORT, ENABLE);GPIO_InitStructure.GPIO_Pin = DS_DQIO;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /開漏輸出GPIO_InitStruc

19、ture.GPIO_Speed = GPIO_Speed_50MHz; /2M時鐘速度GPIO_Init(DS_PORT, &GPIO_InitStructure);voidds18b20_start(void )DS18B20_Configuration();DS18B20Init(DS_PRECISION, DS_AlarmTH, DS_AlarmTL);DS18B20StartConvert();unsignedshortds18b20_read(void )unsignedcharTemperatureL,TemperatureH;unsignedintTemperature;Disa

20、bleINT();.ResetDS18B20();DS18B20WriteByte(SkipROM);DS18B20WriteByte(ReadScratchpad);TemperatureL=DS18B20ReadByte();TemperatureH=DS18B20ReadByte();ResetDS18B20();EnableINT();if (TemperatureH & 0x80)TemperatureH=(TemperatureH) | 0x08;TemperatureL=TemperatureL+1;if (TemperatureL=0)TemperatureH+=1;TemperatureH=(TemperatureH4);TemperatureL=TempX_TABTemperatureL&0x0f;/bit0-bit7為小數(shù)位, bit8-bit14為整數(shù)位, bit15為正負位Temp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論