<noframes id="ixm7d"><noframes id="ixm7d"><rt id="ixm7d"><delect id="ixm7d"></delect></rt><noframes id="ixm7d"><rt id="ixm7d"><rt id="ixm7d"></rt></rt><rt id="ixm7d"></rt> <noframes id="ixm7d"><rt id="ixm7d"><delect id="ixm7d"></delect></rt><delect id="ixm7d"></delect><bdo id="ixm7d"></bdo><rt id="ixm7d"></rt><bdo id="ixm7d"></bdo><noframes id="ixm7d"><rt id="ixm7d"><rt id="ixm7d"></rt></rt><rt id="ixm7d"><rt id="ixm7d"></rt></rt><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><rt id="ixm7d"></rt> <noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><noframes id="ixm7d"><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><noframes id="ixm7d"><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d">

ds18b20學習總結范文

2023-09-26

ds18b20學習總結范文第1篇

2、 Match ROM[55H]

這個是匹配ROM命令,后跟64位ROM序列,讓總線控制器在多點總線上定位一只特定的DS18B20。只有和64位ROM序列完全匹配的DS18B20才能響應隨后的存儲器操作。所有和64位ROM序列不匹配的從機都將等待復位脈沖。這條命令在總線上有單個或多個器件時都可以使用。

3、Skip ROM[0CCH]

這條命令允許總線控制器不用提供64位ROM編碼就使用存儲器操作命令,在單點總線情況下,可以節省時間。如果總線上不止一個從機,在Skip ROM命令之后跟著發一條讀命令,由于多個從機同時傳送信號,總線上就會發生數據沖突(漏極開路下拉效果相當于相“與”)

4、Search ROM[0F0H]

當一個系統初次啟動時,總線控制器可能并不知道單線總線上有多個器件或它們的64位編碼,搜索ROM命令允許總線控制器用排除法識別總線上的所有從機的64位編碼。

5、Alarm Search[0ECH]

這條命令的流程和Search ROM相同。然而,只有在最近一次測溫后遇到符合報警條件的情況,DS18B20才會響應這條命令。報警條件定義為溫度高于TH或低于TL。只要DS18B20不掉電,報警狀態將一直保持,知道再一次測得的溫度值達不到報警條件。

6、Write Scratchpad[4EH]

這個命令向DS18B20的暫存器TH和TL中寫入數據??梢栽谌魏螘r刻發出復位命令來中止寫入。

7、Read Scratchpad[0BEH]

這個命令讀取暫存器的內容。讀取將從第1個字節開始,一直進行下去,直到第9(CRC)字節讀完。如果不想讀完所有字節,控制器可以在任何時間發出復位命令來中止讀取。

8、Copy Scratchpad[48H]

這個命令把暫存器的內容拷貝到DS18B20的E2ROM存儲器里,即把溫度報警觸發字節存入非易失性存儲器里。如果總線控制器在這條命令之后跟著發出讀時間隙,而DS18B20又忙于把暫存器拷貝到E2存儲器,DS18B20就會輸出一個0,如果拷貝結束的話,DS18B20則輸出1。如果使用寄生電源,總線控制器必須在這條命令發出后立即啟動強上拉并保持10ms。

9、Convert T[44H]

這條命令啟動一次溫度轉換而無需其他數據。溫度轉換命令被執行,而后DS18B20保持等待狀態。如果總線控制器在這條命令之后跟著發出時間隙,而DS18B20又忙于做時間轉換的話,DS18B20將在總線上輸出0,若溫度轉換完成,則輸出1,。如果使用寄生電源,總線控制必須在發出這條命令后立即啟動強上拉,并保持500ms以上時間。

10、Recall E2

這條命令把報警觸發器里的值拷貝回暫存器。這種拷貝操作在DS18B20上電時自動執行,這樣器件一上電,暫存器里馬上就存在有效的數據了。若在這條命令發出之后發出讀數據隙,器件會輸出溫度轉換忙的標識:0為忙,1為完成。

11、Read Power Supply[0B4H]

ds18b20學習總結范文第2篇

2、 Match ROM[55H]

這個是匹配ROM命令,后跟64位ROM序列,讓總線控制器在多點總線上定位一只特定的DS18B20。只有和64位ROM序列完全匹配的DS18B20才能響應隨后的存儲器操作。所有和64位ROM序列不匹配的從機都將等待復位脈沖。這條命令在總線上有單個或多個器件時都可以使用。

3、Skip ROM[0CCH]

這條命令允許總線控制器不用提供64位ROM編碼就使用存儲器操作命令,在單點總線情況下,可以節省時間。如果總線上不止一個從機,在Skip ROM命令之后跟著發一條讀命令,由于多個從機同時傳送信號,總線上就會發生數據沖突(漏極開路下拉效果相當于相“與”)

4、Search ROM[0F0H]

當一個系統初次啟動時,總線控制器可能并不知道單線總線上有多個器件或它們的64位編碼,搜索ROM命令允許總線控制器用排除法識別總線上的所有從機的64位編碼。

5、Alarm Search[0ECH]

這條命令的流程和Search ROM相同。然而,只有在最近一次測溫后遇到符合報警條件的情況,DS18B20才會響應這條命令。報警條件定義為溫度高于TH或低于TL。只要DS18B20不掉電,報警狀態將一直保持,知道再一次測得的溫度值達不到報警條件。

6、Write Scratchpad[4EH]

這個命令向DS18B20的暫存器TH和TL中寫入數據??梢栽谌魏螘r刻發出復位命令來中止寫入。

7、Read Scratchpad[0BEH]

這個命令讀取暫存器的內容。讀取將從第1個字節開始,一直進行下去,直到第9(CRC)字節讀完。如果不想讀完所有字節,控制器可以在任何時間發出復位命令來中止讀取。

8、Copy Scratchpad[48H]

這個命令把暫存器的內容拷貝到DS18B20的E2ROM存儲器里,即把溫度報警觸發字節存入非易失性存儲器里。如果總線控制器在這條命令之后跟著發出讀時間隙,而DS18B20又忙于把暫存器拷貝到E2存儲器,DS18B20就會輸出一個0,如果拷貝結束的話,DS18B20則輸出1。如果使用寄生電源,總線控制器必須在這條命令發出后立即啟動強上拉并保持10ms。

9、Convert T[44H]

這條命令啟動一次溫度轉換而無需其他數據。溫度轉換命令被執行,而后DS18B20保持等待狀態。如果總線控制器在這條命令之后跟著發出時間隙,而DS18B20又忙于做時間轉換的話,DS18B20將在總線上輸出0,若溫度轉換完成,則輸出1,。如果使用寄生電源,總線控制必須在發出這條命令后立即啟動強上拉,并保持500ms以上時間。

10、Recall E2

這條命令把報警觸發器里的值拷貝回暫存器。這種拷貝操作在DS18B20上電時自動執行,這樣器件一上電,暫存器里馬上就存在有效的數據了。若在這條命令發出之后發出讀數據隙,器件會輸出溫度轉換忙的標識:0為忙,1為完成。

11、Read Power Supply[0B4H]

ds18b20學習總結范文第3篇

2、 Match ROM[55H]

這個是匹配ROM命令,后跟64位ROM序列,讓總線控制器在多點總線上定位一只特定的DS18B20。只有和64位ROM序列完全匹配的DS18B20才能響應隨后的存儲器操作。所有和64位ROM序列不匹配的從機都將等待復位脈沖。這條命令在總線上有單個或多個器件時都可以使用。

3、Skip ROM[0CCH]

這條命令允許總線控制器不用提供64位ROM編碼就使用存儲器操作命令,在單點總線情況下,可以節省時間。如果總線上不止一個從機,在Skip ROM命令之后跟著發一條讀命令,由于多個從機同時傳送信號,總線上就會發生數據沖突(漏極開路下拉效果相當于相“與”)

4、Search ROM[0F0H]

當一個系統初次啟動時,總線控制器可能并不知道單線總線上有多個器件或它們的64位編碼,搜索ROM命令允許總線控制器用排除法識別總線上的所有從機的64位編碼。

5、Alarm Search[0ECH]

這條命令的流程和Search ROM相同。然而,只有在最近一次測溫后遇到符合報警條件的情況,DS18B20才會響應這條命令。報警條件定義為溫度高于TH或低于TL。只要DS18B20不掉電,報警狀態將一直保持,知道再一次測得的溫度值達不到報警條件。

6、Write Scratchpad[4EH]

這個命令向DS18B20的暫存器TH和TL中寫入數據??梢栽谌魏螘r刻發出復位命令來中止寫入。

7、Read Scratchpad[0BEH]

這個命令讀取暫存器的內容。讀取將從第1個字節開始,一直進行下去,直到第9(CRC)字節讀完。如果不想讀完所有字節,控制器可以在任何時間發出復位命令來中止讀取。

8、Copy Scratchpad[48H]

這個命令把暫存器的內容拷貝到DS18B20的E2ROM存儲器里,即把溫度報警觸發字節存入非易失性存儲器里。如果總線控制器在這條命令之后跟著發出讀時間隙,而DS18B20又忙于把暫存器拷貝到E2存儲器,DS18B20就會輸出一個0,如果拷貝結束的話,DS18B20則輸出1。如果使用寄生電源,總線控制器必須在這條命令發出后立即啟動強上拉并保持10ms。

9、Convert T[44H]

這條命令啟動一次溫度轉換而無需其他數據。溫度轉換命令被執行,而后DS18B20保持等待狀態。如果總線控制器在這條命令之后跟著發出時間隙,而DS18B20又忙于做時間轉換的話,DS18B20將在總線上輸出0,若溫度轉換完成,則輸出1,。如果使用寄生電源,總線控制必須在發出這條命令后立即啟動強上拉,并保持500ms以上時間。

10、Recall E2

這條命令把報警觸發器里的值拷貝回暫存器。這種拷貝操作在DS18B20上電時自動執行,這樣器件一上電,暫存器里馬上就存在有效的數據了。若在這條命令發出之后發出讀數據隙,器件會輸出溫度轉換忙的標識:0為忙,1為完成。

11、Read Power Supply[0B4H]

ds18b20學習總結范文第4篇

1.1 DS18B20簡介

DS18B20是美國DALLAS半導體公司生產的可組網數字式溫度傳感器. 主要由三個數據部件組成:64的激光ROM,溫度靈敏原件,非易失性溫度告警觸發器TH和TL。 封裝如圖一:

圖一 1.

2DS18B20的特點:

1. 獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現微處理器與DS18B20的雙向通訊。

2. DS18B20支持多點組網功能,多個DS18B20可以并聯在唯一的三線上,實現多點測溫。 3. DS18B20在使用中不需要任何外圍元件。

4. 測溫范圍-55℃~+125℃,固有測溫分辨率0.5℃。 5. 測量結果以9位數字量方式串行傳送。

內部結構框圖如圖二所示。

圖二

2.1 訪問溫度計的協議:

(一)初始化

(二)ROM操作命令

(三)存貯器操作命令

(四)處理/數據

由熱敏原件中晶振特性計算出所測的溫度。 注意:復位操作如下圖三

圖三 必需要給DS18B20輸入脈沖激活其復位功能。

DS18B20的驅動程序:

/*************************此部分為18B20的驅動程序*************************************/

#include #include sbit D18B20=P3^7; sbit error=P3^4; #define NOP() _nop_() /* 定義空指令 */ #define _Nop() _nop_() /*定義空指令*/ void TempDelay (unsigned char idata us); void Init18b20 (void); void WriteByte (unsigned char idata wr); //單字節寫入 void read_bytes (unsigned char idata j); unsigned char CRC (unsigned char j); void GemTemp (void); void Config18b20 (void); void ReadID (void); void TemperatuerResult(void); bit flag; unsigned int idata Temperature; unsigned char idata temp_buff[9]; //存儲讀取的字節,read scratchpad為9字節,read rom ID為8字節 unsigned char idata id_buff[8];

unsigned char idata crc_data; unsigned char code CrcTable [256]={ 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};

