最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

DS18B20单总线多点式测温系统

来源:动视网 责编:小OO 时间:2025-09-24 08:44:04
文档

DS18B20单总线多点式测温系统

DS18B20单总线多点式测温系统1(2011-01-1519:53:40)转载标签:ds18b20多点测量分类:DS18B20主文件:#include#includeunsigned intshu[]={0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x39};unsignedlongt; voidflcd_1602()          //当为负温度时,液晶显示可以高位为0屏蔽. {   init(0x80);write_data(0x4e);
推荐度:
导读DS18B20单总线多点式测温系统1(2011-01-1519:53:40)转载标签:ds18b20多点测量分类:DS18B20主文件:#include#includeunsigned intshu[]={0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x39};unsignedlongt; voidflcd_1602()          //当为负温度时,液晶显示可以高位为0屏蔽. {   init(0x80);write_data(0x4e);
DS18B20单总线多点式测温系统1

(2011-01-15 19:53:40) 

转载

标签: 

ds18b20

多点测量分类: DS18B20 

主文件:

#include

#include

unsigned  int shu[]={0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x39};

unsigned long t;

  void flcd_1602()           //当为负温度时,液晶显示可以高位为0屏蔽.

 {  

   init(0x80);write_data(0x4e);//NO 

   init(0x81);write_data(0x4f);

   init(0x82);write_data(0x80);

  

   init(0x85);write_data(0x74);//temperature

   init(0x86);write_data(0x65);

   init(0x87);write_data(0x6d); 

   init(0x88);write_data(0x70); 

   init(0x);write_data(0x65); 

   init(0x8a);write_data(0x72);

   init(0x8b);write_data(0x61); 

   init(0x8c);write_data(0x74); 

   init(0x8d);write_data(0x75); 

   init(0x8e);write_data(0x72);

   init(0x8f);write_data(0x65);

 

    init(0xc0);write_data(0x80);

   init(0xc1);write_data(0x80);

   init(0xc2);write_data(0x69); //is:

   init(0xc3);write_data(0x73); 

   init(0xc4);write_data(0x3a);

 

  if((t/1000)!=0)

 {init(0xc5);write_data(0x2d); 

     init(0xc6);write_data(shu[t/1000]);

  init(0xc7);write_data(shu[t/100]); 

 }

 else

 {init(0xc5);write_data(0xfe); 

     init(0xc6);write_data(0x2d);

  init(0xc7);write_data(shu[t/100]); 

 }

 init(0xc8);write_data(0x2e);

    init(0xc9);write_data(shu[(t0)/10]);

 init(0xca);write_data(shu[t]);

 init(0xcb);write_data(0x27);

 init(0xcc);write_data(0x43);

 init(0xcd);write_data(0x80);

 init(0xce);write_data(0x80);

 init(0xcf);write_data(0x80);

 }

 void lcd_1602()              //当为正温度时,液晶显示可以高位为0屏蔽.

 {   init(0x80);write_data(0x4e);//NO 

   init(0x81);write_data(0x4f);

   init(0x82);write_data(0x80);

   init(0x84);write_data(0x80);

   init(0x85);write_data(0x74); //temperature

   init(0x86);write_data(0x65); 

   init(0x87);write_data(0x6d); 

   init(0x88);write_data(0x70); 

   init(0x);write_data(0x65);

   init(0x8a);write_data(0x72); 

   init(0x8b);write_data(0x61); 

   init(0x8c);write_data(0x74); 

   init(0x8d);write_data(0x75);

   init(0x8e);write_data(0x72);

   init(0x8f);write_data(0x65);

   init(0xc0);write_data(0x80);

   init(0xc1);write_data(0x80);

   init(0xc2);write_data(0x69); //is:

   init(0xc3);write_data(0x73); 

   init(0xc4);write_data(0x3a);

  if(t/10000!=0)

 {init(0xc5);write_data(shu[t/10000]); 

     init(0xc6);write_data(shu[t/1000]);

     init(0xc7);write_data(shu[t/100]);

  }

 else

    {if((t/1000)!=0)

      {init(0xc5);write_data(0xfe);

    init(0xc6);write_data(shu[t/1000]);

   init(0xc7);write_data(shu[t/100]);

   }

   else

       {init(0xc5);write_data(0xfe);

    init(0xc6);write_data(0xfe);

       init(0xc7);write_data(shu[t/100]);}

     }

   

    

  init(0xc8);write_data(0x2e);

 init(0xc9);write_data(shu[(t0)/10]);

 init(0xca);write_data(shu[t]);

 init(0xcb);write_data(0x27);

 init(0xcc);write_data(0x43);

 init(0xcd);write_data(0x80);

 init(0xce);write_data(0x80);

 init(0xcf);write_data(0x80);

 }

