Multi channel temperature detection and alarm system (DS18B20)

Overall layout

This temperature alarm system is specifically 3-way detection and alarm, 2-way display.
There are mainly four parts to form the single-chip microcomputer part, display part, led alarm part, sensor part

MCU and LED alarm part

The clock frequency of 80c51 is 12MHz

The following is the specific configuration

Sensor ds18b20 part


The following is the specific configuration


Display LM016L part


The following is the specific configuration

Code part

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^4;
sbit RW=P2^1;
sbit EN=P2^2;
sbit DQ=P3^2; 

sbit LED1=P1^0;
sbit LED2=P1^3;
sbit LED3=P1^7;

uchar code str1[]={0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e};
uchar code str2[]={0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9};
uchar code str3[]={0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0};
uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};        
uchar data disdata[5];

uint tvalue;//Temperature data storage
uchar tflag;//Temperature sign bit
uint high=600;//Highest temperature
uint low=100;//Cryogenic temperature

/*************************lcd1602 Initialization**************************/
void delay1ms(uint ms)//1ms delay
{  uint i,j;
   for(i=0;i<ms;i++)
    for(j=0;j<100;j++);
}

void wr_com(uchar com)  //Write instruction to LCD1602
{ delay1ms(1);
   RS=0;//instructions
   RW=0;//Write in
   EN=0;//
   P0=com;
   delay1ms(1);
   EN=1;//allow
   delay1ms(1);
   EN=0;
}

void wr_dat(uchar dat)//Write data to LCD1602
{ delay1ms(1);;
   RS=1;//data
   RW=0;//Write in
   EN=0;
   P0=dat;
   delay1ms(1);
   EN=1;//allow
   delay1ms(1);
   EN=0;
}

void wr_new()                   //Set display position
{
        uchar i;
        wr_com(0x40);
        for(i=0;i<8;i++)
        {
                wr_dat(table[ i]);
        }
}

void lcd_init()//Display string function
{        delay1ms(15);
        wr_com(0x38);delay1ms(5);
        wr_com(0x08);delay1ms(5);
        wr_com(0x01);delay1ms(5);
         wr_com(0x06);delay1ms(5);
        wr_com(0x0c);delay1ms(5);
        wr_new();
        wr_com(0x80);
    wr_dat('A');
        wr_com(0x81);
    wr_dat(':');
          wr_com(0x89);
    wr_dat(0x00);
        wr_com(0x8a);
    wr_dat('C');
        wr_com(0xc9);
    wr_dat(0x00);                       
        wr_com(0xca);
    wr_dat('C');
        wr_com(0xc0);
    wr_dat('B');
        wr_com(0xc1);
    wr_dat(':');
}

/******************************ds18b20 Part**************************************/
void delay_18B20(uint i)//Delay Functions
{
   while(i--);
}

void ds1820rst()/ds18b20
{   uchar x=0;
        DQ = 1;          //DQ pull up
        delay_18B20(4); //Delay 20us
        DQ = 0;          //DQ pull down
        delay_18B20(100); //Delay 480us
        DQ = 1;          //pull up
        delay_18B20(40);delayed200us
}

uchar ds1820rd()//data fetch
{ uchar i=0;
  uchar dat = 0;
  for (i=0;i<8;i++)
        {   DQ = 0; //Pull down
    dat>>=1;
    DQ = 1; //pull up
    if(DQ)
    dat|=0x80;
    delay_18B20(10);
        }
   return(dat);
}

void ds1820wr(uchar dat)//Write data
{         uchar i=0;
    for (i=0; i<8; i++)
                   { DQ = 0;
              DQ = dat&0x01;
              delay_18B20(10);
              DQ = 1;
              dat>>=1;
                   }
}

void b20_Matchrom(uchar a)         //Match 3 ROM s respectively
{
        char j;
        ds1820wr(0x55);           //Send matching ROM sequence
        if(a==1)
        {
        for(j=0;j<8;j++)
                ds1820wr(str1[j]);                //Send 18B20 serial number, send low byte first
        }
        if(a==2)
        {
        for(j=0;j<8;j++)
                ds1820wr(str2[j]);                //Send 18B20 serial number, send low byte first
        }
        if(a==3)
        {
        for(j=0;j<8;j++)
                ds1820wr(str3[j]);                //Send 18B20 serial number, send low byte first
        }
}

