ds18b20模塊C程序_第1頁(yè)
ds18b20模塊C程序_第2頁(yè)
ds18b20模塊C程序_第3頁(yè)
ds18b20模塊C程序_第4頁(yè)
ds18b20模塊C程序_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余8頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、/ds18b20 模塊/DS18B20 是美國(guó) DALLAS 半導(dǎo)體公司生產(chǎn)的可組網(wǎng)的一線式數(shù)字溫度傳感器,由于 DS18B20是在一根 I/O 線上讀寫(xiě)數(shù)據(jù),因此,對(duì)讀寫(xiě)的數(shù)據(jù)位有著嚴(yán)格的時(shí)序要求。DS18B20 有嚴(yán)格的通信協(xié)議來(lái)保證各位數(shù)據(jù)傳輸?shù)恼_性和完整性。該協(xié)議定義了幾種信號(hào)的時(shí)序:初始化時(shí)序、讀時(shí)序、寫(xiě)時(shí)序。所有時(shí)序都是將主機(jī)作為主設(shè)備,單總線器件作為從設(shè)備。而每一次命令和數(shù)據(jù)的傳輸都是從主機(jī)主動(dòng)啟動(dòng)寫(xiě)時(shí)序開(kāi)始,如果要求單總線器件回送數(shù)據(jù),在進(jìn)行寫(xiě)命令后,主機(jī)需啟動(dòng)讀時(shí)序完成數(shù)據(jù)接收。數(shù)據(jù)和命令的傳輸都是低位在先。以下是常見(jiàn)的 DS18B20 的測(cè)溫程序,其正確性筆者已經(jīng)通過(guò)仿真

2、實(shí)驗(yàn)和實(shí)際電路驗(yàn)證過(guò)。在程序設(shè)計(jì)時(shí),只要將 ds18b20.c 和主程序放在同一個(gè)工程中,且在主程序中包含頭文件ds18b20.h 即可。DS18B20頭文件:ds18b20.h#ifndef_DS18B20_H_#define_DS18B20_H_voiddelay_18B20(unsignedinti);Init_DS18B20(void);ReadOneChar(void);WriteOneChar(unsignedchardat);ReadTemperature(void);#endif測(cè)溫 C 程序:ds18b20.c#includesbitDQ=P1A0;定義通信端口unsigne

