Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Temperature measurement using pic 16f877a and DS18S20

Status
Not open for further replies.

rubaan

Newbie level 2
Joined
Oct 22, 2013
Messages
2
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
14
I am using DS18S20 sensor and pic 16f877a for temperature measurement. I have c code that's for only one sensor. That works OK.
now i want to add four more sensors (same type) to get temperature reading from different points. Anyone could help me please? This is the code for only one sensor.

Code:
#include<stdio.h>
#include<pic.h>
#include "delay.c" __CONFIG(0x3f72);
#define DQ         RC0
#define DQ_DIR     TRISC0
#define FOSC       10000
#define BAUD_RATE  9.6      // 9600 Baudrate
#define BAUD_VAL   (char)(FOSC/ (16 * BAUD_RATE )) - 1;     
// Calculation For 9600 Baudrate @10Mhz
unsigned char i=0;
float Temerature=0;
void ds1820_init();
void Reset(void);
void write(unsigned char);
unsigned char Read(void);
void Serial_init();
void main()
{
   unsigned char Temp[9];
   DelayMs(100);
   Serial_init();
   ds1820_init();
   DelayMs(100);
   printf("\033[2J");   // Clear the Hyper terminal;
   while(1)
   {
      Reset();
      write(0xcc);
      write(0x44);
      DQ_DIR    = 1;
      DelayUs(10);
      while(!DQ);
  // this will be raised after finishing conversion
      Reset();
      write(0xcc);
      write(0xbe); 
      for(i=0;i<9;i++)
      Temp[i] = Read();      // Read 9 bytes 
      for(i=0;i<9;i++)
      printf("%d ",Temp[i]);    
      printf("Temperature:%3.1f%cC",(float)Temp[0]/2,0xf8);
      printf("\r");
      DelayMs(250);
      DelayMs(250);
      DelayMs(250);
      DelayMs(250);
   }
}
 
void ds1820_init()
{
      DQ    = 1;
      DQ_DIR = 1;         // pull up
}
 
void Reset(void)
{
      DQ_DIR    = 0;
      DQ     = 0;
      DelayMs(1);
      DelayUs(250);      // 500us
      DQ_DIR    = 1;
      DelayUs(100);      // 40us
      while(DQ==1);      // wait until presence pulse
      DelayMs(1);
      DelayUs(250);      // 500us
}
 
void write(unsigned char cmd)
{
      for(i=0;i<8;i++){
      DQ_DIR   = 0;                // pull down
      DQ     = 0;
      DelayUs(25);                 // 10us
      DQ       = (cmd & 0x01)?1:0; // Send bit
      cmd      = cmd >> 1;
      DelayUs(120);                // >45us
      DQ_DIR   = 1;                // release
      }     
}
 
unsigned char Read(void)
{
      unsigned char temp=0,RecDat=0;
      for(i=0;i<8;i++)
      {
         DQ_DIR   = 0;
         DQ     = 0;        // pull down
    DelayUs(25);       // 10us
    DQ_DIR   = 1;      // release
        DelayUs(25);       // 10us
        temp   = DQ;       // read bit
        temp   = temp<<i;
       RecDat |= temp;
        DelayUs(70);       // 30us
      }
      return RecDat;     
}
void Serial_init()
{
      TRISC=0xc0;        // RC7,RC6 set to usart mode(INPUT)
      TXSTA=0x24;        // Transmit Enable
      SPBRG=BAUD_VAL;    // 9600 baud at 10Mhz
      RCSTA=0x90;  // USART Enable, Continuous receive enable
      TXIF=1;            // Start Transmit
}
 
void putch(unsigned char Data) // data TX required for printf
{
         while(TXIF==0);
         TXREG = Data;
}
 
Last edited by a moderator:

nick703

Advanced Member level 1
Joined
Oct 17, 2011
Messages
414
Helped
21
Reputation
44
Reaction score
22
Trophy points
1,298
Location
surat
Activity points
3,872
if u have any circuit di
agram or Proteus file then post.

and by the way if your program is working then try to same configuration using different pin of microcontroller and write code after post query if any..
 

wp100

Advanced Member level 5
Joined
May 15, 2009
Messages
3,056
Helped
883
Reputation
1,781
Reaction score
736
Trophy points
113
Location
Prime Meridian
Activity points
0
Hi,

You can use multiple sensors in two ways, either each sensor on its own input port or all the sensors on one input port; hence those sensors being called 'one wire'

However to use all the sensors on one wire you need to individually address each sensor which complicates the code a bit more.

Also be aware that the DS18S20 while not obselete is considered an old part and the new DS18B20 is prefered for new designs
 

betwixt

Super Moderator
Staff member
Joined
Jul 4, 2009
Messages
15,270
Helped
4,970
Reputation
9,962
Reaction score
4,799
Trophy points
1,393
Location
Aberdyfi, West Wales, UK
Activity points
129,630
Just modify the code so the 'skip ROM' command is changed to 'Match ROM' and supply it with the address of the sensor you want to use. You can wire several sensors in parallel and only the one with matching address will reply.

Brian.
 

rubaan

Newbie level 2
Joined
Oct 22, 2013
Messages
2
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
14
hi wp100,
Do you have any sample code for that
 

cagrikrdnz

Newbie level 3
Joined
Jun 20, 2014
Messages
3
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
19
However to use all the sensors on one wire you need to individually address each sensor which complicates the code a bit more.

Also be aware that the DS18S20 while not obselete is considered an old part and the new DS18B20 is prefered for new designs
Thanks a lot. First, does this code works for DS18B20. Then, does the same procedure you mentioned is ok for DS18B20 ?
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top