read_temp(uchar z)/*Temperature reading and conversion*/
{        uchar a,b;
        float tt;
        ds1820rst();   
        ds1820wr(0xcc);                        //Skip serial number read
        ds1820rst();
        if(z==1)
        {
                b20_Matchrom(1);                 //Match ROM 1
        }
        if(z==2)
        {
                b20_Matchrom(2);                 //Match ROM 2
        }
				        if(z==3)
        {
                b20_Matchrom(3);                 //Match ROM 3
        }
        ds1820wr(0x44);//Start temperature conversion
        delay1ms(5);
        ds1820rst();   
        ds1820wr(0xcc);                                //Skip temperature reading
        ds1820rst();
        if(z==1)
        {
                b20_Matchrom(1);                            //Match ROM 1
        }
        if(z==2)
        {
                b20_Matchrom(2);                              //Match ROM 2
        }
			        if(z==3)
        {
                b20_Matchrom(3);                             //Match ROM 3
        }	
        ds1820wr(0xbe);//Read temperature
        a=ds1820rd();
        b=ds1820rd();
        tvalue=b;
        tvalue<<=8;
        tvalue=tvalue|a;
    if(tvalue<0x0fff)
    tflag=0;
    else
                   {        tvalue=~tvalue+1;
                tflag=1;
                 }
        tt=tvalue*0.0625;
        tvalue=tt*10;
        return(tvalue);
}


/*****************Display function******************************/
void ds1820disp(uchar z)//Temperature display
{    uchar flagdat;
     disdata[0]=tvalue/1000+0x30;//Display 100 bit
     disdata[1]=tvalue%1000/100+0x30;//Display ten bits
     disdata[2]=tvalue%100/10+0x30;//Display bit
     disdata[3]=tvalue%10+0x30;//Display decimal places
   
     if(tflag==0)
     flagdat=0x20;//Sign bit is positive
     else
       flagdat=0x2d;//Sign bit is negative

     if(disdata[0]==0x30)
    {disdata[0]=0x20;//If the hundred bit is 0, it will not be displayed
   if(disdata[1]==0x30)
    {disdata[1]=0x20;//If the tens are not 0, they will not be displayed
    }
   }
  if(z==1)
    {
    wr_com(0x82);
    wr_dat(flagdat);//Sign bit
    wr_com(0x83);
    wr_dat(disdata[0]);//Hundred digit number
    wr_com(0x84);
    wr_dat(disdata[1]);//Ten digit number
    wr_com(0x85);
    wr_dat(disdata[2]);//Single digit
    wr_com(0x86);
    wr_dat(0x2e);//Decimal point
    wr_com(0x87);
    wr_dat(disdata[3]);//Decimal place
   }
  if(z==2)
    {
    wr_com(0xc2);
    wr_dat(flagdat);//·Sign bit
    wr_com(0xc3);
    wr_dat(disdata[0]);//Hundred digit number
    wr_com(0xc4);
    wr_dat(disdata[1]);//Ten digit number
    wr_com(0xc5);
    wr_dat(disdata[2]);//Single digit
    wr_com(0xc6);
    wr_dat(0x2e);//Decimal point
    wr_com(0xc7);
    wr_dat(disdata[3]);//Decimal place
   }
}

void alarm(uchar z)//Alarm function
{
	if(z==1)
	{
		if(tvalue>high|tvalue<low)
			LED1=1;
		else
			LED1=0;
	}
	if(z==2)
	{
		if(tvalue>high|tvalue<low)
			LED2=1;
		else
			LED2=0;
	}
	if(z==3)
	{
		if(tvalue>high|tvalue<low)
			LED3=1;
		else
			LED3=0;
	}
}



/********************Main function***********************************/
void main()
{
        lcd_init();//LCD1602
    while(1)
    {
                 read_temp(1);//Read data
                 ds1820disp(1);//Display data
				alarm(1);	//Temperature detection
                read_temp(2);//Read data
                ds1820disp(2);//Display data
								alarm(2);	
								read_temp(3);//Read data
								alarm(3);	

  }
}
//-----------------------------------------------

Please refer to the data manual for the reason of delay setting
Baidu can get

The author is a beginner. If you have any mistakes, please correct them.

This article is the author's original

Published 2 original articles, won 1 praise and 400 visitors
Private letter follow

Posted by Warzone RTS on Tue, 21 Jan 2020 07:56:23 -0800