3、dcharsign;voiddelay_18B20(unsignedinti)(while(i-);)初始化函數(shù)Init_DS18B20(void)(unsignedcharx=0;DQ=1;/DQ 復(fù)位delay_18B20(8);稍做延時(shí)DQ=0;單片機(jī)將 DQ 拉低delay_18B20(80);/精確延時(shí)大于 480usDQ=1;拉高總線delay_18B20(14);x=DQ;稍做延時(shí)后如果 x=0 則初始化成功 x=1 則初始化失敗delay_18B20(20);讀一個(gè)字節(jié)ReadOneChar(void)(unsignedchari=0;unsignedchardat=0;for

4、(i=8;i0;i-)(DQ=0;/給脈沖信號(hào)dat=1;DQ=1;/給脈沖信號(hào)if(DQ)dat|=0 x80;delay_18B20(4);return(dat);寫(xiě)一個(gè)字節(jié)WriteOneChar(unsignedchardat)(unsignedchari=0;for(i=8;i0;i-)(DQ=0;DQ=dat&0 x01;delay_18B20(5);DQ=1;dat=1;讀取溫度ReadTemperature(void)(unsignedchara=0;unsignedcharb=0;unsignedintt=0,temp=0;Init_DS18B20();WriteOn

5、eChar(0 xCC);/跳過(guò)讀序號(hào)列號(hào)的操作WriteOneChar(0 xBE);/讀取溫度寄存器等(共可讀 9 個(gè)寄存器)delay_18B20(100);a=ReadOneChar();b=ReadOneChar();Init_DS18B20();WriteOneChar(0 xCC);/跳過(guò)讀序號(hào)列號(hào)的操作前兩個(gè)就是溫度WriteOneChar(0 x44);/啟動(dòng)溫度轉(zhuǎn)換傳感器返回值除 16 得實(shí)際溫度值為了得到 2 位小數(shù)位,先乘 100,再除 16,考慮整型數(shù)據(jù)長(zhǎng)度,技巧處理后先乘 25,再除 4,除 4 用右移實(shí)現(xiàn)temp=b&0 xf0;if(temp=0 xf0

6、)sign=0 x40;a=a;b=b;elsesign=0 x3f;b=b&0 x0f;t=(b*256+a)*25/4;return(sign,t);/網(wǎng)上程序/就算是用軟件的方式提高精度也只是虛擬的溫度,18B20 精度就是 0.0625 度,符合你的要求了,下面是我寫(xiě)的程序,有興趣你可以參考一下。帶報(bào)警設(shè)置#include#defineucharunsignedchar#defineuintunsignedintucharcodetable=0 xc0,0 xf9,0 xa4,0 xb0,/0,1,2,3共陽(yáng)0 x99,0 x92,0 x82,0 xf8,/4,5,6,70 x

7、80,0 x90,0 x88,0 x83,/8,9,A,B0 xc6,0 xa1,0 x86,0 x8e,0 xbf,0 xff,);sbitw1=P0A0;sbitw2=P0A1;sbitw3=P0A2;sbitw4=P0A3;sbitw5=P0A4;sbitw6=P0A5;sbitw7=P0A6;sbitw8=P0A7;sbitDQ=P3A7;定義 18B20 數(shù)據(jù)線sbitbeep=P3A6;/sbitbeep=P3A0;bitsflag;/正負(fù)標(biāo)志位uchartimecount;/中斷次數(shù)變量ucharreaddata2;/保存溫度數(shù)值數(shù)組 ucharROM8;ucharICROM28

8、;uchartemperature22;/讀兩個(gè) 18B20 存放溫度數(shù)組uchartest,test0,test1;/保存溫度數(shù)值中間變量ucharyi,er,san,shi,wu,liu,qi,ba;/定義數(shù)碼管顯示數(shù)變量delayms(uintt)uchartt;for(;t0;t-)for(tt=50;tt0;tt-);)voiddisplay(ucharyi,ucharer,ucharsan,ucharshi,ucharwu,ucharliu,ucharqi,ucharba)w8=1;2=tableyi;*數(shù)碼管掃描程序*/delayms(5);w8=0;delayms(1);w7=

9、1;2=tableer;delayms(5);w7=0;delayms(1);w6=1;2=tablesan;delayms(5);w6=0;delayms(1);w5=1;2=tableshi;delayms(5);w5=0;delayms(1);w4=1;2=tablewu;delayms(5);w4=0;delayms(1);w3=1;2=tableliu;delayms(5);w3=0;delayms(1);w2=1;2=tableqi;delayms(5);w2=0;delayms(1);w1=1;2=tableba;delayms(5);w1=0;delayms(1);/*/*18

10、B20 程序*/voiddelay18b20(uinti)for(;i0;i-);reset(void)/復(fù)位 18B20ucharx=0;DQ=1;delay18b20(8);DQ=0;delay18b20(80);DQ=1;delay18b20(14);x=DQ;delay18b20(20);voidwritebyte_18b20(ucharcommand)/寫(xiě)字節(jié)到 18B20(uchari=0;for(i=8;i0;i-)DQ=0;DQ=command&0 x01;delay18b20(5);DQ=1;command=command1;)ucharreadbyte_18b20(

11、)/從 18b20 讀出字節(jié)uchari=0;uchartemp=0;for(i=8;i0;i-)DQ=0;temp=1;DQ=1;if(DQ)temp|=0 x80;delay18b20(5);)return(temp);)*ucharreadROM()/讀 18B20 的 ROMuchari;reset();writebyte_18b20(0 x33);for(i=0;i8;i+)ROM=readbyte_18b20();return(ROM);ucharwriteROM()匹配 ROM 并讀出溫度存到 temperature22數(shù)組uchari,j;for(j=0;j2;j+)reset

12、();writebyte_18b20(0 x55);for(i=0;i255)/如果低八位的值轉(zhuǎn)為原碼后大于 11111111(255),向高八位進(jìn) 1readdata1+;test0=readdata0;test1=readdata1;test=(readdata1*256)+readdata0)/16;/把高位與低位的值轉(zhuǎn)成 10 進(jìn)制test0=(test0&0 x0f);/取小數(shù)位,低四位switch(test0)/判斷小數(shù)位的值,也可以用取表方式,精確度為 0.0625 度case0 x00:liu=0;qi=6;break;case0 x01:liu=1;qi=2;brea

13、k;case0 x02:liu=1;qi=8;break;case0 x03:liu=2;qi=5;break;case0 x04:liu=3;qi=1;break;case0 x05:liu=3;qi=7;break;case0 x06:liu=4;qi=3;break;case0 x07:liu=5;qi=0;break;case0 x08:liu=5;qi=6;break;case0 x09:liu=6;qi=2;break;case0 x0a:liu=6;qi=8;break;case0 x0b:liu=7;qi=5;break;case0 x0c:liu=8;qi=1;break;case0 x0d:liu=8;qi=7;break;case0 x0e:liu=9;qi=3;break;case0 x0f:liu=9;qi=9;break;er=test/1

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論