void jiance()      //初始化,即检测是否存在DS18B20.

{unsigned char k=0;

  loop:DS=1;

      DS=0;       //主机将总线从高电平拉到低电平

       del(100);  //持续400us~960us

      DS=1;       //然后释放总线

      del(10);   //DS18B20检测到总线上升沿后,等待15us~60u后发低电平。

    k=DS;

    del(20);     //低电平至少要持续60~240us

     if(k==1)   // 60~240us内若为高电平则要重新检测。

     goto loop;

}

 read()                      //从DS18B20中读出数据

{ unsigned char i;

  unsigned long date=0;

  for(i=0;i<16;i++)

  { DS=0;        //主机在某一时刻将总线从高电平拉到低电平.

   date>>=1;

          

    

 DS=1;

  del(3);       //保持15us将总线拉到高电平,产生读时间隙

    if(DS)       

    date|=0x8000;

    del(8);          //读数据需要持续35us~60us.

  

   }

   return(date);

}

void  main()

{ unsigned long  flag=0;

    EA=0;

    SP=0X60;

   init(0x01);   //对液晶屏初始化

   init(0x38);

   init(0x0c);

   init(0x06);

  

  while(1)

 { 

   jiance();  //对DS18B20初始化

    matchrom();

    write(0x44); //启动温度变换

 del(100);  

    jiance();

    matchrom();

  if(f==1)

    {f=0;}

  else

  {  write(0xbe); // 读暂存存储器

     t=read();

     flag=t&0x8000;  //对读取的数据进行处理

    if(flag==0x8000)

     {t=~t;

       t=t+1;

       t=t*25;

     t>>=2;

       flcd_1602();

  }

   else

   {  t=t*25;

      t>>=2;

      lcd_1602();

    }

   }

  }

 }

头文件:#include

#ifndef __XUANZE_H__

#define __XUANZE_H__

unsigned char k,f=0;

sbit RS=P2^0;

sbit RW=P2^1;

sbit E=P2^2;

sbit DS=P1^1;

void del( int count )  //延时程序

{while(count--)

  ;

}

void delay(unsigned int count)//延时程序

{int p;

 while(count--)

 for(p=0;p<125;p++);

}

void write(unsigned char date)//向DS18B20中写入数据

{ int i;

  for(i=0;i<8;i++)  //由于是单总线每次只能写一位,一个字节需循环8次

  {DS=0;              //主机在某一时刻将总线从高电平拉到低电平,产生写时间隙

   DS=date&0x01; // 写入数据。

   del(15);             //写如数据要15us,ds18b20对数据采样需要15us~60us,共需35us~70us.

   DS=1;

   date>>=1;

   }

 }

   void init(unsigned int n)//  RW=0,RS=0;向指令寄存器中写入命令,即对1602初始化。

{ delay(10);

  E=0;

  RS=0;

  RW=0;

  E=1;

  P0=n;

  E=0;

 }

void write_data(unsigned char n)//RS=1,RW=0;向数据寄存器中写入数据,即显示的数符。

 {delay(10);

   E=0;

 RS=1;

 RW=0;

 E=1;

 P0=n;

    E=0;

  }

void matchrom() //匹配ROM

