DS18B20介紹流程圖和程序源代碼_第1頁
DS18B20介紹流程圖和程序源代碼_第2頁
DS18B20介紹流程圖和程序源代碼_第3頁
DS18B20介紹流程圖和程序源代碼_第4頁
DS18B20介紹流程圖和程序源代碼_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、DS18B20單線數字溫度傳感器DALLAS半導體公司的數字化溫度傳感器DS1820是世界上第一片支持 “一線總線”接口的溫度傳感器,體積更小、適用電壓更寬、更經濟。一線總線獨特而且經濟的特點,使用戶可輕松地組建溫度傳感器網絡,為測量系統的構建引入全新概念。DS18B20、 DS1822 “一線總線”數字化溫度傳感器同DS1820一樣,支持“一線總線”接口,測量溫度范圍為-55C+125C,在-10+85C范圍內,精度為0.5C,而DS1822的精度較差為 2C 。現場溫度直接以“一線總線”的數字方式傳輸,大大提高了系統的抗干擾性,適合于惡劣環境的現場溫度測量,如:環境控制、設備或過程控制、測

2、溫類消費電子產品等。DS18B20可以程序設定912位的分辨率,精度為0.5C,分辨率設定,以及用戶設定的報警溫度存儲在EEPROM中,掉電后依然保存。DS1822與 DS18B20軟件兼容,是DS18B20的簡化版本。省略了存儲用戶定義報警溫度、分辨率參數的EEPROM,精度降低為2C,適用于對性能要求不高,成本控制嚴格的應用,是經濟型產品。 繼“一線總線”的早期產品后,DS1820開辟了溫度傳感器技術的新概念。DS18B20和DS1822使電壓、特性及封裝有更多的選擇,讓我們可以構建適合自己的經濟的測溫系統。1、DS18B20性能特點 圖1 DS18B20引腳分布圖DS18B20的性能特點

3、:采用單總線專用技術,既可通過串行口線,也可通過其它I/O口線與微機接口,無須經過其它變換電路,直接輸出被測溫度值(9位二進制數,含符號位),測溫范圍為-55-+125,測量分辨率為0.0625,內含64位經過激光修正的只讀存儲器ROM,適配各種單片機或系統機,用戶可分別設定各路溫度的上、下限,內含寄生電源。 2、DS18B20內部結構 DS18B20內部結構主要由四部分組成:64位光刻ROM,溫度傳感器,非揮發的溫度報警觸發器TH和TL,高速暫存器。DS18B20的管腳排列如圖1所示。64位光刻ROM是出廠前被光刻好的,它可以看作是該DS18B20的地址序列號,不同的器件地址序列號不同。 8

4、位產品系列號48位產品序號8位CRC編碼 DS18B20高速暫存器共9個存儲單元,如表所示: 序號寄存器名稱作 用序號寄存器名稱作 用0溫度低字節以16位補碼形式存放4、5保留字節1、21溫度高字節6計數器余值2TH/用戶字節1存放溫度上限7計數器/3HL/用戶字節2存放溫度下限8CRCCRC校驗 以12位轉化為例說明溫度高低字節存放形式及計算:12位轉化后得到的12位數據,存儲在18B20的兩個高低兩個8位的RAM中,二進制中的前面5位是符號位。如果測得的溫度大于0,這5位為0,只要將測到的數值乘于0.0625即可得到實際溫度(等價說明:高8位字節的低3位和低8位字節的高4位組成溫度整數值的

5、二進制數;或者說:12位測量時,所測數值乘以0.0625(=1/16),即右移4位后去掉了二進制數的小數部分);如果溫度小于0,這5位為1,測到的數值需要取反加1再乘于0.0625才能得到實際溫度(等價說明:當溫度小于0時,整數部分就是各位取反,小數部分則是各位取反后加1)。 高8位SSSSS262524低8位232221202-12-22-32-4說明:溫度測量分辨率有四種,即9位測量分辨率0.5;10位測量分辨率0.25;11位測量分辨率0.125;12位測量分辨率0.0625;912位的測量,無論采用哪種分辨率,溫度整數的有效位均是表中2620;以12位為例:溫度值二進制數十六進制數+1

