PIC Basic DS1820 digital thermometer with 16F877
เซนเซอร์ตรวจจับอุณหภูมิ DS1820 เป็น IC แบบดิจิตอล สามารถวัดอุณภูมิในช่วง -55°C ถึง 125°C มีความคลาดเคลื่อนต่ำสุด ±0.5°C เมื่อใช้งานอยู่ที่ -10°C ถึง 85°C ใช้สายเพียงเส้นเดียวในการส่งข้อมูล
FEATURES
- Unique 1-Wire® Interface Requires Only One Port Pin for Communication
- Each Device has a Unique 64-Bit Serial Code Stored in an On-Board ROM
- Multidrop Capability Simplifies Distributed Temperature-Sensing Applications
- Requires No External Components
- Can Be Powered from Data Line; Power Supply Range is 3.0V to 5.5V
- Measures Temperatures from -55°C to +125°C (-67°F to +257°F)
- ±0.5°C Accuracy from -10°C to +85°C
- Thermometer Resolution is User Selectable from 9 to 12 Bits
- Converts Temperature Integrated Digital Word in 750ms (Max)
ตัวอย่างโปรแกรมอ่านค่าจาก DS1820 ที่อ่านเฉพาะค่า + เท่านั้นถ้าจะอ่านค่า – ต้องนำมาทำ 2’s complement
‘****************************************************************
‘* Name : DS1820-TEMP.BAS
‘* Author : HS3UKA
‘* Notice : Copyright (c) 2013
‘* : All Rights Reserved
‘* Date : 1/2/2013
‘* Version : 1.0
‘* Notes : http://www.hs3uka.com
‘****************************************************************
include “modedefs.bas”
define OSC 10
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 1DQ VAR PORTA.0 ‘ One-wire data pin
temperature VAR WORD ‘ Temperature storage
count_remain VAR BYTE ‘ Count remaining
count_per_c VAR BYTE ‘ Count per degree CADCON1 = 7 ‘ Set PORTA and PORTE to digital
mainloop:
OWOut DQ, 1, [$CC, $44] ‘ Start temperature conversionwaitloop:
OWIn DQ, 4, [count_remain] ‘ Check for still busy converting
If count_remain = 0 Then
Lcdout $fe, 1, “No DS1820”
Pause 100
goto waitloop
else
goto LCD
endifLCD:
OWOut DQ, 1, [$CC, $BE] ‘ Read the temperature
OWIn DQ, 0, [temperature.LOWBYTE, temperature.HIGHBYTE, Skip 4, count_remain, count_per_c]‘ Calculate temperature in degrees C to 2 decimal places (not valid for negative temperature)
temperature = (((temperature >> 1) * 100) – 25) + (((count_per_c – count_remain) * 100) / count_per_c)
Lcdout $fe, 1, DEC (temperature / 100), “.”, DEC2 temperature, ” C”‘ Calculate temperature in degrees F to 2 decimal places (not valid for negative temperature)
temperature = (temperature */ 461) + 3200
Lcdout $fe, $c0, DEC (temperature / 100), “.”, DEC2 temperature, ” F”Pause 1000 ‘ Display about once a second
Goto mainloop ‘ Do it foreverEnd
(เซนเซอร์ในโปรแกรม simulator มีปัญหาจะได้ค่าเพี้ยน แต่ถ้านำมาต่อจริงจะไม่มีปัญหา)