{

  k=P3;

  switch(k) 

 { case 0: {  f=1;

            init(0x80);write_data(0x57);//which

           init(0x81);write_data(0x68);

    init(0x82);write_data(0x69);

    init(0x83);write_data(0x63);

    init(0x84);write_data(0x68);

          init(0x85);write_data(0x80);

          init(0x86);write_data(0x4e);//NO 

          init(0x87);write_data(0x4f); 

          init(0x88);write_data(0x79);//you 

          init(0x);write_data(0x6f);

          init(0x8a);write_data(0x75); 

          init(0x8b);write_data(0x80);

          init(0x8c);write_data(0x57);//want 

          init(0x8d);write_data(0x61);

    init(0x8e);write_data(0x6e);

    init(0x8f);write_data(0x74);

     

   init(0xc0);write_data(0x70); //press

          init(0xc1);write_data(0x72);

    init(0xc2);write_data(0x65);

    init(0xc3);write_data(0x73);

    init(0xc4);write_data(0x73);

          init(0xc5);write_data(0x80);

          init(0xc6);write_data(0x57);//which

          init(0xc7);write_data(0x68); 

          init(0xc8);write_data(0x69);

          init(0xc9);write_data(0x63);

          init(0xca);write_data(0x68); 

          init(0xcb);write_data(0x80);

          init(0xcc);write_data(0x6b);//key 

          init(0xcd);write_data(0x65);

    init(0xce);write_data(0x79);

    init(0xcf);write_data(0x80);   }break;

  

   case 1: {  init(0x83);write_data(0x31); //NO 1

             write(0x55);      

                write(0x28);

                write(0x30);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0x8e);  }break;

  case 2: {  init(0x83);write_data(0x32);//NO 2

          write(0x55);      

                write(0x28);

                write(0x31);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0xb9); }break;

    case 4: {   init(0x83);write_data(0x33); //NO 3

          write(0x55);      

                write(0x28);

                write(0x32);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0xe0);   }break;

     case 8: {  init(0x83);write_data(0x34);  //NO 4

          write(0x55);      

                write(0x28);

                write(0x33);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0xd7);   } break;

     case 16: {   init(0x83);write_data(0x35); //NO 5

          write(0x55);      

                write(0x28);

                write(0x34);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0x52);   } break;

      case 32: {  init(0x83);write_data(0x36); // NO 6

           write(0x55);      

                write(0x28);

                write(0x35);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0x65);  }break;

      case : {   init(0x83);write_data(0x37); //NO 7

          write(0x55);      

                write(0x28);

                write(0x36);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0x3c); } break;

    

      case 128: {   init(0x83); write_data(0x38);//NO 8

           write(0x55);      

                write(0x28);

                write(0x37);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0x0b);  } break;

   default:{

       f=1;

       init(0x80);write_data(0x50); //please

          init(0x81);write_data(0x6c);

    init(0x82);write_data(0x65);

    init(0x83);write_data(0x61);

    init(0x84);write_data(0x73);

          init(0x85);write_data(0x65);

          init(0x86);write_data(0x80);

          init(0x87);write_data(0x70); //press

          init(0x88);write_data(0x72); 

          init(0x);write_data(0x65);

          init(0x8a);write_data(0x73); 

          init(0x8b);write_data(0x73);

          init(0x8c);write_data(0x80);

          init(0x8d);write_data(0x6f); //one

    init(0x8e);write_data(0x6e);

    init(0x8f);write_data(0x65); 

   init(0xc0);write_data(0x80);

          init(0xc1);write_data(0x80);

    init(0xc2);write_data(0x80);

    init(0xc3);write_data(0x6b);//key

    init(0xc4);write_data(0x65);

          init(0xc5);write_data(0x79);

          init(0xc6);write_data(0x80);

          init(0xc7);write_data(0x6f);//only 

          init(0xc8);write_data(0x6e);

          init(0xc9);write_data(0x6c);

          init(0xca);write_data(0x79); 

          init(0xcb);write_data(0x80);

          init(0xcc);write_data(0x21);//!

          init(0xcd);write_data(0x80);

    init(0xce);write_data(0x80);

    init(0xcf);write_data(0x80);  }break;

            

 }

}

 #endif

 

DS18B20单总线多点式测温系统--2

(2011-01-16 00:33:09) 

转载

标签: 

ds18b20

程序改进版

杂谈分类: DS18B20 

说明:较之第一个程序有很大的改善

     缺点是:闪动的不准确,由于时间待早上改善

三个函数,一主函数 二个头函数

 主函数:#include

void delay(unsigned int count)//延时程序

{int p;

 while(count--)

 for(p=0;p<125;p++);

}

#include"LCD_Init.h"

#include"xuanze.h"

unsigned int shu[]={0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x39};

unsigned long t;

