




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、折騰了一晚上,才把DS18B20的驅(qū)動(dòng)移植到STM32上來(lái)。以前在51上 使用過(guò)單個(gè)和多個(gè)連接的DS18B20,有現(xiàn)成的程序了,以為很快就能弄 好,結(jié)果還是被卡住了,下面說(shuō)下幾個(gè)關(guān)鍵點(diǎn)吧:首先是延時(shí)的問(wèn)題,STM32上若用軟件延時(shí)的話不太好算時(shí)間,所 以要么用定時(shí)器要么用SysTick這個(gè)定時(shí)器來(lái)完成延時(shí)的計(jì)算。 相比之 下用SysTick來(lái)的簡(jiǎn)單方便點(diǎn)。接著是STM32 10腳的配置問(wèn)題, 因?yàn)?1是雙向的10,所以作為輸 入輸出都比較方便。STM32的I0是準(zhǔn)雙向的10,網(wǎng)上查了下資料,說(shuō) 將STM32的I0配置成開漏輸出,然后外接上拉即可實(shí)現(xiàn)雙向10。于是我也按規(guī)定做了,但調(diào)了老半天都不
2、成功,是因?yàn)镈S18B20沒有響應(yīng)的 信號(hào)。在煩躁之際只有試下將接DQ的I0分別拉低和拉高看能不能讀 入正確的信號(hào)。結(jié)果果然是讀入數(shù)據(jù)不對(duì),原來(lái)我將I0配成開漏輸出后相當(dāng)然的以為讀數(shù)據(jù)是用GPIO_ReadOutputDataBit(),這正是問(wèn)題所 在,后來(lái)將讀入的函數(shù)改為GPI0_ReadInputDataBit()就0K了。現(xiàn)在溫 度是現(xiàn)實(shí)出來(lái)了,但跟我家里那臺(tái)德勝收音機(jī)上顯示的溫度相差2度,都不知道是哪個(gè)準(zhǔn)了,改天再找個(gè)溫度計(jì)驗(yàn)證下。下面引用一段DS18B20的時(shí)序描述,寫的很詳細(xì):DS18B20的控制流程根據(jù)DS18B20的通信協(xié)議,DS18B20只能作為從機(jī),而單片機(jī)系統(tǒng) 作為主機(jī)
3、, 單片機(jī)控制DS18B20完成一次溫度轉(zhuǎn)換必須經(jīng)過(guò)3個(gè)步驟:復(fù)位、 發(fā)送ROM指令、發(fā)送RAM指令。每次對(duì)DS18B20的操作都要 進(jìn)行以上三個(gè)步驟。復(fù)位過(guò)程為:?jiǎn)纹瑱C(jī)將數(shù)據(jù)線拉低至少480uS,然后釋放數(shù)據(jù)線, 等待15-60US讓DS18B20接收信號(hào),DS18B20接收到信號(hào)后,會(huì)把數(shù)據(jù) 線拉低60-240US,主機(jī)檢測(cè)到數(shù)據(jù)線被拉低后標(biāo)識(shí)復(fù)位成功;發(fā)送ROM指令:ROM指令表示主機(jī)對(duì)系統(tǒng)上所接的全部DS18B20進(jìn)行尋址,以確定對(duì)那一個(gè)DS18B20進(jìn)行操作,或者是讀取某 個(gè)DS18B20的ROM序列號(hào)。發(fā)送RAM指令:RAM指令用于單片機(jī)對(duì)DS18B20內(nèi)部RAM進(jìn)行 操作,如讀取
4、寄存器的值,或者設(shè)置寄存器的值。具體的RAM和RAM指令請(qǐng)查閱DS18B20的數(shù)據(jù)手冊(cè)。下面簡(jiǎn)單 介紹:1、ROM操作命令:DS18B20采用一線通信接口。因?yàn)橐痪€通 信接口,必須在先完成ROM設(shè)定,否則記憶和控制功能將無(wú)法使用。 一旦總線檢測(cè)到從屬器件的存在,它便可以發(fā)出器件ROM操作指令,所有ROM操作指令均為8位長(zhǎng)度,主要提供以下功能命令:1)讀ROM(指令碼0X33H):當(dāng)總線上只有一個(gè)節(jié)點(diǎn)(器件)時(shí),讀 此節(jié)點(diǎn)的64位序列號(hào)。如果總線上存在多于一個(gè)的節(jié)點(diǎn),則此指令不能 使用。2)ROM匹配(指令碼0X55H):此命令后跟64位的ROM序列號(hào),總 線上只有與此序列號(hào)相同的DS18B20
5、才會(huì)做出反應(yīng);該指令用于選中某 個(gè)DS18B20,然后對(duì)該DS18B20進(jìn)行讀寫操作。3)搜索ROM(指令碼0XF0H):用于確定接在總線上DS18B20的個(gè) 數(shù)和識(shí)別所有的64位ROM序列號(hào)。當(dāng)系統(tǒng)開始工作,總線主機(jī)可能不 知道總線上的器件個(gè)數(shù)或者不知道其64位ROM序列號(hào),搜索命令用于 識(shí)別所有連接于總線上的64位ROM序列號(hào)。4)跳過(guò)ROM(指令碼0XCCH):此指令只適合于總線上只有一個(gè)節(jié) 點(diǎn);該命令通過(guò)允許總線主機(jī)不提供64位ROM序列號(hào)而直接訪問(wèn)RAM, 以節(jié)省操作時(shí)間。5)報(bào)警檢查(指令碼0XECH):此指令與搜索ROM指令基本相同,差別在于只有溫度超過(guò)設(shè)定的上限或者下限值的DS
6、18B20才會(huì)作出響應(yīng)。只要DS18B20一上電,告警條件就保持在設(shè)置狀態(tài), 直到另一次溫度測(cè) 量顯示出非告警值,或者改變TH或TL的設(shè)置使得測(cè)量值再一次位于允 許的范圍之內(nèi)。儲(chǔ)存在EEPRO M內(nèi)的觸發(fā)器用于告警。2、RAM指令DS18B20有六條RAM命令:1)溫度轉(zhuǎn)換(指令碼0X44H):啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換,結(jié)果存 入內(nèi)部RAM。2)讀暫存器(指令碼0XBEH):讀暫存器9個(gè)字節(jié)內(nèi)容,此指令從RAM的第1個(gè)字節(jié)(字節(jié)0)開始讀取,直到九個(gè)字節(jié)(字節(jié)8,CRC值)被 讀出為止。如果不需要讀出所有字節(jié)的內(nèi)容,那么主機(jī)可以在任何時(shí)候 發(fā)出復(fù)位信號(hào)以中止讀操作。3)寫暫存器(指令碼0
7、X4EH):將上下限溫度報(bào)警值和配置數(shù)據(jù)寫 入到RAM的2、3、4字節(jié),此命令后跟需要些入到這三個(gè)字節(jié)的數(shù)據(jù)。4)復(fù)制暫存器 (指令碼0X48H) : 把暫存器的2、3、4字節(jié)復(fù)制到EEPROM中,用以掉電保存。5)重新調(diào)E2RAM(指令碼0XB8H):把EEROM中的溫度上下限及 配置字節(jié)恢復(fù)到RAM的2、3、4字節(jié),用以上電后恢復(fù)以前保存的報(bào)警 值及配置字節(jié)。6)讀電源供電方式(指令碼0XB4H):啟動(dòng)DS18B20發(fā)送電源供電方 式的信號(hào)給主CPU。對(duì)于在此命令送至DS18B20后所發(fā)出的第一次讀出 數(shù)據(jù)的時(shí)間片,器件都會(huì)給出其電源方式的信號(hào)。“0”表示寄生電源供電?!?”表示外部電源供
8、電。下面是結(jié)合實(shí)際測(cè)試總結(jié)出來(lái)的DS18B20的操作流程:1、DS18B20的初始化(1) 先將數(shù)據(jù)線置高電平 “1”。(2) 延時(shí)(該時(shí)間要求的不是很嚴(yán)格,但是盡可能的短一點(diǎn))。(3) 數(shù)據(jù)線拉到低電平“0”。(4) 延時(shí)490微秒(該時(shí)間的時(shí)間范圍可以從480到960微秒)。(5) 數(shù)據(jù)線拉到高電平“1”。(6) 延時(shí)等待(如果初始化成功則在15到60毫秒時(shí)間之內(nèi)產(chǎn)生一個(gè)由DS18B20所返回的低電平“0”。 據(jù)該狀態(tài)可以來(lái)確定它的存在, 但是應(yīng)注意不能無(wú)限的進(jìn)行等待, 不然會(huì)使程序進(jìn)入死循環(huán), 所以要進(jìn) 行超時(shí)控制)。(7)若CPU讀到了數(shù)據(jù)線上的低電平 “0”后,還要做延時(shí),其 延時(shí)的
9、時(shí)間從發(fā)出的高電平算起(第(5)步的時(shí)間算起)最少要480微秒。(8) 將數(shù)據(jù)線再次拉高到高電平 “1”后結(jié)束。2、DS18B20的寫操作(1) 數(shù)據(jù)線先置低電平“0”。(2) 延時(shí)確定的時(shí)間為2(小于15)微秒。(3) 按從低位到高位的順序發(fā)送字節(jié)(一次只發(fā)送一位)。(4) 延時(shí)時(shí)間為62(大于60)微秒。(5) 將數(shù)據(jù)線拉到高電平,延時(shí)2(小于15)微秒。(6) 重復(fù)上(1)到(6)的操作直到所有的字節(jié)全部發(fā)送完為止。(7) 最后將數(shù)據(jù)線拉高。3、DS18B20的讀操作(1) 將數(shù)據(jù)線拉高“1”。(2) 延時(shí)2微秒。(3) 將數(shù)據(jù)線拉低“0”。(4) 延時(shí)2(小于15)微秒。(5) 將數(shù)據(jù)
10、線拉高“1”,同時(shí)端口應(yīng)為輸入狀態(tài)。(6) 延時(shí)4(小于15)微秒。(7) 讀數(shù)據(jù)線的狀態(tài)得到1個(gè)狀態(tài)位,并進(jìn)行數(shù)據(jù)處理。(8)延時(shí)62(大于60)微秒。順便把程序也貼上來(lái)吧,給大家參考下。使用的方法:只要調(diào)用一次ds18b20_start()來(lái)初始化DS18B20,然后每次讀溫度時(shí)直接調(diào)用ds18b20_read()就可以了。女口ds18b20_start();while(1)for(i=1000000;i0;i-);val = ds18b20_read();cpp view pla in copy/=/DS18B20.C By ligh/=#include STM32Lib/stm32f1
11、0 x.h #include DS18B20.h#define EnablelNT()#define DisableINT()#define DS_PORTGPIOA#define DS_DQIOGPIO_Pin_1#define DS_RCC_PORT RCC_APB2Periph_GPIOA#define DS_PRECISION 0 x7f /精度配置寄存器1f=9位;3f=10位;5f=11位;7f=12位;#define DS_AlarmTH 0 x64#define DS_AlarmTL 0 x8a#define DS_CONVERT_TICK 1000#define ResetD
12、Q() GPIO_ResetBits(DS_PORT,DS_DQIO)#define SetDQ() GPIO_SetBits(DS_PORT,DS_DQIO)#define GetDQ() GPIO_ReadlnputDataBit(DS_PORT,DS_DQIO)static unsigned charTempX_TAB16=0 x00,0 x01,0 x01,0 x02,0 x03,0 x03,0 x04,0 x04,0 x05,0 x06,0 x06,0 x07,0 x08,0 x08,0 x09,0 x09;void Delay_us(u32 Nus)SysTick-LOAD=Nus
13、*9;/時(shí)間加載SysTick-CTRL|=0 x01;/開始倒數(shù)while (!(SysTick-CTRL&(1CTRL=0X00000000;/關(guān)閉計(jì)數(shù)器SysTick-VAL=0X00000000;/清空計(jì)數(shù)器unsigned char ResetDS18B20(void )unsigned char resport;SetDQ();Delay_us(50);ResetDQ();Delay_us(500);500us(該時(shí)間的時(shí)間范圍可以從480到960微秒)SetDQ();Delay_us(40);40us/resport = GetDQ();while (GetDQ();De
14、lay_us(500);500usSetDQ();return resport;void DS18B20WriteByte(unsigned char Dat)unsigned char i;for (i=8;i0;i-)ResetDQ(); /在15u內(nèi)送數(shù)到數(shù)據(jù)線上,DS18B20在15-60u讀數(shù)Delay_us(5);5usif (Dat & 0 x01)SetDQ();elseResetDQ();Delay_us(65);65usSetDQ();Delay_us(2);/連續(xù)兩位間應(yīng)大于1usDat =1; unsigned char DS18B20ReadByte( voi
15、d )unsigned char i,Dat;SetDQ();Delay_us(5);for (i=8;i0;i-)Dat =1;ResetDQ();/從讀時(shí)序開始到采樣信號(hào)線必須在15u內(nèi),且采樣盡量安排在15u的最后Delay_us(5);5usSetDQ();Delay_us(5); /5usif(GetDQ()Dat|=0 x80;elseDat&=0 x7f;Delay_us(65); /65usSetDQ(); return Dat;void ReadRom(unsigned char *Read_Addr)unsigned char i;DS18B20WriteByte(
16、ReadROM);for (i=8;i0;i-)*Read_Addr=DS18B20ReadByte();Read_Add葉+;void DS18B20lnit(unsigned char Precision,unsigned char AlarmTH,unsignedDisablelNT();ResetDS18B20();DS18B20WriteByte(SkipROM);DS18B20WriteByte(WriteScratchpad);DS18B20WriteByte(AlarmTL);DS18B20WriteByte(AlarmTH);DS18B20WriteByte(Precisio
17、n);ResetDS18B20();DS18B20WriteByte(SkipROM);DS18B20WriteByte(CopyScratchpad);EnableINT();char AlarmTL)while (!GetDQ(); /等待復(fù)制完成/void DS18B20StartConvert( void )DisablelNT();ResetDS18B20();DS18B20WriteByte(SkipROM);DS18B20WriteByte(StartConvert);EnableINT();void DS18B20_Configuration( void )GPIO_lnitT
18、ypeDef GPIO_lnitStructure;RCC_APB2PeriphClockCmd(DS_RCC_PORT, ENABLE);GPIO_lnitStructure.GPIO_Pin = DS_DQIO;GPIO_lnitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /開漏輸出GPIO_lnitStructure.GPIO_Speed = GPIO_Speed_50MH z;2M時(shí)鐘速度GPIO_Init(DS_PORT, & GPIO_InitStructure);void ds18b20_start( void )DS18B20_Con
19、figuration();DS18B20lnit(DS_PRECISION, DS_AlarmTH, DS_AlarmTL);DS18B20StartConvert();unsigned short ds18b20_read( void )unsigned char TemperatureL,TemperatureH;unsigned int Temperature;DisablelNT();ResetDS18B20();DS18B20WriteByte(SkipROM);DS18B20WriteByte(ReadScratchpad);TemperatureL=DS18B20ReadByte
20、();TemperatureH=DS18B20ReadByte();ResetDS18B20();EnablelNT();if (TemperatureH & 0 x80)TemperatureH=(TemperatureH) | 0 x08;TemperatureL=TemperatureL+1;if (TemperatureL=0)TemperatureH+=1;TemperatureH=(TemperatureH4);TemperatureL=TempX_TABTemperatureL&0 x0f;bit0-bit7為小數(shù)位,bit8-bit14為整數(shù)位,bit15為正負(fù)位Temperatu
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 市場(chǎng)營(yíng)銷文化差異小自考試題及答案
- 2025至2030年中國(guó)中餐服務(wù)員服裝行業(yè)投資前景及策略咨詢報(bào)告
- 2025至2030年中國(guó)中型軌市場(chǎng)調(diào)查研究報(bào)告
- 2024年小自考視覺傳播設(shè)計(jì)與社會(huì)交互的關(guān)系及試題及答案
- 第四單元 13 我愛家鄉(xiāng)山和水2023-2024學(xué)年二年級(jí)上冊(cè)道德與法治同步教學(xué)設(shè)計(jì)(部編版)
- 2025至2030年中國(guó)丁位辛內(nèi)酯行業(yè)發(fā)展研究報(bào)告
- 第一單元第2課一、《制作一幅簡(jiǎn)單畫面》教學(xué)設(shè)計(jì) 2023-2024學(xué)年人教版初中信息技術(shù)七年級(jí)下冊(cè)
- 能力培養(yǎng)組測(cè)試題及答案
- 預(yù)防統(tǒng)計(jì)學(xué)的試題及答案
- Unit7 A picture of my family第1課時(shí)(教學(xué)設(shè)計(jì))-2023-2024學(xué)年教科版(廣州)英語(yǔ)三年級(jí)上冊(cè)
- 生理學(xué)全套課件
- TBT2765-2005 列車運(yùn)行監(jiān)控記錄裝置技術(shù)條件
- 司法審計(jì)報(bào)告范文
- 《醫(yī)療人文關(guān)懷》課件
- 《機(jī)械制造工藝與夾具》考試復(fù)習(xí)題庫(kù)(含答案)
- 安全風(fēng)險(xiǎn)分級(jí)管控清單(大全)
- 2024版國(guó)開電大??啤豆芾碛⒄Z(yǔ)1》在線形考(單元自測(cè)1至8)試題及答案
- 人音版初中音樂(lè) 九年級(jí)上冊(cè) 中考一輪復(fù)習(xí)課件
- 有效溝通技巧(適用于工廠)PPT幻燈片
- 教科版四年級(jí)科學(xué)下冊(cè)實(shí)驗(yàn)報(bào)告
- 受賄罪-刑事-辯護(hù)詞
評(píng)論
0/150
提交評(píng)論