6、250000 0111 1101 000007D0H+25.06250000 0001 1001 00010191H+10.1250000 0000 1010 001000A2H+0.50000 0000 0000 10000008H00000 0000 0000 00000000H-0.51111 1111 1111 1000FFF8H-10.1251111 1111 0101 1110FF5EH-25.06251111 1110 0110 1111FF6FH-1251111 1100 1001 0000FC90H1、DS18B20控制方法 在硬件上,DS18B20與單片機的連接有兩種方法,

7、一種是VCC接外部電源,GND接地,I/O與單片機的I/O線相連;另一種是用寄生電源供電,此時UDD、GND接地,I/O接單片機I/O。無論是內部寄生電源還是外部供電,I/O口線要接5k左右的上拉電阻。DS18B20有六條控制命令,如下表所示:指 令約定代碼操 作 說 明溫度轉換44H啟動DS18B20進行溫度轉換讀暫存器BEH讀暫存器9個字節內容寫暫存器4EH將數據寫入暫存器的TH、TL字節復制暫存器48H把暫存器的TH、TL字節寫到E2RAM中重新調E2RAMB8H把E2RAM中的TH、TL字節寫到暫存器TH、TL字節讀電源供電方式B4H啟動DS18B20發送電源供電方式的信號給主CPUC

8、PU對DS18B20的訪問流程是:先對DS18B20初始化,再進行ROM操作命令,最后才能對存儲器操作,數據操作。DS18B20每一步操作都要遵循嚴格的工作時序和通信協議。如主機控制DS18B20完成溫度轉換這一過程,根據DS18B20的通訊協議,須經三個步驟:每一次讀寫之前都要對DS18B20進行復位,復位成功后發送一條ROM指令,最后發送RAM指令,這樣才能對DS18B20進行預定的操作。 讀DS18B20溫度的流程圖DS18B20是否存在?(讀DS18B20測量溫度子程序)GET-TEMPATURE開始數據端置位讀溫度值返回復位DS18B20(調用RESETDS18B20)寫溫度轉換命令

9、44H(調用WRITE18B20)寫跳過ROM匹配命令0CCH(調用WRITE18B20)延時750s?(讀溫度前)復位DS18B20(調用RESETDS18B20)寫跳過POM匹配命令0CCH(調用WRITE18B20)寫讀溫度字節命令0BEH(調用WRITE18B20)讀溫度(調用READ18B20)開始發一個DS18B20序列號執行期間匹配命令延時1s啟動在線DS18B20溫度AD轉換發跳過ROM命令、發轉換命令初始化DS18B20讀在線DS18B20序號發出搜索ROM命令DS18B20復位所有在線DS18B20訪問完?存在一個DS18B20?初始化DS18B20發讀暫存RAM指令讀匹配

10、的DS18B20溫度多點溫度檢測軟件流程圖Initialization procedure “reset and presence pulses”確保DS18B20在輸出低電平表示存在時數據線不被拉高(DS18B20復位子程序)RESETDS18B20開始設置標志位表示存在延時(480s , 960s)數據端(先置位后)清零數據端為低電平?DS18B20復位流程圖數據端置位(拉高數據線)延時300s?清除標志位表示不存在延時(180s)數據端置位(拉高數據線)DS18B20復位結束RESETDS18B20: SETB P2.2 NOP CLR P2.2 ;主機發出延時537微秒的復位低脈沖MO