void flcd_1602()     //当为负温度时,液晶显示可以高位为0屏蔽.

 {   LCD_dis_string(1,1,"NO ");   //显示字符串       

     LCD_dis_string(5,1,"temperature");   //显示字符串temperature        

     LCD_dis_string(1,2,"  is:");   //显示字符串is:       

  if((t/1000)!=0)

 {

  LCD_write_command(0xc5);LCD_write_data(0x2d); 

     LCD_write_command(0xc6);LCD_write_data(shu[t/1000]);

  LCD_write_command(0xc7);LCD_write_data(shu[t/100]); 

  }

 else

 {LCD_write_command(0xc5);LCD_write_data(0xfe); 

     LCD_write_command(0xc6);LCD_write_data(0x2d);

  LCD_write_command(0xc7);LCD_write_data(shu[t/100]); 

 }

 LCD_write_command(0xc8);LCD_write_data(0x2e);

    LCD_write_command(0xc9);LCD_write_data(shu[(t0)/10]);

 LCD_write_command(0xca);LCD_write_data(shu[t]);

 LCD_write_command(0xcb);LCD_write_data(0x27);

 LCD_write_command(0xcc);LCD_write_data(0x43);

 LCD_write_command(0xcd);LCD_write_data(0x80);

 LCD_write_command(0xce);LCD_write_data(0x80);

 LCD_write_command(0xcf);LCD_write_data(0x80);

 }

 void lcd_1602()              //当为正温度时,液晶显示可以高位为0屏蔽.

 {

    LCD_dis_string(1,1,"NO ");   //显示字符串       

     LCD_dis_string(5,1,"temperature");   //显示字符串temperature        

     LCD_dis_string(5,2,"  is:");   //显示字符串is: 

   if(t/10000!=0)

     {  

       LCD_write_command(0xc5);LCD_write_data(shu[t/10000]); 

       LCD_write_command(0xc6);LCD_write_data(shu[t/1000]);

       LCD_write_command(0xc7);LCD_write_data(shu[t/100]);

      }

   else

    {  if((t/1000)!=0)

        {

        LCD_write_command(0xc5);LCD_write_data(0xfe);

        LCD_write_command(0xc6);LCD_write_data(shu[t/1000]);

        LCD_write_command(0xc7);LCD_write_data(shu[t/100]);

        }

       else

       {

        LCD_write_command(0xc5);LCD_write_data(0xfe);

        LCD_write_command(0xc6);LCD_write_data(0xfe);

        LCD_write_command(0xc7);LCD_write_data(shu[t/100]);}

       } 

   

 LCD_write_command(0xc8);LCD_write_data(0x2e);

 LCD_write_command(0xc9);LCD_write_data(shu[(t0)/10]);

 LCD_write_command(0xca);LCD_write_data(shu[t]);

 LCD_write_command(0xcb);LCD_write_data(0x27);

 LCD_write_command(0xcc);LCD_write_data(0x43);

 LCD_write_command(0xcd);LCD_write_data(0x80);

 LCD_write_command(0xce);LCD_write_data(0x80);

 LCD_write_command(0xcf);LCD_write_data(0x80);

 }

void Init_ds18b20()      //初始化,即检测是否存在DS18B20.

{     unsigned char k=0;

  loop:DS=1;

      DS=0;       //主机将总线从高电平拉到低电平

      del(100);  //持续400us~960us

      DS=1;       //然后释放总线

      del(10);   //DS18B20检测到总线上升沿后,等待15us~60u后发低电平。

      k=DS;

      del(20);     //低电平至少要持续60~240us

      if(k==1)   // 60~240us内若为高电平则要重新检测。

      goto loop;

}

 read()                      //从DS18B20中读出数据

{

     unsigned char i;

     unsigned long date=0;

  for(i=0;i<16;i++)

   { DS=0;        //主机在某一时刻将总线从高电平拉到低电平.

     date>>=1;  

     DS=1;

    del(3);       //保持15us将总线拉到高电平,产生读时间隙

    if(DS)       

    date|=0x8000;

    del(8);          //读数据需要持续35us~60us.

   }

   return(date);

}

void  main()

{   unsigned long  flag=0;

    EA=0;

    SP=0X60;

    LCD_init();

  while(1)

   { 

    Init_ds18b20();  //对DS18B20初始化

    matchrom();

    write(0x44); //启动温度变换

    del(100);  

 

    Init_ds18b20();

    matchrom();

 if(f==1){f=0;}

  else

  {  write(0xbe); // 读暂存存储器

     t=read();

     flag=t&0x8000;  //对读取的数据进行处理

     if(flag==0x8000)

     { t=~t;

       t=t+1;

       t=t*25;

       t>>=2;

       flcd_1602();

  }

     else

    { 

       t=t*25;

       t>>=2;

       lcd_1602();

    }

   }

  }

 }

头函数1:

#include"xuanze.h"

#ifndef __XUANZE_H__

