BASIC Stamp, Microchip PIC, 8051, and Remote Control Projects

PicBasic Experiments With The PIC16F877

This application shows how to use the PIC16F877 to control, and interface with the Dallas DS1820 1-Wire™ Digital Thermometer.  If you missed the LCD connection schematic for these experiments, click HERE.


Figure 1: DS1820 1-Wire Digital Thermometer pin assignment..

This application shows how easy PicBasic makes it to communicate with smart peripherals such as the DS1820.  To accomplish the exact same thing we're doing in this experiment in assembly language is like the difference between night & day.  This is an excellent example of the pure simplicity of using PicBasic.  Not to mention the huge time savings you'll have since you aren't required to spend all day hand coding all the little details in assembly language.


Figure 2:  Schematic for this experiment.

As shown above in figure 2, the connections are extremely simple.  Just hook the center-pin of the DS1820 to Port C.0.  The 4.7K pull-up resistor, and the DS1820 1-Wire™ Digital Thermometer are all you need besides the PIC16F877 to complete the circuit for this experiment.

Here is the PicBasic code:


' Picbasic Pro program to read DS1820 1-wire temperature sensor
'  and display temperature on LCD

' Define LCD pins
Define  LCD_DREG        PORTD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTE
Define  LCD_RSBIT       0
Define  LCD_EREG        PORTE
Define  LCD_EBIT        1


' Allocate variables
command var     byte            ' Storage for command
i       var     byte            ' Storage for loop counter
temp    var     word            ' Storage for temperature
DQ      var     PORTC.0         ' Alias DS1820 data pin
DQ_DIR  var     TRISC.0         ' Alias DS1820 data direction pin


        ADCON1 = 7              ' Set PORTA and PORTE to digital

        Low PORTE.2             ' LCD R/W line low (W)
        Pause 100               ' Wait for LCD to start

        Lcdout $fe, 1, "Temp in degrees C"' Display sign-on message


' Mainloop to read the temperature and display on LCD
mainloop:
        Gosub init1820          ' Init the DS1820

        command = $cc           ' Issue Skip ROM command
        Gosub write1820

        command = $44           ' Start temperature conversion
        Gosub write1820

        Pause 2000      ' Wait 2 seconds for conversion to complete

        Gosub init1820          ' Do another init

        command = $cc           ' Issue Skip ROM command
        Gosub write1820

        command = $be           ' Read the temperature
        Gosub write1820
        Gosub read1820

       ' Display the decimal temperature
        Lcdout $fe, 1, dec (temp >> 1),".",dec(temp.0 * 5)," degrees C"

        Goto mainloop           ' Do it forever


' Initialize DS1820 and check for presence
init1820:
        Low DQ                  ' Set the data pin low to init
        Pauseus 500             ' Wait > 480us
        DQ_DIR = 1       ' Release data pin (set to input for high)

        Pauseus 100             ' Wait > 60us
        If DQ = 1 Then
                Lcdout $fe, 1, "DS1820 not present"
                Pause 500
                Goto mainloop   ' Try again
        Endif
        Pauseus 400             ' Wait for end of presence pulse
        Return


' Write "command" byte to the DS1820
write1820:
        For i = 1 to 8          ' 8 bits to a byte
                If command.0 = 0 Then
                        Gosub write0    ' Write a 0 bit
                Else
                        Gosub write1    ' Write a 1 bit
                Endif
                command = command >> 1  ' Shift to next bit
        Next i
        Return

' Write a 0 bit to the DS1820
write0:
        Low DQ
        Pauseus 60              ' Low for > 60us for 0
        DQ_DIR = 1         ' Release data pin (set to input for high)
        Return

' Write a 1 bit to the DS1820
write1:
        Low DQ                  ' Low for < 15us for 1
@       nop                     ' Delay 1us at 4MHz
        DQ_DIR = 1        ' Release data pin (set to input for high)
        Pauseus 60             ' Use up rest of time slot
        Return


' Read temperature from the DS1820
read1820:
        For i = 1 to 16         ' 16 bits to a word
                temp = temp >> 1        ' Shift down bits
                Gosub readbit   ' Get the bit to the top of temp
        Next i
        Return

' Read a bit from the DS1820
readbit:
        temp.15 = 1             ' Preset read bit to 1
        Low DQ                  ' Start the time slot
@       nop                     ' Delay 1us at 4MHz
        DQ_DIR = 1        ' Release data pin (set to input for high)
        If DQ = 0 Then
                temp.15 = 0     ' Set bit to 0
        Endif
        Pauseus 60              ' Wait out rest of time slot
        Return

        End

The DS1820 1-Wire Digital thermometer has a lot of extremely useful applications.  For more information, or to download the complete datasheet for the DS1820, visit the Dallas Semiconductor web site.  For your convenience, here is the link to the Dallas datasheet directory.  Click HERE for the datasheet....

Get PicBasic:

bullet

Click HERE to purchase PicBasic Compilers - and hardware.

bullet

Click HERE to learn more about the PicBasic compiler.

bullet

Click HERE to return to the PicBasic projects page.

Copyright © 1999-2008 Reynolds Electronics

| Contact Information |