الخطوات الأساسية للبرمجة باستخدام الحساس DS18B20 :
1- تخطى كود نوع الجهاز (الأمر $CC ) وإرسال أمر بداية تحويل درجة الحرارة (الأمر $44 ) وحفظ بيانات نتيجة التحويل فى سجل بحكم 2 بايت .
كود:
OWrite DQ,1,[$CC,$44] 'Sends the command for the calculation of temperature
2- استقبال (قراءة) بيانات نتيجة التحويل من الحساس والتأكد من إكتمال عملية النقل .
كود:
Repeat
DelayMS 25 ' Repeat until the transaction is expected to
ORead DQ,4, [C] ' going through the process PORTB.0 = 0
Until C <> 0 ' complete transaction
3- تخطى كود نوع الجهاز $CC وإرسال أمر التجهيز لقراءة قيمة درجة الحرارة (الأمر $BE) .
كود:
OWrite DQ, 1, [$CC, $BE]
'sending the command to read the temperature value from RAM
4- قراءة قيمة درجة الحرارة من الحساس فى شكل 2 بايت ، البايت الأدنى LowByte والبايت الأعلى HighByte.
كود:
ORead DQ,2,[TEMP.LowByte,TEMP.HighByte]
;temperature value read from the sensor , TEMP = 16 bits ,
;bit0 to bit3 for fraction ,bit4 t0 bit10 for integer , bit11 to bit15 for sign
5- مسح شاشة LCD وطباعة محتويات المتغير TEMP فى الشكل الثنائى :
ملاحظات :
1- الشكل التالى يبين شكل محتويات سجل درجة الحرارة والذى يتم نسخه إلى السجل TEMP :
2- والجدول التالى يبين بعض النتائج :
3- الأربع بتات من bit0 إلى البت bit3 تمثل جزء الكسر العشرى كما هو مبين أعلاه ، والسبع بتات التى تليها من البت bit4 إلى البت bit10 تمثل قيمة درجة الحرارة المئوية ، باقى البتات والمشار إليها بالحرف S للدلالة على كون درجة الحرارة موجبة (S=0) أو سالبة (S=1) .
4- لتجنب استخدام الكسور العشرية يتم حساب الجزء الكسرى : من البت bit 3(2-1 ) إلى البت
bit 0(2-4) بالشكل التالى :
كود:
Fraction=5000*TEMP.3 + 2500*TEMP.2 + 1250*TEMP.1 +625*TEMP.0
'Calculating portion after the comma
5- للحصول على قيمة درجة الحرارة يتم إزاحة محتويات المتغير TEMP إربع خانات جهة اليمين للتخلص من بتات جزء الكسر ، سواء بالقسمة على "16" أو استخدام معامل الإزاحة ">>4" .
6- نتيجة درجة الحرارة السالبة تكون فى شكل يسمى المكمل للعدد ويجب تحويله إلى العدد الأصلة كما سوف يتضح من الأمثلة التالية :
مثال 1 : درجة حرارة موجبة ولا تحتوى على كسر :
كود:
For +85 ( bit 15 = 0 )
Temp =0000 0101 0101 0000
Shift 4 bits :
Temp = Temp/16 = 0000 0000 0101 0101
Get the value :
Temp = $0055 = 85 decimal
مثال 2 : درجة حرارة سالبة ولا تحتوى على كسر :
كود:
For -55 (bit 15 = 1)
Temp = 1111 1100 1001 0000
Inverse :
Temp = ~Temp = 0000 0011 0110 1111
Add 1 :
TEMP = ~TEMP + 1 = 0000 0011 0111 1111
Shift 4 bits :
Temp = Temp/16 = 0000 0011 0111
Get the value :
TEMP value = TEMP.LowByte = 0011 0111= $37 = 55 decimal
مثال 3 : درجة حرارة موجبة تحتوى على كسر :
كود:
For +10.125 ( bit 15 =0 means positive ) : 00000000 10100010
a- Fraction bit0 to bit3 = 0010
= 1/2 * bit3 + 1/4 * bit2 + 1/8 * bit1 + 1/16 * bit0 = 1/8 = 0.125
b- Integer : 0000 1010 = $0A = 10 degree
c- Total = +10.125 degree
مثال 4 : درجة حرارة سالبة تحتوى على كسر :
كود:
For -10.125 ( bit 15 =1 means negative ): 1111 1111 0101 1110
a- Inverse : 0000 0000 1010 0001
b- Add 1 : : 0000 0000 1010 0010
c- Fraction bit0 to bit3 = 0010
= 1/2 * bit3 + 1/4 * bit2 + 1/8 * bit1 + 1/16 * bit0 = 1/8 = 0.125
d- Integer : 0000 1010 = $0A = 10 degree
e- Total = -10.125 degree
البرنامج الأول : مقياس درجة حرارة موجبة لا يحتوى على كسر