#define __XUANZE_H__

unsigned char k,f=0;

sbit DS=P1^1;

void del( int count )  //延时程序

{while(count--)

  ;

}

void write(unsigned char date)//向DS18B20中写入数据

{ int i;

  for(i=0;i<8;i++)  //由于是单总线每次只能写一位,一个字节需循环8次

  {DS=0;              //主机在某一时刻将总线从高电平拉到低电平,产生写时间隙

   DS=date&0x01; // 写入数据。

   del(15);             //写如数据要15us,ds18b20对数据采样需要15us~60us,共需35us~70us.

   DS=1;

   date>>=1;

   }

 }

void matchrom() //匹配ROM

{

  k=P3;

  switch(k) 

 { case 0:  //没有键按下,显示下面一串字符串

            {  

             f=1;

             LCD_dis_string(1,1,"which NOYOU WANT");   //显示字符串       

             LCD_dis_string(1,2,"press which key");   //显示字符串

             }break;

   case 1: { LCD_write_command(0x83);LCD_write_data(0x31); //NO 1

                write(0x55);      

                write(0x28);

                write(0x30);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0x8e);  }break;

  case 2: {LCD_write_command(0x83);LCD_write_data(0x32);//NO 2

                write(0x55);      

                write(0x28);

                write(0x31);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0xb9); }break;

    case 4: {  LCD_write_command(0x83);LCD_write_data(0x33); //NO 3

                write(0x55);      

                write(0x28);

                write(0x32);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0xe0);   }break;

     case 8: { LCD_write_command(0x83);LCD_write_data(0x34);  //NO 4

                write(0x55);      

                write(0x28);

                write(0x33);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0xd7);   } break;

     case 16: {  LCD_write_command(0x83);LCD_write_data(0x35); //NO 5

                write(0x55);      

                write(0x28);

                write(0x34);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0x52);   } break;

      case 32: { LCD_write_command(0x83);LCD_write_data(0x36); // NO 6

                write(0x55);      

                write(0x28);

                write(0x35);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0x65);  }break;

      case : {  LCD_write_command(0x83);LCD_write_data(0x37); //NO 7

                write(0x55);      

                write(0x28);

                write(0x36);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0x3c); } break;

    

      case 128: {  

                LCD_write_command(0x83); LCD_write_data(0x38);//NO 8

                write(0x55);      

                write(0x28);

                write(0x37);

                write(0xc5);

                write(0xb8);

                write(0x00);

                write(0x00);

                write(0x00);

                write(0x0b);  } break;

   default: {

            f=1;     

            LCD_dis_string(1,1,"please press one");   //显示字符串       

            LCD_dis_string(5,2,"   key only !   ");   //显示字符串      

            }

       }

}

 #endif

头函数2:

#include"LCD_Init.h"

#ifndef __LCD_H__

#define __LCD_H__

#define LCDIO  P0

sbit RS=P2^0;

sbit RW=P2^1;

sbit E=P2^2;

void LCD_write_command(unsigned int n)//  RW=0,RS=0;向指令寄存器中写入命令.

{

  delay(10);

  E=0;

  RS=0;

  RW=0;

  E=1;

  LCDIO=n;

  E=0;

 }

LCD_init()

  {

      LCD_write_command(0x01);   //对液晶屏初始化

      LCD_write_command(0x38);

      LCD_write_command(0x0c);

      LCD_write_command(0x06);

  }

void LCD_write_data(unsigned char n)//RS=1,RW=0;向数据寄存器中写入数据,即显示的数符。

 {

   delay(10);

   E=0;

   RS=1;

   RW=0;

   E=1;

   P0=n;

   E=0;

  }

void LCD_dis_string(unsigned char X,unsigned char Y,unsigned char *s)   //显示字符串

   {

    unsigned char address;

    if(Y==1)address=0x80+X;

    else address=0xc0+X;

    LCD_write_command(address);

    while(*s)

    {

      LCD_write_data(*s);

      s++; 

     }

    }

 #endif 

 

 

文档

DS18B20单总线多点式测温系统

DS18B20单总线多点式测温系统1(2011-01-1519:53:40)转载标签:ds18b20多点测量分类:DS18B20主文件:#include#includeunsigned intshu[]={0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x39};unsignedlongt; voidflcd_1602()          //当为负温度时,液晶显示可以高位为0屏蔽. {   init(0x80);write_data(0x4e);
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top