⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 自己写的测试程序,调试已通过,可以直接使用, 而且有的还有详细的注释.红外测试软件
💻 C
字号:
#include<w78e58b.h>
#include <intrins.h>

sbit dq18b20=P1^1;
sbit dq18b20_find=P1^0;

/************* delay time  ******************************/  
void ds18b20_delay(char t)
{
 for(;t>0;t--)
  {}
 }

/************** wait *****************************/
bit ds18b20_wait(void)
 {
 unsigned char i;
  bit x;
  x=0;  
  for(i=0;i<100;i++)
  {
   if(~dq18b20)
     { 
      if(dq18b20)
	    {x=1;return x;}
	   }	}  
    return x;	     
	  
	  }  

/**************  reset DS18B20  ************************/
void ds18b20_reset(void)       // reset DS18b20
 {
 dq18b20_find=0;
 dq18b20=0;
 ds18b20_delay(50);
 dq18b20=1;
 dq18b20_find=1;
 }
/***************  wait responsion ***********************/

/***************  read a bit data ******************************/
bit ds18b20_readbit(void)
 { 
  bit x;
  dq18b20=0;
                                _nop_();
                                _nop_();
                               _nop_();
                                _nop_();
  dq18b20=1;
  x=dq18b20;
return(x);
 }
/**************** read a byte data *****************************/
 unsigned char ds18b20_readbyte(void)
 {
   unsigned char i,dat,x;
   dat=0x00;
  for(i=0;i<8;i++)
  { 
    x=ds18b20_readbit();                                             
    dat=(x<<7)|(dat>>1);              
    }
   return(dat);
 }
/*******************  write a byte data *******************************/
void ds18b20_write(unsigned char dat)
 {
   unsigned char i,x;
   for(i=0;i<8;i++)
    {
     x=dat&1;
     dat>>=1;
     if(x==1)
      {  
       dq18b20=0;
       ds18b20_delay(0);
                                           _nop_();
                                         _nop_();
                                         _nop_();
                                         _nop_();
                                          _nop_();
                                         _nop_();
       dq18b20=1;
     }
   else {
          dq18b20=0;
          ds18b20_delay(5);
          dq18b20=1;
          }
     }
  }
/************  starting DS18B20  ********************/
void ds18b20_start(void)
{   EA=0;
     ds18b20_reset();
     ds18b20_wait();
     ds18b20_write(0xcc);             
     ds18b20_write(0x44);                                 
   EA=1;                            
  }

 /*************  match rom *****************************/
short int match_temperature(unsigned char n[8])
 {
   
   unsigned char i,low,high;
   unsigned char *p;
   short int x;
  
  EA=0; p=n;
   ds18b20_reset();
   ds18b20_wait();                     
   ds18b20_write(0x55);
   for(i=0;i<8;i++)
    {
	  ds18b20_write(*p);
	  p++;
	                                  
	  }
     ds18b20_write(0xbe);               
     ds18b20_delay(3);
    low=ds18b20_readbyte();
    high=ds18b20_readbyte();
    x=high&0xff;
	x<<=8;
	x+=low;
   EA=1;
	return x;
   
}  
   
   bit ds18b20_readbit_find(void)
 { 
  bit x;
  dq18b20_find=0;
  ds18b20_delay(1);                     
  dq18b20_find=1;
  x=dq18b20_find;
return(x);
 }  
      
   /**************** read a byte data *****************************/
 unsigned char ds18b20_readbyte_find(void)
 {
   unsigned char i,dat,x;
   dat=0x00;
  for(i=0;i<8;i++)
  { 
    x=ds18b20_readbit_find();                 
    ds18b20_delay(1);
    dat=(x<<7)|(dat>>1);
    }
   return(dat);
 }


/************** wait *****************************/
bit ds18b20_wait_find(void)
 {
 unsigned char i;
  bit x;
 x=0;  
  for(i=0;i<100;i++)
  {
   if(~dq18b20_find)
     { 
	  ds18b20_delay(0);
      if(dq18b20_find)
	    {x=1;return x;}
	   }	}  
    return x;         
   
	  
	  }

/*******************  dq18b20_find ***************************/
void ds18b20_write_find(unsigned char dat)
 {  
   unsigned char i,x;
   for(i=0;i<8;i++)
    {
     x=dat&1;
     dat>>=1;
     if(x==1)
      {  
       dq18b20_find=0;
        ds18b20_delay(0);
       dq18b20_find=1;
     }
   else {
          dq18b20_find=0;
          ds18b20_delay(5);
          dq18b20_find=1;
          }
     }
  }
/***********  read number   ********************************/
void ds18b20_number(unsigned char xxxxx[8])
{
 unsigned char *p;
 unsigned char i; 
   EA=0;
  p=xxxxx;
 
  ds18b20_reset();
  ds18b20_wait_find();              
  ds18b20_write_find(0x33);
  for(i=0;i<8;i++)
  {
    *p=ds18b20_readbyte_find();
     p++;
     
	 }
   EA=1;
 }


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -