资讯详情

DS18B20数字温度传感器实验

文章目录

    • DS18B20
      • 技术性能特征
      • DS18B20封装
      • 连接方式
      • 信号类型
        • 复位脉冲
      • 应答信号
      • 写时序
    • 温度读取过程
    • 实验代码

DS18B20

技术性能特征

独特的单总线接口方式 连接到微处理器只需要一条口线 实现双向通信 提高系统的抗干扰性 2.测温范围-555℃~ 125℃ 精度±0.5℃ 支持多点组网 并联8实现多点测温 工作电源 3.0~5.5V DC 不需要任何外围电路 测量结果为9~12位数字串行传输

DS18B20封装

在这里插入图片描述

连接方式

信号类型

复位脉冲 应答脉冲 写0 写1 读0 读1 除响应脉冲外,主机还发出同步信号 信号线:PG9(探索者)

复位脉冲

单总线上的所有通信都是从初始序列开始的 主机输出低电平 至少保持低电时间480us 产生复位脉冲 后主机释放总线 上拉电阻拉高单总线 延时15~60us 进入接收 而后DS18B20拉低总线60~240us 产生低电平响应

//复位DS18B20 void DS18B20_Rst(void)     { 
                           DS18B20_IO_OUT(); //SET PG11 OUTPUT   DS18B20_DQ_OUT=0; //拉低DQ   delay_us(750);    //拉低750us   DS18B20_DQ_OUT=1; //DQ=1   delay_us(15);     //15US }  

应答信号

u8 DS18B20_Check(void)      { 
             u8 retry=0;  DS18B20_IO_IN();//SET PG11 INPUT      while (DS18B20_DQ_IN&&retry<200)  { 
           retry ;   delay_us(1);  };    if(retry>=200)return 1;
	else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)
	{ 
        
		retry++;
		delay_us(1);
	};
	if(retry>=240)return 1;	    
	return 0;
}

写时序

包括写0 写1 主机拉低总线时 写 写1:主机输出低电平 延时2us 然后释放总线 延时60us

写0: 主机输出低电平 延时60us 释放总线 延时2us

void DS18B20_Write_Byte(u8 dat)     
 { 
                     
    u8 j;
    u8 testb;
	  DS18B20_IO_OUT();//SET PG11 OUTPUT;
    for (j=1;j<=8;j++) 
	{ 
        
        testb=dat&0x01;
        dat=dat>>1;
        if (testb) 
        { 
        
            DS18B20_DQ_OUT=0;// Write 1 主机输出低电平
            delay_us(2);                            
            DS18B20_DQ_OUT=1;
            delay_us(60);             
        }
        else 
        { 
        
            DS18B20_DQ_OUT=0;// Write 0 主机输出低电平
            delay_us(60);             
            DS18B20_DQ_OUT=1;
            delay_us(2);                          
        }
    }
}

u8 DS18B20_Read_Bit(void) 			 // read one bit
{ 
        
  u8 data;
	DS18B20_IO_OUT();//SET PG11 OUTPUT
  DS18B20_DQ_OUT=0; 
	delay_us(2);
  DS18B20_DQ_OUT=1; 
	DS18B20_IO_IN();//SET PG11 INPUT
	delay_us(12);
	if(DS18B20_DQ_IN)data=1;
  else data=0;	 
  delay_us(50);           
  return data;
}
u8 DS18B20_Read_Byte(void)    // read one byte
{ 
                
    u8 i,j,dat;
    dat=0;
	for (i=1;i<=8;i++) 
	{ 
        
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }						    
    return dat;
}

温度读取过程

复位->发SKIP ROM命令 ->发开始转换命令 -> 延时 ->复位 ->发送SKIPROM命令 ->发读存储器命令 ->连续读出两个字节数据 ->结束

short DS18B20_Get_Temp(void)
{ 
        
    u8 temp;
    u8 TL,TH;
	  short tem;
    DS18B20_Start ();                    // ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();	 
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0xbe);// convert 
    TL=DS18B20_Read_Byte(); // LSB 
    TH=DS18B20_Read_Byte(); // MSB 
    if(TH>7)
    { 
        
        TH=~TH;
        TL=~TL; 
        temp=0;//温度为负
    }else temp=1;//温度为正 
    tem=TH; //获得高八位
    tem<<=8;    
    tem+=TL;//获得低八位
    tem=(double)tem*0.625;//转换 
	if(temp)return tem; //返回温度值
	else return -tem;    
}

实验代码

int main(void)
{ 
         
	u8 t=0;			    
	short temperature;  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init(168);  
	uart_init(115200);		
	
	LED_Init();					
 	LCD_Init();
  POINT_COLOR=RED;
	LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");	
	LCD_ShowString(30,70,200,16,16,"DS18B20 TEST");	
	LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(30,110,200,16,16,"2021/10/10");
 	while(DS18B20_Init())	
	{ 
        
		LCD_ShowString(30,130,200,16,16,"DS18B20 Error");
		delay_ms(200);
		LCD_Fill(30,130,239,130+16,WHITE);
 		delay_ms(200);
	}   
	LCD_ShowString(30,130,200,16,16,"DS18B20 OK");
	POINT_COLOR=BLUE;
 	LCD_ShowString(30,150,200,16,16,"Temp: . C");	 
	while(1)
	{ 
        	    	    
 		if(t%10==0)//每100s读一次
		{ 
        									  
			temperature=DS18B20_Get_Temp();	
			if(temperature<0)
			{ 
        
				LCD_ShowChar(30+40,150,'-',16,0);//负号 
				temperature=-temperature;	//转正 
			}else LCD_ShowChar(30+40,150,' ',16,0);			//去掉负号
			LCD_ShowNum(30+40+8,150,temperature/10,2,16);	//显示正数 
   			LCD_ShowNum(30+40+32,150,temperature%10,1,16);	//显示小数部分 
		}				   
	 	delay_ms(10);
		t++;
		if(t==20)
		{ 
        
			t=0;
			LED0=!LED0;
		}
	}
}

标签: 温度双传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台