void GetTemp() {

if(TIM==100)

{ TIM=0;

TemperatuerResult();

每隔 1000ms 讀取溫度。

void TemperatuerResult(void) {

p = id_buff;

ReadID();

//先確定是第幾個DS18B20

Config18b20(); //配置DS18B20的報警溫度和分辨度

Init18b20 ();

//復位)

WriteByte(0xcc);

//skip rom

WriteByte(0x44);

//Temperature convert

Init18b20 ();

//復位)

WriteByte(0xcc);

//skip rom

WriteByte(0xbe);

//read Temperature

p = temp_buff;

GemTemp(); //讀取溫度

}

void GemTemp (void) {

read_bytes (9);

if (CRC(9)==0) //校驗正確

{

Temperature = temp_buff[1]*0x100 + temp_buff[0]; //

Temperature *= 0.0625;

Temperature /= 16;

TempDelay(1);

} } *Function:CRC校驗 *parameter: *Return: *Modify: *************************************************************/ unsigned char CRC (unsigned char j) {

unsigned char idata i,crc_data=0;

for(i=0;i

crc_data = CrcTable[crc_data^temp_buff[i]];

return (crc_data); }

/************************************************************ *Function:向18B20寫入一個字節 *parameter: *Return: *Modify:

void WriteByte (unsigned char idata wr) //單字節寫入 {

unsigned char idata i;

for (i=0;i<8;i++)

{

D18B20 = 0;

_nop_();

D18B20=wr&0x01;

TempDelay(3);

//delay 45 uS //

5 _nop_();

_nop_();

D18B20=1;

wr >>= 1;

} }

/************************************************************ *Function:讀18B20的一個字節 *parameter: *Return: *Modify: *************************************************************/ unsigned char ReadByte (void)

//讀取單字節

unsigned char idata i,u=0;

for(i=0;i<8;i++)

{

D18B20 = 0;

u >>= 1;

D18B20 = 1;

if(D18B20==1)

u |= 0x80;

TempDelay (2);

_nop_();

}

return(u); } /************************************************************ *Function:讀18B20 *parameter: *Return: *Modify: *************************************************************/ void read_bytes (unsigned char idata j) {

unsigned char idata i;

for(i=0;i

{

*p = ReadByte();

p++;

} } /************************************************************ *Function:延時處理 *parameter: *Return: *Modify: *************************************************************/ void TempDelay (unsigned char idata us) {

while(us--); } /************************************************************ *Function:18B20初始化 *parameter: *Return: *Modify: *************************************************************/ void Init18b20 (void) {

D18B20=1;

_nop_();

D18B20=0;

TempDelay(80);

//delay 530 uS//80

_nop_();

D18B20=1;

TempDelay(14);

//delay 100 uS//14

_nop_();

_nop_();

_nop_();

if(D18B20==0)

{flag = 1; error=0; }

//detect 1820 success!

else

{flag = 0; error=1; }

//detect 1820 fail!

TempDelay(20);

//20

_nop_();

_nop_();

D18B20 = 1; }

/************************************************************

向18B20寫入一個字節 *parameter: *Return: *Modify: *************************************************************/ void WriteByte (unsigned char idata wr) //單字節寫入 {

unsigned char idata i;

for (i=0;i<8;i++)

{

D18B20 = 0;

_nop_();

D18B20=wr&0x01;

TempDelay(3);

//delay 45 uS //5

_nop_();

_nop_();

D18B20=1;

wr >>= 1;

} }

/************************************************************

讀18B20的一個字節

*/ unsigned char ReadByte (void)

//讀取單字節 {

unsigned char idata i,u=0;

for(i=0;i<8;i++)

{

D18B20 = 0;

u >>= 1;

D18B20 = 1;

if(D18B20==1)

u |= 0x80;

TempDelay (2);

_nop_();

}

return(u); }

/************************************************************ 3.1.2

SPI數據線配置。

/*************************此部分為74HC595的驅動程序使用SPI總線連接*************************************/

#include #include

#define NOP()

_nop_()

/* 定義空指令 */ #define _Nop() _nop_()

/*?定義空指令*/ void HC595SendData(unsigned int SendVal);

//SPI IO sbit

MOSIO =P1^5; sbit

R_CLK =P1^6; sbit

S_CLK =P1^7; sbit

IN_PL =P3^4;

//74HC165 shift load

把數據加載到鎖存器中 sbit

IN_Dat=P3^5;

//74HC165 output

數據移出 sbit

OE

=P3^6;

/********************************************************************************************************* ** 函數名稱: HC595SendData ** 功能描述: 向SPI總線發送數據

*********************************************************************************************************/ void HC595SendData(unsigned int SendVal) {

unsigned char i;

for(i=0;i<16;i++)

{

if((SendVal<

else MOSIO=0;

S_CLK=0;

NOP();

NOP();

S_CLK=1;

}

R_CLK=0; //set dataline low

NOP();

NOP();

R_CLK=1; //片選

OE=0; }

3.1.

3試驗數碼管上顯示溫度

#include extern GetTemp();

//聲明引用外部函數 extern unsigned int idata Temperature;

// 聲明引用外部變量 void delay(unsigned int i);

sbit

LS138A=P2^2;

//管腳定義 sbit

LS138B=P2^3; sbit

LS138C=P2^4;

//此表為 LED 的字模, 共陰數碼管 0-9 -

unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned long LedOut[5],LedNumVal; void system_Ini() {

TMOD|= 0x11;

TH1 = 0xD8;

//10

TL1 = 0xF0;

IE = 0x8A;

TR1 = 1 main() { unsigned char i;

system_Ini();

while(1)

{

GetTemp();

/********以下將讀18b20的數據送到LED數碼管顯示*************/

LedNumVal=Temperature;

//把實際溫度送到LedNumVal變量中

LedOut[0]=Disp_Tab[LedNumVal%10000/1000];

LedOut[1]=Disp_Tab[LedNumVal%1000/100];

LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位

LedOut[3]=Disp_Tab[LedNumVal%10];

//個位

for(i=0; i<4; i++)

{

P0 = LedOut[i] ;

switch(i)

{

//138譯碼

case 0:LS138A=0; LS138B=0; LS138C=0; break;

case 1:LS138A=1; LS138B=0; LS138C=0; break;

case 2:LS138A=0; LS138B=1; LS138C=0; break;

case 3:LS138A=1; LS138B=1; LS138C=0; break;

}

delay(100);

}

P0 = 0;

} }

//延時程序

void delay(unsigned int i) {

char j;

for(i; i > 0; i--)

for(j = 200; j > 0; j--); } 4.1 討論DS18B20的自動報警功能實現。

DS18B20只是一個測溫元件,所謂的報警功能要通過程序由單片機來實現。

DS18B20溫度傳感器的內部存儲器包括一個高速暫存RAM和一個非易失性的可電擦除的EERAM。高速暫存RAM的結構為8字節的存儲器,頭2個字節包含測得的溫度信息,第3和第4字節TH(報警溫度上限)和TL(報警溫度下限)的拷貝。第5個字節,為配置寄存器,它的內容用于確定溫度值的數字轉換分辨率。第

6、

ds18b20學習總結范文第5篇

1.1 DS18B20簡介

DS18B20是美國DALLAS半導體公司生產的可組網數字式溫度傳感器. 主要由三個數據部件組成:64的激光ROM,溫度靈敏原件,非易失性溫度告警觸發器TH和TL。 封裝如圖一:

圖一 1.

2DS18B20的特點:

1. 獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現微處理器與DS18B20的雙向通訊。

2. DS18B20支持多點組網功能,多個DS18B20可以并聯在唯一的三線上,實現多點測溫。 3. DS18B20在使用中不需要任何外圍元件。

4. 測溫范圍-55℃~+125℃,固有測溫分辨率0.5℃。 5. 測量結果以9位數字量方式串行傳送。

內部結構框圖如圖二所示。

圖二

2.1 訪問溫度計的協議:

(一)初始化

(二)ROM操作命令

(三)存貯器操作命令

(四)處理/數據

由熱敏原件中晶振特性計算出所測的溫度。 注意:復位操作如下圖三

圖三 必需要給DS18B20輸入脈沖激活其復位功能。

DS18B20的驅動程序:

/*************************此部分為18B20的驅動程序*************************************/

#include #include sbit D18B20=P3^7; sbit error=P3^4; #define NOP() _nop_() /* 定義空指令 */ #define _Nop() _nop_() /*定義空指令*/ void TempDelay (unsigned char idata us); void Init18b20 (void); void WriteByte (unsigned char idata wr); //單字節寫入 void read_bytes (unsigned char idata j); unsigned char CRC (unsigned char j); void GemTemp (void); void Config18b20 (void); void ReadID (void); void TemperatuerResult(void); bit flag; unsigned int idata Temperature; unsigned char idata temp_buff[9]; //存儲讀取的字節,read scratchpad為9字節,read rom ID為8字節 unsigned char idata id_buff[8];

unsigned char idata crc_data; unsigned char code CrcTable [256]={ 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};

void GetTemp() {

if(TIM==100)

{ TIM=0;

TemperatuerResult();

每隔 1000ms 讀取溫度。

void TemperatuerResult(void) {

p = id_buff;

ReadID();

//先確定是第幾個DS18B20

Config18b20(); //配置DS18B20的報警溫度和分辨度

Init18b20 ();

//復位)

WriteByte(0xcc);

//skip rom

WriteByte(0x44);

//Temperature convert

Init18b20 ();

//復位)

WriteByte(0xcc);

//skip rom

WriteByte(0xbe);

//read Temperature

p = temp_buff;

GemTemp(); //讀取溫度

}

void GemTemp (void) {

read_bytes (9);

if (CRC(9)==0) //校驗正確

{

Temperature = temp_buff[1]*0x100 + temp_buff[0]; //

Temperature *= 0.0625;

Temperature /= 16;

TempDelay(1);

} } *Function:CRC校驗 *parameter: *Return: *Modify: *************************************************************/ unsigned char CRC (unsigned char j) {

unsigned char idata i,crc_data=0;

for(i=0;i

crc_data = CrcTable[crc_data^temp_buff[i]];

return (crc_data); }

/************************************************************ *Function:向18B20寫入一個字節 *parameter: *Return: *Modify:

void WriteByte (unsigned char idata wr) //單字節寫入 {

unsigned char idata i;

for (i=0;i<8;i++)

{

D18B20 = 0;

_nop_();

D18B20=wr&0x01;

TempDelay(3);

//delay 45 uS //

5 _nop_();

_nop_();

D18B20=1;

wr >>= 1;

} }

/************************************************************ *Function:讀18B20的一個字節 *parameter: *Return: *Modify: *************************************************************/ unsigned char ReadByte (void)

//讀取單字節

unsigned char idata i,u=0;

for(i=0;i<8;i++)

{

D18B20 = 0;

u >>= 1;

D18B20 = 1;

if(D18B20==1)

u |= 0x80;

TempDelay (2);

_nop_();

}

return(u); } /************************************************************ *Function:讀18B20 *parameter: *Return: *Modify: *************************************************************/ void read_bytes (unsigned char idata j) {

unsigned char idata i;

for(i=0;i

{

*p = ReadByte();

p++;

} } /************************************************************ *Function:延時處理 *parameter: *Return: *Modify: *************************************************************/ void TempDelay (unsigned char idata us) {

while(us--); } /************************************************************ *Function:18B20初始化 *parameter: *Return: *Modify: *************************************************************/ void Init18b20 (void) {

D18B20=1;

_nop_();

D18B20=0;

TempDelay(80);

//delay 530 uS//80

_nop_();

D18B20=1;

TempDelay(14);

//delay 100 uS//14

_nop_();

_nop_();

_nop_();

if(D18B20==0)

{flag = 1; error=0; }

//detect 1820 success!

else

{flag = 0; error=1; }

//detect 1820 fail!

TempDelay(20);

//20

_nop_();

_nop_();

D18B20 = 1; }

/************************************************************

向18B20寫入一個字節 *parameter: *Return: *Modify: *************************************************************/ void WriteByte (unsigned char idata wr) //單字節寫入 {

unsigned char idata i;

for (i=0;i<8;i++)

{

D18B20 = 0;

_nop_();

D18B20=wr&0x01;

TempDelay(3);

//delay 45 uS //5

_nop_();

_nop_();

D18B20=1;

wr >>= 1;

} }

/************************************************************

讀18B20的一個字節

*/ unsigned char ReadByte (void)

//讀取單字節 {

unsigned char idata i,u=0;

for(i=0;i<8;i++)

{

D18B20 = 0;

u >>= 1;

D18B20 = 1;

if(D18B20==1)

u |= 0x80;

TempDelay (2);

_nop_();

}

return(u); }

/************************************************************ 3.1.2

SPI數據線配置。

/*************************此部分為74HC595的驅動程序使用SPI總線連接*************************************/

#include #include

#define NOP()

_nop_()

/* 定義空指令 */ #define _Nop() _nop_()

/*?定義空指令*/ void HC595SendData(unsigned int SendVal);

//SPI IO sbit

MOSIO =P1^5; sbit

R_CLK =P1^6; sbit

S_CLK =P1^7; sbit

IN_PL =P3^4;

//74HC165 shift load

把數據加載到鎖存器中 sbit

IN_Dat=P3^5;

//74HC165 output

數據移出 sbit

OE

=P3^6;

/********************************************************************************************************* ** 函數名稱: HC595SendData ** 功能描述: 向SPI總線發送數據

*********************************************************************************************************/ void HC595SendData(unsigned int SendVal) {

unsigned char i;

for(i=0;i<16;i++)

{

if((SendVal<

else MOSIO=0;

S_CLK=0;

NOP();

NOP();

S_CLK=1;

}

R_CLK=0; //set dataline low

NOP();

NOP();

R_CLK=1; //片選

OE=0; }

3.1.

3試驗數碼管上顯示溫度

#include extern GetTemp();

//聲明引用外部函數 extern unsigned int idata Temperature;

// 聲明引用外部變量 void delay(unsigned int i);

sbit

LS138A=P2^2;

//管腳定義 sbit

LS138B=P2^3; sbit

LS138C=P2^4;

//此表為 LED 的字模, 共陰數碼管 0-9 -

unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned long LedOut[5],LedNumVal; void system_Ini() {

TMOD|= 0x11;

TH1 = 0xD8;

//10

TL1 = 0xF0;

IE = 0x8A;

TR1 = 1 main() { unsigned char i;

system_Ini();

while(1)

{

GetTemp();

/********以下將讀18b20的數據送到LED數碼管顯示*************/

LedNumVal=Temperature;

//把實際溫度送到LedNumVal變量中

LedOut[0]=Disp_Tab[LedNumVal%10000/1000];

LedOut[1]=Disp_Tab[LedNumVal%1000/100];

LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位

LedOut[3]=Disp_Tab[LedNumVal%10];

//個位

for(i=0; i<4; i++)

{

P0 = LedOut[i] ;

switch(i)

{

//138譯碼

case 0:LS138A=0; LS138B=0; LS138C=0; break;

case 1:LS138A=1; LS138B=0; LS138C=0; break;

case 2:LS138A=0; LS138B=1; LS138C=0; break;

case 3:LS138A=1; LS138B=1; LS138C=0; break;

}

delay(100);

}

P0 = 0;

} }

//延時程序

void delay(unsigned int i) {

char j;

for(i; i > 0; i--)

for(j = 200; j > 0; j--); } 4.1 討論DS18B20的自動報警功能實現。

DS18B20只是一個測溫元件,所謂的報警功能要通過程序由單片機來實現。

DS18B20溫度傳感器的內部存儲器包括一個高速暫存RAM和一個非易失性的可電擦除的EERAM。高速暫存RAM的結構為8字節的存儲器,頭2個字節包含測得的溫度信息,第3和第4字節TH(報警溫度上限)和TL(報警溫度下限)的拷貝。第5個字節,為配置寄存器,它的內容用于確定溫度值的數字轉換分辨率。第

6、

ds18b20學習總結范文第6篇

當選擇一個溫度傳感器的時候,將不再限制在模擬輸出或數字輸出裝置。與你系統需要相匹配的傳感器類型現在又很大的選擇空間。市場上供應的所有溫度感應器都是模擬輸出。熱電阻,RTDs和熱電偶是另一種輸出裝置,矽溫度感應器。在多數的應用中,這些模擬輸出裝置在有效輸出時需要一個比較器,ADC,或一個擴音器。因此,當更高技術的集成變成可能的時候,有數字接口的溫度傳感器變成現實。這些集成電路被以多種形式出售,從超過特定的溫度時才有信號簡單裝置,到那些報告遠的局部溫度提供警告的裝置?,F在不只是在模擬輸出和數字輸出傳感器之間選擇,還有那些應該與你的系統需要相匹配的更廣闊的感應器類型的選擇, 溫度傳感器的類型:

圖一:傳感器和集成電路制造商提供的四中溫度傳感器

在圖一中舉例說明四種溫度感應器類型。一個理想模擬傳感器提供一個完全線性的功能輸出電壓(A)。在傳感器(B)的數字I/O類中,溫度數據通常通過一個串行總線傳給微控制器。沿著相同的總線,數據由溫度傳感器傳到微控制器,通常設定溫度界限在引腳得數字輸出將下降的時候。當超過溫度界限的時候,報警中斷微控制器。這個類型的裝置也提供風扇控制。

模擬輸出溫度傳感器:

圖2 熱阻和矽溫度傳感器這兩個模擬輸出溫度探測器的比較。

熱電阻和矽溫度傳感器被廣泛地使用在模擬輸出溫度感應器上。圖2清楚地顯示當電壓和溫度之間為線性關系時,矽溫度傳感器比熱阻體好的多。在狹窄的溫度范圍之內,熱電阻能提供合理的線性和好的敏感特性。許多構成原始電路的熱電阻已經被矽溫度感應器代替。

矽溫度傳感器有不同的輸出刻度和組合。例如,與絕對溫度成比例的輸出轉換功能,還有其他與攝氏溫度和華氏溫度成比例。攝氏溫度部份提供一種組合以便溫度能被單端補給得傳感器檢測。

在最大多數的應用中,這些裝置的輸出被裝入一個比較器或A/D轉換器,把溫度數據轉換成一個數字格式。這些附加的裝置,熱電阻和矽溫度傳感器繼續被利用是由于在許多情況下它的成本低和使用方便。 數字I/O溫度傳感器: 大約在五年前,一種新類型溫度傳感器出現了。這種裝置包括一個允許與微控制器通信的數字接口。接口通常是12C或SMBus序列總線,但是其他的串行接口例如SPI是共用的。閱讀微控制器的溫度報告,接口也接受來自溫控制器的指令。那些指令通常是溫度極限,如果超過,將中斷微控制器的溫度傳感器集成電路上的數字信號。微控制器然后能夠調整風扇速度或減慢微處理器的速度,例如,保持溫度在控制之下。

圖3:設計的溫度傳感器可遙測處理器芯片上的p-n結溫度

圖4。溫度傳感器可檢測它自己的溫度和遙測四個p-n結溫度。

圖5。風扇控制器/溫度傳感器集成電路也可使用PWM或一個線性模式的控制方案。

在圖4中畫是一個類似的裝置:而不是檢測一個p-n結溫度,它檢測四個結和它的自己內部的溫度。因此內部溫度接近周圍溫度。周圍溫度的測量給出關于系統風扇是否正在適當地工作的指示。

在圖5中顯示,控制風扇是在遙測溫度時集成電路的主要功能。這個部分的使用能在風扇控制的二個不同的模式之間選擇。在PWM模式中,微處理控制風扇速度是通過改變送給風扇的信號周期者測量溫度一種功能。它允許電力消耗遠少于這個部分的線性模式控制所提供的。因為某些風扇在PWM信號控制它的頻率下發出一種聽得見的聲音,這種線性模式可能是有利的,但是需要較高功率的消耗和附加的電路。額外的功耗是整個系統功耗的一小部分。

當溫度超出指定界限的時候,這個集成電路提供中斷微控制器的警告信號。這個被叫做過熱溫度的信號形式里,安全特征也被提供。如果溫度升到一個危險級別的時候溫控制器或軟件鎖上,警告信號就不再有用。然而,溫度經由SMBus升高到一個水平,過熱在沒有微控制器被使用去控制電路。因此,在這個非邏輯控制器高溫中,過熱能被直接用去關閉這個系統電源,沒有為控制器和阻力潛在的災難性故障。

裝置的這個數字I/O普遍使用在服務器,電池組和硬盤磁碟機上。為了增加服務器的可靠性溫度在很多的位置中被檢測:在主板(本質上是在底盤內部的周圍溫度),在處理器鋼模之內,和在其它發熱元件例如圖形加速器和硬盤驅動器。出于安全原因電池組結合溫度傳感器和使其最優化已達到電池最大壽命。

檢測依靠中心馬達的速度和周圍溫度的硬盤驅動器的溫度有兩個號的理由:在驅動器中讀取錯誤增加溫度極限。而且硬盤的MTBF大大改善溫度控制。通過測量系統里面溫度,就能控制馬達速度將可靠性和性能最佳化。驅動器也能被關閉。在高端系統中,警告能為系統管理員指出溫度極限或數據可能丟失的狀況。

圖6。溫度超過某一界限的時候,集成電路信號能報警和進行簡單的ON/OFF風扇控制。

圖7.熱控制電路部分在絕對溫標形式下,頻率與被測溫度成比例的產生方波的溫度傳感器

圖8。這個溫度傳感器傳送它的周期與被測溫度成比例的方波,因為只發送溫度數據需要一條單一線,就需要單一光絕緣體隔離信道。

模擬正溫度感應器

“模擬正量”傳感器通常匹配比較簡單的測量應用軟件。這些集成電路產生邏輯輸出量來自被測溫度,而且區別于數字輸入/輸出傳感器。因為他們在一條單線上輸出數據,與串行總線相對。

在一個模擬正量傳感器的最簡單例子中,當特定的溫度被超過的時候,邏輯輸出出錯:其它,是當溫度降到一個溫度極限的時候。當其它傳感器有確定的極限的時候,這些傳感器中的一些允許使用電阻去校正溫度極限。

在圖6中,裝置顯示購買一個特定的內在溫度極限。這三個電路舉例說明這個類型裝置的使用:提供警告,關閉儀器,或打開風扇。

當需要讀實際溫度時,微控制器是可以利用的,在單線上傳送數據的傳感器可能是有用的。用微處理器的內部計數器,來自于這個類型溫度感應器的信號很容易地被轉換成溫度的測量。圖7傳感器輸出頻率與周圍溫度成比例的方波。在圖8中的裝置是相似的,但是方波周期是與周圍溫度成比例的。

圖9。用一條公共線與8個溫度傳感器連接的微控制器,而且從同一條線上接收每個傳感器傳送的溫度數據。

圖9,在這條公共線上允許連接達到八個溫度傳感器。當微控制器的I/O端口同時關閉這根線上的所有傳感器的時候,開始提取來自這些傳感器的溫度數據。微控制器很快地重新裝載接收來的每個傳感器的數據,在傳感器關閉期間,數據被編碼。在特定時間內每個傳感器對閘口脈沖之后的時間編碼。分配給每個感應器自己允許的時間范圍,這樣就避免沖突。

通過這個方法達到的準確性令人驚訝:0.8 是典型的室溫,正好與被傳送方波頻率的電路相匹配,同樣適用于方波周期的裝置。

這些裝置在有線電線應用中同樣顯著。舉例來說,當一個溫度傳感器被微控制器隔離的時候,成本被保持在一個最小量,因為只需要一個光絕緣體。這些傳感器在汽車制造HVAC應用中也是很有效,因為他們減少銅的損耗數量。 溫度傳感器的發展:

集成電路溫度傳感器提供各式各樣的功能和接口。同樣地這些裝置繼續發展,系統設計師將會看見更多特殊應用就像傳感器與系統接口連接的新方式一樣。最后,在相同的鋼模區域內集成更多的電子元件,芯片設計師的能力將確保溫度傳感器很快將會包括新的功能和特殊接口。

總結

通過這些天的查找資料,我了解了很多關于溫度傳感器方面的知識。我的大家都知道溫度的一些基本知識,溫度是一個基本的物理量,自然界中的一切過程無不與溫度密切相關。利用溫度所創造出來的傳感器即溫度傳感器是最早開發,應用最廣的一類傳感器。并且從資料中顯示溫度傳感器的市場份額大大超過了其他的傳感器。從17世紀初人們開始利用溫度進行測量。在半導體技術的支持下,在本世紀相繼開發了半導體熱電偶傳感器、PN結溫度傳感器和集成溫度傳感器。與之相應,根據波與物質的相互作用規律,相繼開發了聲學溫度傳感器、紅外傳感器和微波傳感器。

這些天,我通過許多的資料了解到兩種不同材質的導體,如在某點互相連接在一起,對這個連接點加熱,在它們不加熱的部位就會出現電位差。這個電位差的數值與不加熱部位測量點的溫度有關,和這兩種導體的材質有關。這種現象可以在很寬的溫度范圍內出現,如果精確測量這個電位差,再測出不加熱部位的環境溫度,就可以準確知道加熱點的溫度。由于它必須有兩種不同材質的導體,所以稱它為“熱電偶”。我查找的資料顯示數據:不同材質做出的熱電偶使用于不同的溫度范圍,它們的靈敏度也各不相同。熱電偶的靈敏度是指加熱點溫度變化1℃時,輸出電位差的變化量。對于大多數金屬材料支撐的熱電偶而言,這個數值大約在5~40微伏/℃之間。

熱電偶傳感器有自己的優點和缺陷,它靈敏度比較低,容易受到環境干擾信號的影響,也容易受到前置放大器溫度漂移的影響,因此不適合測量微小的溫度變化。由于熱電偶溫度傳感器的靈敏度與材料的粗細無關,用非常細的材料也能夠做成溫度傳感器。也由于制作熱電偶的金屬材料具有很好的延展性,這種細微的測溫元件有極高的響應速度,可以測量快速變化的過程。 溫度傳感器是五花八門的各種傳感器中最為常用的一種,現代的溫度傳感器外形非常得小,這樣更加讓它廣泛應用在生產實踐的各個領域中,也為我們的生活提供了無數的便利和功能。

溫度傳感器有四種主要類型:熱電偶、熱敏電阻、電阻溫度檢測器(RTD)和IC溫度傳感器。IC溫度傳感器又包括模擬輸出和數字輸出兩種類型。 接觸式溫度傳感器的檢測部分與被測對象有良好的接觸,又稱溫度計。 溫度計通過傳導或對流達到熱平衡,從而使溫度計的示值能直接表示被測對象的溫度。一般測量精度較高。在一定的測溫范圍內,溫度計也可測量物體內部的溫度分布。但對于運動體、小目標或熱容量很小的對象則會產生較大的測量誤差,常用的溫度計有雙金屬溫度計、玻璃液體溫度計、壓力式溫度計、電阻溫度計、熱敏電阻和溫差電偶等。它們廣泛應用于工業、農業、商業等部門。在日常生活中人們也常常使用這些溫度計。隨著低溫技術在國防工程、空間技術、冶金、電子、食品、醫藥和石油化工等部門的廣泛應用和超導技術的研究,測量120K以下溫度的低溫溫度計得到了發展,如低溫氣體溫度計、蒸汽壓溫度計、聲學溫度計、順磁鹽溫度計、量子溫度計、低溫熱電阻和低溫溫差電偶等。低溫溫度計要求感溫元件體積小、準確度高、復現性和穩定性好。利用多孔高硅氧玻璃滲碳燒結而成的滲碳玻璃熱電阻就是低溫溫度計的一種感溫元件,可用于測量1.6~300K范圍內的溫度。

非接觸式溫度傳感器的敏感元件與被測對象互不接觸,又稱非接觸式測溫儀表。這種儀表可以用來測量運動物體、小目標還有熱容量小或溫度變化迅速(瞬變)對象的表面溫度,也可以用于測量溫度場的溫度分布。資料顯示,最常用的非接觸式測溫儀表基于黑體輻射的基本定律,稱為輻射測溫儀表。輻射測溫法包括亮度法、輻射法和比色法。各類輻射測溫方法只能測出對應的光度溫度、輻射溫度或比色溫度。只有對黑體所測溫度才是真實溫度。如果想測定物體的真實溫度,就必須進行材料表面發射率的修正。而材料表面發射率不僅取絕于溫度和波長,而且還與表面狀態、涂膜和微觀組織等有關連,因此很難精確測量。在自動化生產中我發現往往需要利用輻射測溫法來測量或控制某些物體的表面溫度,如冶金中的鋼帶軋制溫度、軋輥溫度、鍛件溫度和各種熔融金屬在冶煉爐或坩堝中的溫度。在這些具體情況下,物體表面發射率的測量是相當困難的。對于固體表面溫度自動測量和控制,可以采用附加的反射鏡使與被測表面一起組成黑體空腔。附加輻射的影響能提高被測表面的有效輻射和有效發射系數。利用有效發射系數通過儀表對實測溫度進行相應的修正,最終可得到被測表面的真實溫度。最為典型的附加反射鏡是半球反射鏡。球中心附近被測表面的漫射輻射能受半球鏡反射回到表面而形成附加輻射,這樣才能提高有效發射系數。至于氣體和液體介質真實溫度的輻射測量,則可以用插入耐熱材料管至一定深度以形成黑體空腔的方法。通過計算求出與介質達到熱平衡后的圓筒空腔的有效發射系數。在自動測量和控制中就可以用此值對所測腔底溫度(即是介質溫度)進行修正而得到介質的真實溫度。 現在,我通過這些天的努力,了解了很多溫度傳感器及其相關的一些傳感器的知識。他們在我們生活中的應用及其廣泛,我們只有加緊的學習加緊的完成自己所學專業的知識,了解相關的最新信息,我們才能跟上科技前進的步伐。

參考文獻:

上一篇:增資擴股法律盡職調查范文下一篇:tialn涂層性能綜述范文

91尤物免费视频-97这里有精品视频-99久久婷婷国产综合亚洲-国产91精品老熟女泄火