Introduction
The ds18S20/ds18B20 is one-wire precision digital temperature sensor. It implements only one data cable for command and data. The resolution of the ds18S20 is 9-bit while the ds18B20 is 12-bit higher resolution with floating point numbers.
![]() |
| A DS18B20 Sample from Ali Express |
To interface with this sensor the master MCU program commonly uses the high speed Assembly language due to its fast response and its one-by-one instruction executions. However the manufactures of this chip (DALLAS) provide some sample programs written in C for the 8051-base devices.
Today using the Arduino is very common and ease of use for most of electronic hobbyists and engineers. There a lot of libraries and demo programs using this sensors.
dsPIC30F2010 and ds18B20 Programming in MikroC
MikroC supports this one-wire digital temperature sensor for both the ds18S20 and the ds18B20. Unlike the Arduino libraries, using the MikroC One-Wire library, the master MCU need to process many steps such as writing command, reset, reading from scratch-pad, etc.
![]() |
| Schematic Diagram |
In this example, the dsPIC30F2010 read the temperature data from a connected ds18B20 and it will be displayed on a character LCD. Both LCD and the sensor can be connect to any pins of an MCU upon the programming settings.
![]() |
| Edit Project |
Timing is important for this one-wire sensor incorrect timing could cause command and data reading errors. The clock source is directly driven from an external 20MHz crystal oscillator without using Phase Lock Loop (PLL).
MikroC Source Code:
- // LCD module connections
- sbit LCD_RS at LATE0_bit;
- sbit LCD_EN at LATE1_bit;
- sbit LCD_D4 at LATE2_bit;
- sbit LCD_D5 at LATE3_bit;
- sbit LCD_D6 at LATE4_bit;
- sbit LCD_D7 at LATE5_bit;
- sbit LCD_RS_Direction at TRISE0_bit;
- sbit LCD_EN_Direction at TRISE1_bit;
- sbit LCD_D4_Direction at TRISE2_bit;
- sbit LCD_D5_Direction at TRISE3_bit;
- sbit LCD_D6_Direction at TRISE4_bit;
- sbit LCD_D7_Direction at TRISE5_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() {
- ADPCFG = 0xFFFF; // Configure AN pins as digital
- 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(&PORTC, 14); // Onewire reset signal
- Ow_Write(&PORTC, 14, 0xCC); // Issue command SKIP_ROM
- Ow_Write(&PORTC, 14, 0x44); // Issue command CONVERT_T
- Delay_us(120);
- Ow_Reset(&PORTC, 14);
- Ow_Write(&PORTC, 14, 0xCC); // Issue command SKIP_ROM
- Ow_Write(&PORTC, 14, 0xBE); // Issue command READ_SCRATCHPAD
- Delay_ms(400);
- temp = Ow_Read(&PORTC, 14);
- temp = (Ow_Read(&PORTC, 14) << 8) + temp;
- //--- Format and display result on Lcd
- Display_Temperature(temp);
- Delay_ms(500);
- } while (1);
- }
LCD and One-Wire libraries are not include in project by default. So we need select these two drivers.
![]() |
| Go to View -> Library Manager |
If we temperature reading program please check connection or set its correct resolutions - 9-bit for ds18S20 and 12-bit for ds18B20.
![]() |
| Program Testing on my DIY dsPIC30F2010 Prototype Board |