11、V R1, #3 TSR1: MOV R0, #107 DJNZ R0, $ DJNZ R1, TSR1 SETB P2.2 ;然后拉高數據線 NOP NOP NOP MOV R0, #25H TSR2: JNB P2.2, TSR3 ;等待DS18B20回應 DJNZ R0, TSR2 LJMP TSR4 ; 延時 TSR3: SETB FLAG1 ; 置標志位,表示DS1820存在 CLR P1.7 ; 檢查到DS18B20就點亮P1.7LED LJMP TSR5 TSR4: CLR FLAG1 ; 清標志位,表示DS1820不存在 CLR P1.1 LJMP TSR7 TSR5: MOV

12、 R0, #117 TSR6: DJNZ R0, TSR6 ; 時序要求延時一段時間 TSR7: SETB P2.2 RET循環右移一次寫DS18B20(子程序)開始進位標志位清零延時30s數據端清零指令字節寫完?進位標志位值送數據端延時(15s)數據端置位(拉高數據線)DS18B20寫返回寫DS18B20指令字節的流程圖存低位字節數據一個字節是否讀完?布爾累加器C清零讀DS18B20兩個溫度字節的流程圖是低位字節數據?(讀DS18B20的溫度字節子程序)READ18B20開始讀數據端(數據)數據端清零延時(10s)數據端置位DS18B20讀返回延時(2s)數據端置位延時(3s)延時(25s)

13、保存所讀一位數據存高位字節數據C51程序#include #include unsigned char code displaybit=0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f; unsigned char code displaycode=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00,0x40; unsigned char code dotcode32=0,3,6,9,12,16,19,22, 25,28,31,34,38,

14、41,44,48, 50,53,56,59,63,66,69,72, 75,78,81,84,88,91,94,97; unsigned char displaycount; unsigned char displaybuf8=16,16,16,16,16,16,16,16; unsigned char timecount; unsigned char readdata8; sbit DQ=P37; bit sflag; bit resetpulse( void) unsigned char i ; DQ=0; for(i=255;i0;i-) ; DQ=1; for(i=60;i0;i-);

15、 return(DQ); for(i=200;i0;i-); Void write command to ds18b20 (unsigned char command) unsigned char i; unsigned char j; for(i=0;i0;j-); DQ=1; Else DQ=0; for(j=2;j0;j-); DQ=1; for(j=33;j0;j-); command=_cror_(command,1); unsigned char readdatafromds18b20(void) unsigned char i; unsigned char j; unsigned

