如果到現在還在利用AD590做溫度感測,那可就落伍了,現在有結合半導體溫度感測器,運算放大器電路和AD轉換電路成一顆晶片,只有三隻接腳,外觀就如同一顆電晶體,可將溫度直接轉換成12位元的數位值,量測範圍從+125度到-55度,最高解析度可達0.0652度,相關基本資料如下圖所示。

如果要參考詳細資料請自行下載資料手冊。(另有一顆功能相近,解析度較低的DS1820簡體中文版使用手冊,亦可自行下載參考)

由於此顆晶片只有三隻腳,扣掉電源線,只剩一隻接腳可用來做資料傳輸線,透過這隻腳,可將控制命令寫入DS18B20,也透過它把溫度讀出來,這是如何辦到的?

首先由其接線方式說起,此晶片與單晶片連接的方式有以上2種,圖4的接法連電源線都省了,但控制時需考慮的條件較多,因此通常會使用圖5的接法,利用一個4.7k歐姆的電阻將資料線提升至高電位。

當CPU要與DS18B20溝通時,先輸出0,將此接線電壓拉至0V,持續至少480 us,再將輸出訊號轉為1。DS18B20感應到此起始訊號後,也會產生持續60~240 us的低電壓做回應,CPU只要從有無此回應訊號,就知道DS18B20有沒有接上。

依照圖13之初始規劃之時序,可先寫一簡單程式做練習,偵測DS18B20是否存在

DQ     EQU      P3.3        ;DS18B20資料線


       CLR      DQ
       MOV      R5,#50		;持續 500 us,起始訊號
       CALL     DELAY10
       SETB     DQ
       MOV      R5,#8		;持續 80 us,等待DS18B20回應
       CALL     DELAY10

       JNB      DQ,OK_18B20
       MOV      P2,#55H	    ;DS18B20不存在時,P2顯示01010101
       JMP      $
OK_18B20:

       MOV      P2,#0FH		;DS18B20存在時,P2顯示00001111
       JMP      $


DELAY10:	;延遲時間 = R5 * 10 us,此時間算法是以笙泉之82G516為準
       MOV      R7,#30
       DJNZ     R7,$
       DJNZ     R5,DELAY10
       RET
 

DS18B20規定要先初始規劃才可以對它下後續之命令,如果確定DS18B20是接好了,可直接寫成以下副程式即可。

INIT_18B20:             ;喚醒DS18B20
       CLR      DQ
       MOV      R5,#50		;持續 500 us,起始訊號
       CALL     DELAY10
       SETB     DQ
       MOV      R5,#50		;持續 500 us,等待DS18B20回應結束
       CALL     DELAY10
       RET

 

對DS18B20初始規劃完畢後,便可開始對它下命令,問題是如何將0或1寫入此顆晶片?圖11上方波形為0與1之寫入時序,如果要寫入0,只要CPU輸出0,維持約60us就可以了,如果要寫入1,則CPU要先輸出0,在15us內,將此接腳提升至1,整個動作也是要維持超過60us。

以下副程式已經調整成可寫入一個位元組,將要寫到DS18B20的資料先放在累加器A,透過右旋將低位元傳至C,再將C的資料傳給DS18B20的DQ,如果C=0,則DQ就維持著0,如果C=1,則DQ維持著1,再透過迴圈,如此便可連續將8位元資料寫入DS18B20。

WR_BYTE:          ;寫入一位元組訊號

       MOV     R6,#8
WR_1BIT:
       RRC     A
       CLR     DQ
       MOV     R7,#45      ;持續至多15 us,起始訊號,此時間算法是以笙泉之82G516為準
       DJNZ    R7,$
       MOV     DQ,C        ;將要寫入DS18B20的資料送出
       MOV     R7,#60      ;持續20 us,等待ds18b20讀取
       DJNZ    R7,$
       SETB    DQ
       MOV     R7,#100     ;持續35 us,等待ds18b20回復
       DJNZ    R7,$
       DJNZ    R6,WR_1BIT

       RET
 

圖11下方波形為0與1之讀取時序,CPU要讀取DS18B20時,須先將此腳先拉至0,然後馬上回復至1,再來偵測這支接腳,如果DS18B20輸出為1,它會在15微秒內將此腳提升至1,如果DS18B20輸出為0,它會將此接腳維持著0,因此CPU在約15微秒時,便可讀取DS18B20的輸出值。整個動作也是要維持約60us。

RD_BYTE:           ;讀取一位元組訊號
       MOV     R6,#8
RD_1BIT:
       CLR     DQ
       MOV     R7,#2	;起始訊號,持續 2 us
       DJNZ    R7,$
       SETB    DQ
       MOV     R7,#30	;等待 10 us後再讀訊號訊號
       DJNZ    R7,$
       MOV     C,DQ    ;從DQ接腳讀回DS18B20送出之訊號
       RRC     A
       MOV     R7,#150	;持續50 us,等待ds18b20回復
       DJNZ    R7,$
       DJNZ    R6,RD_1BIT
       RET
 

 

有辦法對DS18B20讀取或寫入1位元組的訊號後,該對它下什麼命令呢?

 

 

 

DS18B20範例(使用時請將JP1上方2隻接腳短路)

在七段顯示器上顯示:範例(ASM)

在16x2 LCD上顯示:範例(ASM) 範例(C)