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

📄 ds18b20.c

📁 基于单片机的
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P2^7;
bit present;
uchar disbuff[8];
uchar TMP[9];
uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xff,0xf6};


//----延时2us子程序----//
void delay2(uchar t)
{

  while(--t);
}
//------延时50ms子程序-----//
void delay50ms(uint t)
{
  uint j;
  for(;t>0;t--)
  {
   for(j=6245;j>0;j--);
  }

}

//----延时8us子程序----//				 
void delay8(uint t)
{

  while(--t);

}
//--------18B20写1操作-----//
void write1(void)
{
   DQ=1;		   //两次写之间DQ保持最少1us的高电平
   _nop_();
   DQ=0;  		   //DQ拉低
   _nop_();	
   _nop_();	   
   DQ=1;		   //在15us之内使得DQ变为高电平
   delay2(40);	   //延时80us

}
//--------18B20写0操作-----//
void write0(void)
{
   DQ=1;		   //两次写之间DQ保持最少1us的高电平
   _nop_();
   DQ=0;  		   //DQ拉低
   delay2(40);	   //延时80us

}

//-----18B20读一位---------//
bit read1bit(void)
{
  bit r;
  DQ=1;		       //两次写之间DQ保持最少1us的高电平
  _nop_();
  DQ=0;  		   //DQ拉低
  _nop_();		   //延时1us
  _nop_();
  DQ=1;            //释放总线 
  delay2(2);	   //延时4us
  r=DQ;			   //采样DQ的值	  
  delay2(40);	   //延时80us
  return r;
}



//------DS18B20复位子程序-----//
void reset_DS18B20(void)
{
 uchar i;
 DQ=1;
 _nop_();
 DQ=0;
 delay2(250);		//延时500us
 DQ=1;				//DQ拉高
 delay2(20);		//延时40us
 for(i=0;i<80&&DQ==1;i++);
 present=DQ;
 delay2(220);		//延时使得RX时间超过480us
}
//----------DS18B20写字节操作-----//
void write(uchar dat)
{
 uchar i;
 uchar j;
 for(i=0;i<8;i++)
 {
   _nop_();
   j=dat&0x01;			//如果最低位为1,则进行写1操作,否则,进行写0操作
   if(j)
	write1();
   else 
    write0();
   dat>>=1;				//dat右移一位
  }
 DQ=1;
}

//----------DS18B20读字节操作-----//
uchar read(void)
{
  uchar i;
  uchar result;
  for(i=0;i<8;i++)
  {
   _nop_();
   result>>=1;				  //否则result左移一位
   if(read1bit())
   {			  //如果读得的数据为1,则将result或上01
    result=result|0x80;
   }
   
  }
 // DQ=1;
  return result;
}

//----------读DS18B20  64bitcode操作-----//
void read64bitcode(void)
{
  uchar i;
  write(0x33);			  //发送readrom命令
  for(i=0;i<8;i++)		  //读得的数据存进disbuff
  {
  	disbuff[i]=read();
  }
   
}


//----------静态显示程序-----//
void display(void)
{
 uchar dis[4];
 uint k=0;
 uchar j;

 k=(TMP[1]<<8)|TMP[0];
 k=k>>4;
 dis[0]=k%10;
 dis[1]=(k%100)/10;
 dis[2]=k/100;
 dis[3]=k/1000;
 

 for(j=0;j<4;j++)
 {
   SBUF=table[dis[j]];
   while(TI==0);
   TI=0;
 
 }



}

//----------配置ds18b20-----//
void config(void)

{ 

 write(0X4e);			  //write Scratchpad
 write(0X4b);			  //发送TH
 write(0X02);			  //发送TL
 write(0X7F);			  //发送配置寄存器的值0001 1111 其中R1=R0=0

}
void main(void)
{
 uchar i;
 
  SCON=0X00;
  SP=0X60;
while(1)
{
 //reset_DS18B20();		  //复位
// read64bitcode();		  //读取64位ROM的值






 //reset_DS18B20();		  //复位
 //write(0XCC);			  //skip rom
// write(0XBE);			  //read  Scratchpad command
// for(i=0;i<9;i++)
 //{

 // TMP[i]=read();
 
 //}


 
 reset_DS18B20();		  //复位
 write(0XCC);			  //skip rom
 config();





 reset_DS18B20();		  //复位
 write(0XCC);			  //skip rom
 write(0X48);			  //保存设置
 delay50ms(1);

 

 reset_DS18B20();		  //复位
 write(0XCC);			  //skip rom
 write(0X44);			  //开始温度转换
 while(read1bit()==0);    //等待转换完毕
 //delay50ms(40);


 reset_DS18B20();		  //复位
 write(0XCC);			  //skip rom
 write(0XBE);			  //read  Scratchpad command
 for(i=0;i<9;i++)
 {

  TMP[i]=read();
 
 }

 display();
 
}
}

























							    

⌨️ 快捷键说明

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