0% found this document useful (0 votes)
93 views4 pages

Digital Thermometer

The document summarizes using a DS18B20 digital thermometer with a PIC16F877A microcontroller. The DS18B20 can measure temperatures from -55°C to +125°C with accuracy of ±0.5°C. It communicates over a 1-Wire bus using only one data line plus ground. The code example shows how to interface the DS18B20 with the PIC16F877A to read and display temperature measurements on an LCD screen every 500ms by issuing commands over the 1-Wire bus.

Uploaded by

dawadhali
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
93 views4 pages

Digital Thermometer

The document summarizes using a DS18B20 digital thermometer with a PIC16F877A microcontroller. The DS18B20 can measure temperatures from -55°C to +125°C with accuracy of ±0.5°C. It communicates over a 1-Wire bus using only one data line plus ground. The code example shows how to interface the DS18B20 with the PIC16F877A to read and display temperature measurements on an LCD screen every 500ms by issuing commands over the 1-Wire bus.

Uploaded by

dawadhali
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 4

DS18B20 with 16F877A (Thermometer)

POSTED BY LITTLE DJ AT 9:51 AM0 COMMENTS

Dallas 18B20

The DS18B20 digital thermometer provides 9-bit to 12-bit Celsius temperature


measurements and has an alarm function with nonvolatile user-programmable upper
and lower trigger points. The DS18B20 communicates over a 1-Wire bus that by
definition requires only one data line (and ground) for communication with a central
microprocessor. It has an operating temperature range of -55C to +125 and is accurate
to 0.5C over the range of -10C to +85C.
Here the thermometer (Dallas 18B20) senses the environment temperature and then
sends that value as a digital input with 16bit binary code to the microcontroller. It could
measure temperatures from -55C to +125C (-67F to +257F). Dallas 18B20 uses 1
wire bus system to communicate with the microcontroller. The 1-Wire bus system uses a
single bus master to control one or more slave devices. The DS18B20 is always a slave.
When there is only one slave on the bus, the system is referred to as a single-drop
system, the system is multi-drop if there are multiple slaves on the bus.
Circuit Diagram

MikroC Code
/******************************************************\

*
www.electronicworkspace.com
*
Electronics for Everyone
*
Date: 06/09/2011
*
LED Blink with 16F877A
\******************************************************/

*
*
*
*

// LCD module connections


sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
// Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
// 18S20: 9 (default setting; can be 9,10,11,or 12)
// 18B20: 12
const unsigned short TEMP_RESOLUTION = 12;
char *text = "000.0000";
unsigned temp;
void Display_Temperature(unsigned int temp2write) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;
// Check if temperature is negative
if (temp2write & 0x8000) {
text[0] = '-';
temp2write = ~temp2write + 1;
}
// Extract temp_whole
temp_whole = temp2write >> RES_SHIFT ;
// Convert temp_whole to characters
if (temp_whole/100)
text[0] = temp_whole/100 + 48;
else

text[0] = '0';
text[1] = (temp_whole/10)%10 + 48; // Extract tens digit
text[2] = temp_whole%10 + 48;
// Extract ones digit
// Extract temp_fraction and convert it to unsigned int
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;
// Convert temp_fraction to characters
text[4] = temp_fraction/1000 + 48; // Extract thousands digit
text[5] = (temp_fraction/100)%10 + 48;//Extract hundreds digit
text[6] = (temp_fraction/10)%10 + 48; / Extract tens digit
text[7] = temp_fraction%10 + 48; // Extract ones digit
// Print temperature on LCD
Lcd_Out(2, 5, text);
}
void main() {
ADCON1=0x06;
Lcd_Init();
// Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF);// Turn cursor off
Lcd_Out(1, 1, " Temperature: ");
// Print degree character, 'C' for Centigrades
Lcd_Chr(2,13,223);// Different LCD displays have different char code for degree
// If you see greek alpha letter try typing 178 instead of 223
Lcd_Chr(2,14,'C');
//Main loop
do {
//--- Perform temperature reading
Ow_Reset(&PORTE, 2);// Onewire reset signal
Ow_Write(&PORTE, 2, 0xCC);// Issue command SKIP_ROM
Ow_Write(&PORTE, 2, 0x44);// Issue command CONVERT_T
Delay_us(120);
Ow_Reset(&PORTE, 2);
Ow_Write(&PORTE, 2, 0xCC);// Issue command SKIP_ROM
Ow_Write(&PORTE, 2, 0xBE);// Issue command READ_SCRATCHPAD
temp = Ow_Read(&PORTE, 2);
temp = (Ow_Read(&PORTE, 2) << 8) + temp;
//--- Format and display result on Lcd

Display_Temperature(temp);
Delay_ms(500);
} while (1);
}

You might also like