當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]最近都在學(xué)習(xí)和寫單片機(jī)的程序, 今天有空又模仿DS18B20溫度測(cè)量顯示實(shí)驗(yàn)寫了一個(gè)與DS18B20基于單總線通信的程序.DS18B20 數(shù)字溫度傳感器(參考:智能溫度傳感器DS18B20的原理與應(yīng)用)是DALLAS 公司生產(chǎn)的1-Wire,即單總

最近都在學(xué)習(xí)和寫單片機(jī)的程序, 今天有空又模仿DS18B20溫度測(cè)量顯示實(shí)驗(yàn)寫了一個(gè)與DS18B20基于單總線通信的程序.

DS18B20 數(shù)字溫度傳感器(參考:智能溫度傳感器DS18B20的原理與應(yīng)用)是DALLAS 公司生產(chǎn)的1-Wire,即單總線器件,具有線路簡單,體積小的特點(diǎn)。因此用它來組成一個(gè)測(cè)溫系統(tǒng),具有線路簡單,在一根通信線,可以掛很多這樣的數(shù)字溫度計(jì)。DS18B20 產(chǎn)品的特點(diǎn):
(1)、只要求一個(gè)I/O 口即可實(shí)現(xiàn)通信。
(2)、在DS18B20 中的每個(gè)器件上都有獨(dú)一無二的序列號(hào)。
(3)、實(shí)際應(yīng)用中不需要外部任何元器件即可實(shí)現(xiàn)測(cè)溫。
(4)、測(cè)量溫度范圍在-55 到+125℃之間; 在-10 ~ +85℃范圍內(nèi)誤差為±5℃;
(5)、數(shù)字溫度計(jì)的分辨率用戶可以從9 位到12 位選擇。將12位的溫度值轉(zhuǎn)換為數(shù)字量所需時(shí)間不超過750ms;
(6)、內(nèi)部有溫度上、下限告警設(shè)置。

DS18B20引腳分布圖

DS18B20 詳細(xì)引腳功能描述:
1、GND 地信號(hào);
2、DQ數(shù)據(jù)輸入出引腳。開漏單總線接口引腳。當(dāng)被用在寄生電源下,此引腳可以向器件提供電源;漏極開路, 常太下高電平. 通常要求外接一個(gè)約5kΩ的上拉電阻.
3、VDD可選擇的VDD 引腳。電壓范圍:3~5.5V; 當(dāng)工作于寄生電源時(shí),此引腳必須接地。

DS18B20存儲(chǔ)器結(jié)構(gòu)圖

暫存儲(chǔ)器的頭兩個(gè)字節(jié)為測(cè)得溫度信息的低位和高位字節(jié);
第3, 4字節(jié)是TH和TL的易失性拷貝, 在每次電復(fù)位時(shí)都會(huì)被刷新;
第5字節(jié)是配置寄存器的易失性拷貝, 同樣在電復(fù)位時(shí)被刷新;
第9字節(jié)是前面8個(gè)字節(jié)的CRC檢驗(yàn)值.

配置寄存器的命令內(nèi)容如下:

0R1R011111

MSB LSB
R0和R1是溫度值分辨率位, 按下表進(jìn)行配置.默認(rèn)出廠設(shè)置是R1R0 = 11, 即12位.

溫度值分辨率配置表

R1R0分辨率最大轉(zhuǎn)換時(shí)間(ms)009bit93.75(tconv/8)0110bit183.50(tconv/4)1011bit375(tconv/2)1112bit750 (tconv)

4種分辨率對(duì)應(yīng)的溫度分辨率為0.5℃, 0.25℃, 0.125℃, 0.0625℃(即最低一位代表的溫度值)

12位分辨率時(shí)的兩個(gè)溫度字節(jié)的具體格式如下:
低字節(jié):

2^32^22^12^02^-12^-22^-32^-4


高字節(jié):

SSSSS2^62^52^4


其中高字節(jié)前5位都是符號(hào)位S, 若分辨率低于12位時(shí), 相應(yīng)地使最低為0, 如: 當(dāng)分辨率為10位時(shí), 低字節(jié)為:

2^32^22^12^02^-12^-200


, 高字節(jié)不變....

一些溫度與轉(zhuǎn)換后輸出的數(shù)字參照如下:

溫度數(shù)字輸出換成16進(jìn)制+125℃00000111 1101000007D0H+85℃00000101 010100000550H+25.0625℃00000001 100100010191H+10.125℃00000000 1010001000A2H+0.5℃00000000 000010000008H0℃00000000 000000000000H-0.5℃11111111 11111000FFF8H-10.125℃11111111 01011110FFE5H-25.0625℃11111110 01101111FF6FH-55℃11111100 10010000FC90H

由上表可看出, 當(dāng)輸出是負(fù)溫度時(shí), 使用補(bǔ)碼表示, 方便計(jì)算機(jī)運(yùn)算(若是用C語言, 直接將結(jié)果賦值給一個(gè)int變量即可).

DS18B20 的使用方法:
由于DS18B20 采用的是1-Wire 總線協(xié)議方式,即在一根數(shù)據(jù)線實(shí)現(xiàn)數(shù)據(jù)的雙向傳輸,而對(duì)單片機(jī)來說,我們必須采用軟件的方法來模擬單總線的協(xié)議時(shí)序來完成對(duì)DS18B20芯片的訪問。
由于DS18B20是在一根I/O線上讀寫數(shù)據(jù),因此,對(duì)讀寫的數(shù)據(jù)位有著嚴(yán)格的時(shí)序要求。
DS18B20有嚴(yán)格的通信協(xié)議來保證各位數(shù)據(jù)傳輸?shù)恼_性和完整性。
該協(xié)議定義了幾種信號(hào)的時(shí)序:初始化時(shí)序(dsInit()實(shí)現(xiàn))、讀時(shí)序(readByte())、寫時(shí)序(writeByte())。
所有時(shí)序都是將主機(jī)作為主設(shè)備,單總線器件作為從設(shè)備。而每一次命令和數(shù)據(jù)的傳輸都是從主機(jī)主動(dòng)啟動(dòng)寫時(shí)序開始,如果要求單總線器件回送數(shù)據(jù),在進(jìn)行寫命令后,主機(jī)需啟動(dòng)讀時(shí)序完成數(shù)據(jù)接收。數(shù)據(jù)和命令的傳輸都是低位在先。

DS18B20與單片機(jī)連接電路圖:


利用軟件模擬DS18B20的單線協(xié)議和命令:主機(jī)操作DS18B20必須遵循下面的順序
1. 初始化
單線總線上的所有操作都是從初始化開始的. 過程如下:
1)請(qǐng)求: 主機(jī)通過拉低單線480us以上, 產(chǎn)生復(fù)位脈沖, 然后釋放該線, 進(jìn)入Rx接收模式. 主機(jī)釋放總線時(shí), 會(huì)產(chǎn)生一個(gè)上升沿脈沖.
DQ : 1 -> 0(480us+) -> 1
2)響應(yīng): DS18B20檢測(cè)到該上升沿后,延時(shí)15~60us, 通過拉低總線60~240us來產(chǎn)生應(yīng)答脈沖.
DQ: 1(15~60us) -> 0(60~240us)
3)接收響應(yīng): 主機(jī)接收到從機(jī)的應(yīng)答脈沖后, 說明有單線器件在線. 至此, 初始化完成.
DQ: 0

2. ROM操作命令
當(dāng)主機(jī)檢測(cè)到應(yīng)答脈沖, 便可發(fā)起ROM操作命令. 共有5類ROM操作命令, 如下表

命令類型命令字節(jié)功能Read Rom 讀ROM33H讀取激光ROM中的64位,只能用于總線上單個(gè)DS18B20器件情況, 多掛時(shí)會(huì)發(fā)生數(shù)據(jù)沖突Match Rom匹配ROM55H此命令后跟64位ROM序列號(hào),尋址多掛總線上的對(duì)應(yīng)DS18B20.只有序列號(hào)完全匹配的DS18B20才能響應(yīng)后面的內(nèi)存操作命令,其他不匹配的將等待復(fù)位脈沖.可用于單掛或多掛兩種情況.Skip Rom 跳過ROMCCH可無須提供64位ROM序列號(hào)即可運(yùn)行內(nèi)存操作命令, 只能用于單掛.Search Rom搜索ROMF0H通過一個(gè)排除法過程, 識(shí)別出總線上所有器件的ROM序列號(hào)Alarm Search告警搜索ECH命令流程與Search Rom相同, 但DS18B20只有最近的一次溫度測(cè)量時(shí)滿足了告警觸發(fā)條件的, 才會(huì)響應(yīng)此命令.


3. 內(nèi)存操作命令
在成功執(zhí)行ROM操作命令后, 才可使用內(nèi)存操作命令. 共有6種內(nèi)存操作命令:

命令類型命令字節(jié)功能

Write Scratchpad
寫暫存器

4EH寫暫存器中地址2~地址4的3個(gè)字節(jié)(TH,TL和配置寄存器)在發(fā)起復(fù)位脈沖之前,3個(gè)字節(jié)都必須要寫.

Read Scratchpad
讀暫存器

BEH讀取暫存器內(nèi)容,從字節(jié)0~一直到字節(jié)8, 共9個(gè)字節(jié),主機(jī)可隨時(shí)發(fā)起復(fù)位脈沖,停止此操作,通常我們只需讀前5個(gè)字節(jié).

Copy Scratchpad
復(fù)制暫存器

48H將暫存器中的內(nèi)容復(fù)制進(jìn)EERAM, 以便將溫度告警觸發(fā)字節(jié)存入非易失內(nèi)存. 如果此命令后主機(jī)產(chǎn)生讀時(shí)隙, 那么只要器件還在進(jìn)行復(fù)制都會(huì)輸出0, 復(fù)制完成后輸出1.

Convert T
溫度轉(zhuǎn)換

44H開始溫度轉(zhuǎn)換操作. 若在此命令后主機(jī)產(chǎn)生時(shí)隙, 那么只要器件還在進(jìn)行溫度轉(zhuǎn)換就會(huì)輸出0, 轉(zhuǎn)換完成后輸出1.

Recall E2
重調(diào)E2暫存器

B8H將存儲(chǔ)在EERAM中的溫度告警觸發(fā)值和配置寄存器值重新拷貝到暫存器中,此操作在DS18B20加電時(shí)自動(dòng)產(chǎn)生.

Read Power Supply
讀供電方式

B4H主機(jī)發(fā)起此命令后每個(gè)讀數(shù)時(shí)隙內(nèi),DS18B20會(huì)發(fā)信號(hào)通知它的供電方式:0寄生電源, 1外部供電.


4. 數(shù)據(jù)處理
DS18B20要求有嚴(yán)格的時(shí)序來保證數(shù)據(jù)的完整性. 在單線DQ上, 有復(fù)位脈沖, 應(yīng)答脈沖, 寫0, 寫1, 讀0, 讀1這6種信號(hào)類型. 除了應(yīng)答脈沖外, 其它都由主機(jī)產(chǎn)生. 數(shù)據(jù)位的讀和寫是通過讀、寫時(shí)隙實(shí)現(xiàn)的.
1) 寫時(shí)隙: 當(dāng)主機(jī)將數(shù)據(jù)線從高電平拉至低電平時(shí), 產(chǎn)生寫時(shí)隙.所有寫時(shí)隙都必須在60us以上, 各寫時(shí)隙間必須保證1us的恢復(fù)時(shí)間.
寫"1" : 主機(jī)將數(shù)據(jù)線DQ先拉低, 然后釋放15us后, 將數(shù)據(jù)線DQ拉高;
寫"0" : 主機(jī)將DQ拉低并至少保持60us以上.
2)讀時(shí)隙: 當(dāng)主機(jī)將數(shù)據(jù)線DQ從高電平拉至低電平時(shí), 產(chǎn)生讀時(shí)隙. 所有讀時(shí)隙最短必須持續(xù)60us, 各讀時(shí)隙間必須保證1us的恢復(fù)時(shí)間.
讀: 主機(jī)將DQ拉低至少1us,. 此時(shí)主機(jī)馬上將DQ拉高, 然后就可以延時(shí)15us后, 讀取DQ即可.


源代碼: (測(cè)量范圍: 0 ~ 99度)


