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

📄 ds18b20.h

📁 51单片驱动18b20的源代码程序!供设计者参考!
💻 H
字号:
#define	dq_clr	PORTB&=~(1<<PB7)    //数据线强制拉低
#define	dq_set	PORTB|=(1<<PB7)     //数据线强制拉高,上拉
#define	hold_dq	DDRB|=(1<<PB7)     //Mega16控制总线
#define	rls_dq	DDRB&=~(1<<PB7)     //释放总线
#define	stu_dq	PINB&(1<<PB7)  //数据线的状态

unsigned char resetDS18B20(void)
{
   unsigned char errTime=0;
   rls_dq;		   //释放总线
   _NOP();
   hold_dq;		   //Maga16控制总线
   dq_clr;		   //强制拉低
   delay_nus(480);	   
   //以上延时大于480us
   rls_dq;		   //释放总线,总线自动上拉
   _NOP();
   while(stu_dq)
   {
      delay_nus(5);	   //5us
      errTime++;
      if(errTime>12)
         return(0x00);	   //如果等带大于约 5*12就返回0x00,报告复位失败(实际上只要等待15-60us)
   }
   errTime=0;
   while(!(stu_dq))
   {
      delay_nus(5);	   //5us
      errTime++;
      if(errTime>50)
         return(0x00);     //如果等带大于约 5us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
   }
   return(0xff);
}

unsigned char readByteDS18B20(void)
{
   unsigned char i;
   unsigned char retVal=0;
   rls_dq;		   //释放总线
   for(i=8;i>0;i--)
   {
      retVal>>=1;
      hold_dq;	   //Maga16控制总线
      dq_clr;	   //强制拉低
      delay_nus(8);	   //延时大于1us
      dq_set;	   //释放总线,DS18B20会将总线强制拉低
     
	  rls_dq;		//释放总线
      if(stu_dq)
         retVal|=0x80;
      delay_nus(30);	 	//30us
      hold_dq;		//释放总线
      dq_set;	   //释放总线,DS18B20会将总线强制拉低

   }
   delay_nus(5);	 	//2.71us(大于1us就行了)
   return(retVal);
}

void writeByteDS18B20(unsigned char wb)
{
   unsigned char i;
   unsigned char temp;
   rls_dq;	         	//释放总线
   for(i=0;i<8;i++)
   {
      hold_dq;		//Maga16控制总线
      dq_clr;		//强制拉低
      delay_nus(4);	 	
      temp=wb>>i;
      temp&=0x01;
      if(temp)
         dq_set;		//释放总线
      else
         dq_clr;		//强制拉低
      delay_nus(50);	 	
      
	  dq_set;		//释放总线
      delay_nus(4);	 	//(大于1us就行了)
   }
}

void readTempDS18B20(void)
{
   unsigned char tempL,tempH;
   unsigned int x;
   resetDS18B20();
   writeByteDS18B20(0xcc); 	//跳过ROM
   writeByteDS18B20(0x44);	//启动温度转换
   delay_nus(500);          //等待500us
   resetDS18B20();
   writeByteDS18B20(0xcc);	//跳过ROM
   writeByteDS18B20(0xbe);	//读数据
   tempL=readByteDS18B20();
   tempH=readByteDS18B20();
   x=(tempH<<8)|tempL;
   resetDS18B20();
   writeByteDS18B20(0xcc); 	//跳过ROM
   writeByteDS18B20(0x44);	//启动温度转换
   x=x*0.625;
   LCD_DisplayInt(2,3,x);   //未将温度值的小数点显示出
   
}

⌨️ 快捷键说明

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