16、 char temp; temp=0; for(i=0;i0;j-); if(DQ=1) temp=temp | 0x80; else temp=temp | 0x00; for(j=200;j0;j-); return(temp); void main(void) TMOD=0x01; TH0=(65536-4000)/256; TL0=(65536-4000)%256; ET0=1; EA=1; while(resetpulse(); writecommandtods18b20(0xcc); writecommandtods18b20(0x44); TR0=1; while(1) ; vo

17、id t0(void) interrupt 1 using 0 unsigned char x; unsigned int result; TH0=(65536-4000)/256; TL0=(65536-4000)%256; if(displaycount=2) P0=displaycodedisplaybufdisplaycount | 0x80; else P0=displaycodedisplaybufdisplaycount; P2=displaybitdisplaycount; displaycount+; if(displaycount=8) displaycount=0; ti

18、mecount+; if(timecount=150) timecount=0; while(resetpulse(); writecommandtods18b20(0xcc); writecommandtods18b20(0xbe); readdata0=readdatafromds18b20(); readdata1=readdatafromds18b20(); for(x=0;x255) readdata1+; readdata1=readdata14; x=x & 0x0f; readdata1=readdata1 | x; x=2; result=readdata1; while(r

19、esult/10) displaybufx=result%10; result=result/10; x+; displaybufx=result; if(sflag=1) displaybufx+1=17; x=readdata0 & 0x0f; x=x1; displaybuf0=(dotcodex)%10; displaybuf1=(dotcodex)/10; while(resetpulse(); writecommandtods18b20(0xcc); writecommandtods18b20(0x44); ;這是關于DS18B20的讀寫程序,數據腳P2.2,晶振11.0592MH

20、z ;溫度傳感器18B20匯編程序,采用器件默認的12位轉化,最大轉化時間750微秒 ;可以將檢測到的溫度直接顯示到AT89C51的兩個數碼管上 ;顯示溫度00到99度,很準確無需校正! ORG 0000H ;單片機內存分配申明! TEMPER_L EQU 29H ;用于保存讀出溫度的低8位 TEMPER_H EQU 28H ;用于保存讀出溫度的高8位 FLAG1 EQU 38H ;是否檢測到DS18B20標志位 a_bit equ 20h ;數碼管個位數存放內存位置 b_bit equ 21h ;數碼管十位數存放內存位置 MAIN: LCALL GET_TEMPER ;調用讀溫度子程序 ;進

21、行溫度顯示,這里我們考慮用網站提供的兩位數碼管來顯示溫度 ;顯示范圍00到99度,顯示精度為1度 ;因為12位轉化時每一位的精度為0.0625度,我們不要求顯示小數所以可以拋棄29H的低4位 ;將28H中的低4位移入29H中的高4位,這樣獲得一個新字節,這個字節就是實際測量獲得的溫度 ;這個轉化溫度的方法可是我想出來的哦非常簡潔無需乘于0.0625系數 MOV A,29H MOV C,40H ;將28H中的最低位移入C RRC A MOV C,41H RRC A MOV C,42H RRC A MOV C,43H RRC A MOV 29H,A LCALL DISPLAY ;調用數碼管顯示子程

22、序 CPL P1.0 AJMP MAIN ; 這是DS18B20復位初始化子程序 INIT_1820: SETB P2.2 ; 數據腳NOP CLR P2.2 ;主機發出延時537微秒的復位低脈沖MOV R1, #3 TSR1: MOV R0, #107 DJNZ R0, $ DJNZ R1, TSR1 SETB P2.2 ;然后拉高數據線 NOP NOP NOP MOV R0, #25H TSR2: JNB P2.2, TSR3 ;等待DS18B20回應 DJNZ R0, TSR2 LJMP TSR4 ; 延時 TSR3: SETB FLAG1 ; 置標志位,表示DS1820存在 CLR P

23、1.7 ; 檢查到DS18B20就點亮P1.7LED LJMP TSR5 TSR4: CLR FLAG1 ; 清標志位,表示DS1820不存在 CLR P1.1 LJMP TSR7 TSR5: MOV R0, #117 TSR6: DJNZ R0, TSR6 ; 時序要求延時一段時間 TSR7: SETB P2.2 RET ; 讀出轉換后的溫度值 GET_TEMPER: SETB P2.2 LCALL INIT_1820 ;先復位DS18B20 JB FLAG1, TSS2 CLR P1.2 RET ; 判斷DS1820是否存在?若DS18B20不存在則返回 TSS2: CLR P1.3 ;D

24、S18B20已經被檢測到! MOV A, #0CCH ; 跳過ROM匹配 LCALL WRITE_1820 MOV A, #44H ; 發出溫度轉換命令 LCALL WRITE_1820 ;這里通過調用顯示子程序實現延時一段時間,等待AD轉換結束,12位的話750微秒 LCALL DISPLAY LCALL INIT_1820 ;準備讀溫度前先復位 MOV A, #0CCH ; 跳過ROM匹配 LCALL WRITE_1820 MOV A, #0BEH ; 發出讀溫度命令 LCALL WRITE_1820 LCALL READ_18200; 將讀出的溫度數據保存到35H/36H CLR P1.

25、4 RET ;寫DS18B20的子程序(有具體的時序要求) WRITE_1820: MOV R2, #8 ;一共8位數據 CLR C WR1: CLR P2.2 MOV R3, #5 DJNZ R3, $ RRC A MOV P2.2, C MOV R3, #21 DJNZ R3, $ SETB P2.2 NOP DJNZ R2, WR1 SETB P2.2 RET ; 讀DS18B20的程序, 從DS18B20中讀出兩個字節的溫度數據READ_18200: MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出 MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入

26、28H(TEMPER_H) RE00: MOV R2,#8 ; 數據一共有8位 RE01: CLR C SETB P2.2 NOP NOP CLR P2.2 NOPNOP NOP SETB P2.2 MOV R3,#8 RE10: DJNZ R3,RE10 MOV C,P2.2 MOV R3,#21 RE20: DJNZ R3,RE20 RRC A DJNZ R2,RE01 MOV R1,A DEC R1 DJNZ R4,RE00 RET ;顯示子程序 display: MOV A,29H ;將29H中的十六進制數轉換成10進制 MOV B,#10 ;10進制/10=10進制 DIV A B

27、MOV b_bit ,A ;十位在a MOV a_bit ,B ;個位在b MOV DPTR, #numtab ;指定查表啟始地址 MOV R0,#4 dpl1: MOV R1,#250 ;顯示1000次 dplop:MOV A, a_bit ;取個位數 MOVC A,A+DPTR ;查個位數的7段代碼 MOV P0,A ;送出個位的7段代碼 CLR P2.7 ;開個位顯示 ACALL d1ms ;顯示1ms SETB P2.7 MOV A, b_bit ;取十位數 MOVC A,A+DPTR ;查十位數的7段代碼 MOV P0,A ;送出十位的7段代碼 CLR P2.6 ;開十位顯示 ACA

28、LL d1ms ;顯示1ms SETB P2.6 DJNZ R1,dplop ;100次沒完循環 DJNZ R0,dpl1 ; 4個100次沒完循環 RET ;1MS延時 d1ms: MOV R7,#80 DJNZ R7,$ RET ;實驗板上的7段數碼管09數字的共陰顯示代碼 numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH END#include reg51.h#include INTRINS.H#include LCD.h#define CLR_RI (RI=0)#define CLR_TI (TI=0) unsigned c

29、har code ID28= 0x28,0x1D,0x25,0x1D,0x00,0x00,0x00,0x80, 0x28,0x0e,0x9e,0x1c,0x00,0x00,0x00,0x32;unsigned char currSensorNo=0;sbit TMDAT = P17;sbit RUN_LED = P16;/*-*/void serial_initial() TMOD=0X20; SCON=0X50; PCON=0X00; TL1=TH1=0XE8; TR1=1;/*-*/void send(unsigned char count,unsigned char SEND_Buf)

30、unsigned char i; for(i=0;icount;i+) SBUF=SEND_Bufi;while(!TI);CLR_TI; /*- delay N ms-*/void Delay_ms (unsigned int Nms ) unsigned char i;while(Nms-)for(i=0; i0) Count-; /*- start Reset Pulse-*/void tmreset(void) TMDAT=0; Delay_Count(103); TMDAT=1; Delay_Count(4);/*- ACK-*/void tmpre(void) while(TMDA

31、T); while(TMDAT); Delay_Count(4);/*-Read a bit from 1820-*/bit tmrbit(void) int i=0; bit dat; TMDAT=0;i+; TMDAT=1;i+;i+; dat = TMDAT; Delay_Count(8); return dat;/*- Read a byte from 1820-*/unsigned char tmrbyte(void) unsigned char i,j,dat=0; for(i=1;i=8;i+) j=tmrbit(); dat=(j1); return dat;/*- Read a byte from 1820-*/void tmwbyte(unsigned char dat) signed char i=0; unsigned char j; bit testb; for(j=1;j1; if(testb) TMDAT=0; i+;i+; TMDAT=1; Delay_Count(8); else TMDAT=0; Delay_Count(8); TMDAT=

溫馨提示

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

評論

0/150

提交評論