




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、折騰了一晚上,才把DS18B2的驅動移植到STM3上來。以前在51上使用過單個和多個連接 的DS18B20有現(xiàn)成的程序了,以為很快就能弄好,結果還是被卡住了,下面說下幾個關 鍵點吧:首先是延時的問題,STM3上若用軟件延時的話不太好算時間, 所以要么用定時器要么用SysTick這個定時器來完成延時的計算。相比之下用SysTick來的簡單方便點。接著是STM32 10腳的配置問題,因為51是雙向的10,所以作為輸入輸出都比較方便。STM32勺I0是準雙向的10,網上查了下資料,說將STM3的 I0配置成開漏輸出,然后外接上拉即可實現(xiàn)雙向10。于是我也按規(guī)定做了,但調了老半天都不成功,是因為DS1
2、8B2沒有響應的信號。在煩躁之際只有試下將接DQ的I0分別拉低和拉高看能不能讀入正確的信號。結果果然是讀入數(shù)據(jù)不對,原來我將I0配成開漏輸出后相當然的以為讀數(shù)據(jù)是用GPl0_Read0utputDataBit(),這正是問題所在,后來將讀入的函數(shù)改為GPI0_ReadInputDataBit()就OK了?,F(xiàn)在溫度是現(xiàn)實出來了,但跟我家里那臺德勝收音機上顯示的溫度相差2度,都不知道是哪個準了,改天再找個溫度計驗證下。F面引用一段DS18B2的時序描述,寫的很詳細:DS18B2的控制流程根據(jù)DS18B2的通信協(xié)議,DS18B2只能作為從機,而單片機系統(tǒng)作為主機,單片機控 制DS18B2完成一次溫度
3、轉換必須經過3個步驟:復位、發(fā)送ROM旨令、發(fā)送RAM旨令。每 次對DS18B2的操作都要進行以上三個步驟。復位過程為:單片機將數(shù)據(jù)線拉低至少 480uS,然后釋放數(shù)據(jù)線,等待15-60US讓DS18B2接收信號,DS18B2接收到信號后,會把數(shù)據(jù)線拉低60-240uS,主機檢測到數(shù)據(jù)線被拉低后標識復位成功;發(fā)送ROM旨令:ROM旨令表示主機對系統(tǒng)上所接的全部 DS18B2進行尋址,以確定對那一個DS18B2進行操作,或者是讀取某個 DS18B2的ROM序列號。發(fā)送RAM旨令:RAM旨令用于單片機對DS18B2內部RAM4行操作,如讀取寄存器的 值,或者設置寄存器的值。具體的RA剛RAM旨令請
4、查閱DS18B2的數(shù)據(jù)手冊。下面簡單介紹:1、ROMS作命令:DS18B2采用一線通信接口。因為一線通信接口,必須在先完成ROM設定,否則記憶和控制功能將無法使用。一旦總線檢測到從屬器件的存在,它便可以發(fā)出器件ROMS作指令,所有ROMS作指令均為8位長度,主要提供以下功能命令:1 )讀RO(指令碼0X33H:當總線上只有一個節(jié)點(器件)時,讀此節(jié)點的 64位序列號。如果總線上存在多于一個的節(jié)點,則此指令不能使用。2 ) ROhE配(指令碼0X55H:此命令后跟64位的ROM序列號,總線上只有與此序列號相同的DS18B2才會做出反應;該指令用于選中某個 DS18B20然后對該DS18B2進行讀
5、寫操作。3 )搜索ROM指令碼0XF0H :用于確定接在總線上 DS18B2的個數(shù)和識別所有的64位 ROM序列號。當系統(tǒng)開始工作,總線主機可能不知道總線上的器件個數(shù)或者不知道其64位 ROM序列號,搜索命令用于識別所有連接于總線上的 64位 ROMP列號。4 )跳過RO(指令碼0XCC):此指令只適合于總線上只有一個節(jié)點;該命令通過允許總 線主機不提供64位ROM序列號而直接訪問RAM以節(jié)省操作時間。5 )報警檢查(指令碼0XECH:此指令與搜索ROM旨令基本相同,差別在于只有溫度超過 設定的上限或者下限值的 DS18B2才會作出響應。只要DS18B2一上電,告警條件就保持在設置狀態(tài),直到另
6、一次溫度測量顯示出非告警值,或者改變TH或TL的設置使得測量值再一次位于允許的范圍之內。儲存在 EEP ROI內的觸發(fā)器用于告警。2、RAM旨令DS18B2有六條 RAM命令:1)溫度轉換(指令碼0X44H :啟動DS18B2進行溫度轉換,結果存入內部 RAM2)讀暫存器(指令碼0XBEH:讀暫存器9個字節(jié)內容,此指令從RAM的第1個字節(jié)(字節(jié)0)開始讀取,直到九個字節(jié)(字節(jié)8, CRCfi)被讀出為止。如果不需要讀出所有字節(jié)的內容,那么主機可以在任何時候發(fā)出復位信號以中止讀操作。3)寫暫存器(指令碼0X4EH :將上下限溫度報警值和配置數(shù)據(jù)寫入到 RAM勺2、3、4字節(jié),此命令后跟需要些入到
7、這三個字節(jié)的數(shù)據(jù)。4)復制暫存器(指令碼0X48H :把暫存器的2、3、4字節(jié)復制到EEPRO中,用以掉電 保存。5)重新調E2RAIM指令碼0XB8H :把EEROI中的溫度上下限及配置字節(jié)恢復到 RAM勺2、 3、4字節(jié),用以上電后恢復以前保存的報警值及配置字節(jié)。6)讀電源供電方式(指令碼0XB4H :啟動DS18B2發(fā)送電源供電方式的信號給主 CPU對于在此命令送至DS18B2后所發(fā)出的第一次讀出數(shù)據(jù)的時間片,器件都會給出其電源方 式的信號。“ 0”表示寄生電源供電?!?1”表示外部電源供電。F面是結合實際測試總結出來的 DS18B2的操作流程:1、DS18B20勺初始化(1)先將數(shù)據(jù)線
8、置高電平“ 1”。(2)(3)數(shù)據(jù)線拉到低電平“ 0”。延時(該時間要求的不是很嚴格,但是盡可能的短一點)。(4)(5)數(shù)據(jù)線拉到高電平“ 1”。延時490微秒(該時間的時間范圍可以從480到960微秒)。(6)回的低電平(7)若CPUi賣到了數(shù)據(jù)線上的低電平“0”后,還要做延時,其延時的時間從發(fā)出的高電平算起(第(5)步的時間算起)最少要480微秒。(8)將數(shù)據(jù)線再次拉高到高電平“ 1”后結束。延時等待(如果初始化成功則在15到60毫秒時間之內產生一個由 DS18B2所返 “ 0”。據(jù)該狀態(tài)可以來確定它的存在,但是應注意不能無限的進行等待,不然會使程序進入死循環(huán),所以要進行超時控制)2、DS
9、18B20勺寫操作數(shù)據(jù)線先置低電平“ 0”。延時確定的時間為2(小于15)微秒。按從低位到高位的順序發(fā)送字節(jié)(一次只發(fā)送一位)延時時間為62 (大于60)微秒。(5)將數(shù)據(jù)線拉到高電平,延時2(小于15)微秒。(6)(7)最后將數(shù)據(jù)線拉高。重復上(1)到(6)的操作直到所有的字節(jié)全部發(fā)送完為止。3、DS18B20勺讀操作(1)將數(shù)據(jù)線拉高“ 1”。(2)延時2微秒。(3)將數(shù)據(jù)線拉低“ 0”。(4)延時2 (小于15)微秒。(5)將數(shù)據(jù)線拉高“1”,同時端口應為輸入狀態(tài)。(6)延時4 (小于15)微秒。讀數(shù)據(jù)線的狀態(tài)得到1個狀態(tài)位,并進行數(shù)據(jù)處理。延時62 (大于60)微秒。順便把程序也貼上來
10、吧,給大家參考下。使用的方法:只要調用一次ds18b20_start()來初始化DS18B20然后每次讀溫度時直接調用ds18b20_read()就可以了。如 ds18b20_start(); while(1)for(i=1000000;i>0;i-);val = ds18b20_read();cppview plaincopy/DS18B20.C By ligh/#in clude "STM32Lib/stm32f10x.h"#in clude "DS18B20.h"#defi ne En ablelNT()#defi ne DisableINT
11、()#defi ne DS_P ORT GPIOA#defi ne DS_DQIO GPIO_Pin_11011#defi ne DS_RCC _P ORT RCC_A PB2 Periph_GP lOA#define DS_PRECISION 0x7f /精度配置寄存器 1f=9 位;3f=10 位;5f=11 位;7f=12 位;12 #define DS_AlarmTH 0x6413 #define DS_AlarmTL 0x8a14 #define DS_CONVERT_TICK 100015#defi ne ResetDQ() GPIO _ResetBits(DS _P ORT,DS
12、_DQIO)16#defi ne SetDQ() GPI O_SetBits(DS _P ORT,DS_DQIO)17#defi ne GetDQ() GPIO _Readl npu tDataBit(DS _P ORT,DS_DQIO)18static un sig ned charTempX_TAB16=0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07, 0x08,0x08,0x09,0x09;2627unsigned char ResetDS18B20(void )2819void Delay_us(u32 Nus)2
13、021SysTick->LOAD=Nus*9;/時間加載22SysTick->CTRL|=0x01;/開始倒數(shù)23while (!(SysTick->CTRL&(1<<16); /等待時間到達24SysTick->CTRL=0X00000000;/關閉計數(shù)器25SysTick->VAL=0X00000000;/清空計數(shù)器29un sig ned char res port;30SetDQO;31Delay_us(50);32ResetDQ();33Delay_us(500); /500us(該時間的時間范圍可以從480到960微秒)34SetD
14、Q();35Delay_us(40); /40us36/res port = GetDQ();37while (GetDQ();38Delay_us(500); /500us39SetDQ();40return resport;4144un sig ned char i;42void DS18B20WriteByte(unsigned char Dat)4345for (i=8;i>0;i-)4647ResetDQ(); /在15u內送數(shù)到數(shù)據(jù)線上,DS18B2在15-60u讀數(shù)48Delay_us(5); /5us49if (Dat & 0x01)50SetDQ();51els
15、e52ResetDQO;53Delay_us(65);/65us54SetDQ();55Delay_us(2);/連續(xù)兩位間應大于1us56Dat >>= 1;575859unsigned charDS18B20ReadByte(void )6061un sig ned char i,Dat;62SetDQO;63Delay_us(5);64for (i=8;i>0;i-)6566Dat >>= 1;67ResetDQO;/從讀時序開始到采樣信號線必須在15u內,且采樣盡量安排在15u的最后68Delay_us(5);/5us69SetDQ();70Delay_u
16、s(5);/5us71if (GetDQ()72Dat|=0x80;74Dat&=0x7f;75Delay_us(65); /65us73else76SetDQO;7778return Dat;79void DS18B20Init(unsignedchar Precision,unsignedchar AlarmTH,unsigned80void ReadRom(unsigned char *Read_Addr)8182un sig ned char i;83DS18B20WriteByte(ReadROM);84for (i=8;i>0;i-)8586*Read_Addr=DS
17、18B20ReadByte();87Read_Add 葉+;888990char AlarmTL)9192DisablelNTO;93ResetDS18B20();94DS18B20WriteByte(Ski pROM);95DS18B20WriteByte(WriteScratch pad);96DS18B20WriteByte(AlarmTL);97DS18B20WriteByte(AlarmTH);98DS18B20WriteByte( Precisio n);99ResetDS18B20();104106100 DS18B20WriteByte(Ski pROM);101 DS18B2
18、0WriteByte(Co pyScratch pad);102 En ableINT();103 while (!GetDQ(); /等待復制完成 /105void DS18B20StartConvert( void )107 DisablelNTO;108 ResetDS18B20();109 DS18B20WriteByte(Ski pROM);110 DS18B20WriteByte(StartCo nvert);111 En ableINT();112113void DS18B20_Configuration( void )114115 GPIO_ln itT yp eDef GP
19、IO_I ni tStructure;116 RCC_A PB2Perip hClockCmd(DS_RCC _P ORT, ENABLE);117 GP IO_I ni tStructure.G PIO_Pin = DS_DQIO;118 GPIO_ln itStructure.G PIO_Mode = GP IO_Mode_Out_OD; / 開漏輸出119 GPIO_ln itStructure.G PIO_S peed = GP IO_S peed_50MH z; /2M時鐘速度120 GPIO_lni t(DS _P ORT, &GP IO_I ni tStructure);
20、122void ds18b20_start( void)121123124 DS18B20_Co nfigurati on();125 DS18B20I ni t(DS _P RECISION, DS_AlarmTH, DS_AlarmTL);126 DS18B20StartCo nvert();127128u nsig nedshort ds18b20_read( void)129130 un sig nedchar Temp eratureL,Te mp eratureH;131 un sig nedint Temp erature;132 DisableINT();133 ResetDS
21、18B20();134 DS18B20WriteByte(Ski pROM);135 DS18B20WriteByte(ReadScratch pad);136 Tem peratureL=DS18B20ReadByte();137 Temp eratureH=DS18B20ReadByte();138 ResetDS18B20();154139 En ablelNTO;140if (TemperatureH & 0x80)142143144if (TemperatureL=0)145Temp eratureH+=1;141Temp eratureH=(Te mp eratureH) | 0x08;Temp eratureL=Te mp eratureL+1;146147 Temp eratureH=(Te mp eratureH<<4)+(Te mp eratureL&0 xf0)>>4);148 Tem peratureL=TempX_TABTe mp eratureL&0 x0f;149 /bit0-bit7為小數(shù)位,bit8-bit14 為整數(shù)位,bit15為正負位150 Temp erature=Te mp eratureH;151 Temp erature=(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海員工的勞動合同范本5篇
- 中國電建合同范本
- 烹飪原料知識練習題庫(附答案)
- 個人廣告公司年終總結
- 修路購銷合同范本
- 小學英語職稱考試試卷
- 作坊小廠轉讓合同范本
- 上半年工作總結和下半年工作計劃
- 醫(yī)生專家聘用合同范本
- 南京 汽車銷售合同范本
- 儲備土地管護投標方案 (技術方案)
- 學技能如何打逃生繩結固定繩結
- 自驅型成長:如何培養(yǎng)孩子的自律力
- 特殊教育:康復訓練課程標準(年版)
- DCMM理論知識考試試題及答案
- 談心談話記錄100條范文(6篇)
- 中學生心理輔導-第一章-緒論
- 工業(yè)品買賣合同(樣表)
- 《教育學原理》馬工程教材第二章教育與社會發(fā)展
- 《常見疾病康復》期中考試試卷含答案
- 地球使用者地樸門設計手冊
評論
0/150
提交評論