Digital Thermometer Using 7-Segment Display

Also called temperature indicator. This temperature measuring project has a veriety of range from  -55 to +125 degree centigrade indicating on four common anode seven segment display module.The project measures an accurate temperature value point to point.
The main sensing part of the project is the semiconductor DS1820.It is based on one wire protocol device manufactured by Dallas semiconductor comes in different resolution such as DS18S20(9-bit resolution), DS18B20(12-bit resolution) etc.A microcontroller(AT89C2051) controls whole circuit function like receiving the serial data from DS1820 and converting the value for displying the seven segment module.

Here are the breadboard arrangements in different temperature value.

The firmware is written in C and compiled using “mikroC Pro for 8051“.

Download the source code.

/* DS18x20 Temperature indicator on 4×7-Segment display

   Writer : Sameer Gupta

   Date : July 2012

   MCU : AT89C2051, XL : 12MHz */

 

 sbit OW_Bit at P3_7_bit;     // OneWire pinout

 sbit dgt_4 at P3.B0;   // Control pins for the seven segments

 sbit dgt_3 at P3.B1;

 sbit dgt_2 at P3.B2;

 sbit dgt_1 at P3.B3;

 unsigned char SG=0;

 int Digit1,Digit2,Digit3,Digit4;

 char number[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0xFD};

 char Decimal[]={0x02,0x9E,0x24,0x0C,0x98,0x48,0x40,0x1E,0x00,0x08};

 

void MUX() org IVT_ADDR_ET0 // multiplexing using Timer0 overflow interrupt

{

    TL0=0x36; // load LSB & MSB values

    TH0=0xf6;

    P1=0xFF;

    dgt_1 = dgt_3 = dgt_2 = dgt_4 = 0;

    SG++;

    SG=SG%4;

    switch(SG){

        case 0: P1=number[Digit1];

                dgt_1 = 1;

                break;

        case 1: P1=Decimal[Digit2];

                dgt_2 = 1;

                break;

        case 2: P1=number[Digit3];

                dgt_3 = 1;

                break;

        case 3: P1=number[Digit4];

                dgt_4 = 1;

                break;

    }

}

 

const unsigned short TEMP_RESOLUTION = 12; //Replace ’12’ with ‘9’ if you are using DS18S20

 

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) {

    Digit4 = 10;   //Show negative sign

    temp2write = ~temp2write + 1;

  }

 

  // extract temp_whole

  temp_whole = temp2write >> RES_SHIFT ;

 

  // convert temp_whole to characters

  if (temp_whole/100)

     Digit4 = temp_whole/100;

  else

     Digit4 = 0;

 

  Digit3 = (temp_whole/10)%10;             // Extract tens digit

  Digit2 =  temp_whole%10;                 // 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

  Digit1 =  temp_fraction/1000;         // Extract thousands digit

}

 

void main() {

  TMOD=0x01;        // Intialize Timer 0

  TL0=0x36;         // Load Timer 0 for 2.5mS delay for multiplexing

  TH0=0xF6;

  IE=0x82;          // Here EA=1 & ET0=1

  TR0_bit=1;        // Start timer0

  //— main loop starts here

  do {

    //— perform temperature reading

    Ow_Reset();                                  // Onewire reset signal

    Ow_Write(0xCC);                              // Issue command SKIP_ROM

    Ow_Write(0x44);                              // Issue command CONVERT_T

    Delay_us(120);

    Ow_Reset();

    Ow_Write(0xCC);                              // Issue command SKIP_ROM

    Ow_Write(0xBE);                              // READING_SCRATCHPAD

    temp =  Ow_Read();

    temp = (Ow_Read() << 8) + temp;

    Display_Temperature(temp);

    Delay_ms(500);

  } while (1);

}      //End

Leave a Reply

Your email address will not be published. Required fields are marked *