DS18B20
1#include
2//通過DS18B20測(cè)試當(dāng)前環(huán)境溫度,并通過數(shù)碼管顯示當(dāng)前溫度值
3sbitwela=P2^7;//數(shù)碼管位選
4sbitdula=P2^6;//數(shù)碼管段選
5sbitds=P2^2;
6//0-F數(shù)碼管的編碼(共陰極)
7unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
80x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
9//0-9數(shù)碼管的編碼(共陰極),帶小數(shù)點(diǎn)
10unsignedcharcodetableWidthDot[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
110x87,0xff,0xef};
12
13//延時(shí)函數(shù),例i=10,則大概延時(shí)10ms.
14voiddelay(unsignedchari)
15{
16unsignedcharj,k;
17for(j=i;j>0;j--)
18{
19for(k=125;k>0;k--);
20}
21}
22
23//初始化DS18B20
24//讓DS18B20一段相對(duì)長時(shí)間低電平,然后一段相對(duì)非常短時(shí)間高電平,即可啟動(dòng)
25voiddsInit()
26{
27//一定要使用unsignedint型,一個(gè)i++指令的時(shí)間,作為與DS18B20通信的小時(shí)間間隔
28//以下都是一樣使用unsignedint型
29unsignedinti;
30ds=0;
31i=103;
32while(i>0)i--;
33ds=1;
34i=4;
35while(i>0)i--;
36}
37
38//向DS18B20讀取一位數(shù)據(jù)
39//讀一位,讓DS18B20一小周期低電平,然后兩小周期高電平,
40//之后DS18B20則會(huì)輸出持續(xù)一段時(shí)間的一位數(shù)據(jù)
41bitreadBit()
42{
43unsignedinti;
44bitb;
45ds=0;
46i++;
47ds=1;
48i++;i++;
49b=ds;
50i=8;
51while(i>0)i--;
52returnb;
53}
54
55//讀取一字節(jié)數(shù)據(jù),通過調(diào)用readBit()來實(shí)現(xiàn)
56unsignedcharreadByte()
57{
58unsignedinti;
59unsignedcharj,dat;
60dat=0;
61for(i=0;i<8;i++)
62{
63j=readBit();
64//最先讀出的是最低位數(shù)據(jù)
65dat=(j<<7)"(dat>>1);
66}
67returndat;
68}
69
70//向DS18B20寫入一字節(jié)數(shù)據(jù)
71voidwriteByte(unsignedchardat)
72{
73unsignedinti;
74unsignedcharj;
75bitb;
76for(j=0;j<8;j++)
77{
78b=dat&0x01;
79dat>>=1;
80//寫"1",讓低電平持續(xù)2個(gè)小延時(shí),高電平持續(xù)8個(gè)小延時(shí)
81if(b)
82{
83ds=0;
84i++;i++;
85ds=1;
86i=8;while(i>0)i--;
87}
88else//寫"0",讓低電平持續(xù)8個(gè)小延時(shí),高電平持續(xù)2個(gè)小延時(shí)
89{
90ds=0;
91i=8;while(i>0)i--;
92ds=1;
93i++;i++;
94}
95}
96}
97
98//向DS18B20發(fā)送溫度轉(zhuǎn)換命令
99voidsendChangeCmd()
100{
101dsInit();//初始化DS18B20
102delay(1);//延時(shí)1ms
103writeByte(0xcc);//寫入跳過序列號(hào)命令字
104writeByte(0x44);//寫入溫度轉(zhuǎn)換命令字
105}
106
107//向DS18B20發(fā)送讀取數(shù)據(jù)命令
108voidsendReadCmd()
109{
110dsInit();
111delay(1);
112writeByte(0xcc);//寫入跳過序列號(hào)命令字
113writeByte(0xbe);//寫入讀取數(shù)據(jù)令字
114}
115
116//獲取當(dāng)前溫度值
117unsignedintgetTmpValue()
118{
119unsignedintvalue;//存放溫度數(shù)值
120floatt;
121unsignedcharlow,high;
122sendReadCmd();
123//連續(xù)讀取兩個(gè)字節(jié)數(shù)據(jù)
124low=readByte();
125high=readByte();
126//將高低兩個(gè)字節(jié)合成一個(gè)整形變量
127value=high;
128value<<=8;
129value"=low;
130//DS18B20的精確度為0.0625度,即讀回?cái)?shù)據(jù)的最低位代表0.0625度
131t=value*0.0625;
132//將它放大10倍,使顯示時(shí)可顯示小數(shù)點(diǎn)后一位,并對(duì)小數(shù)點(diǎn)后第二2進(jìn)行4舍5入
133//如t=11.0625,進(jìn)行計(jì)數(shù)后,得到value=111,即11.1度
134value=t*10+0.5;
135returnvalue;
136}
137
138//顯示當(dāng)前溫度值,精確到小數(shù)點(diǎn)后一位
139voiddisplay(unsignedintv)
140{
141unsignedcharcount;
142unsignedchardatas[]={0,0,0};
143datas[0]=v/100;
144datas[1]=v%100/10;
145datas[2]=v%10;
146for(count=0;count<3;count++)
147{
148//片選
149wela=0;
150P0=((0xfe<>(8-count)));//選擇第(count+1)個(gè)數(shù)碼管
151wela=1;//打開鎖存,給它一個(gè)下降沿量
152wela=0;
153//段選
154dula=0;
155if(count!=1)
156{
157P0=table[datas[count]];//顯示數(shù)字
158}
159else
160{
161P0=tableWidthDot[datas[count]];//顯示帶小數(shù)點(diǎn)數(shù)字
162}
163dula=1;//打開鎖存,給它一個(gè)下降沿量
164dula=0;
165delay(5);//延時(shí)5ms,即亮5ms
166
167//清除段先,讓數(shù)碼管滅,去除對(duì)下一位的影響,去掉高位對(duì)低位重影
168//若想知道影響效果如何,可自行去掉此段代碼
169//因?yàn)閿?shù)碼管是共陰極的,所有滅的代碼為:00H
170dula=0;
171P0=0x00;//顯示數(shù)字
172dula=1;//打開鎖存,給它一個(gè)下降沿量
173dula=0;
174}
175}
176
177voidmain()
178{
179unsignedchari;
180unsignedintvalue;
181while(1)
182{
183//啟動(dòng)溫度轉(zhuǎn)換
184sendChangeCmd();
185value=getTmpValue();
186//顯示3次
187for(i=0;i<3;i++)
188{
189display(value);
190}
191}
192}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