单片机学习第14期:DS18B20温度传感器原理与应用

DS18B20温度传感器

  • 13.1DS18B20温度传感器基础知识
  • 1.DS18B20介绍
  • 2.引脚及应用电路
  • 3.内部结构框图
  • 4.存储器框图
  • 5.单总线介绍
  • 6.单总线电路规范
  • 7.单总线时序结构
  • 8.DS18B20操作流程
  • 9.DS18B20数据帧
  • 13.2DS18B20温度读取和温度报警器代码
  • 1.DS18B20温度读取
  • (1)工程目录
  • (2)main.c函数
  • (3)DS18B20.c函数
  • (4)OneWire.c函数
  • 2.DS18B20温度报警器
  • (1)工程目录
  • (2)main.c函数
  • 13.1DS18B20温度传感器基础知识

    1.DS18B20介绍

    DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点
    测温范围:-55°℃到+125°℃
    通信接口:1-Wire(单总线)·其它特征:可形成总线结构、内置温度报警功能、可寄生供电

    2.引脚及应用电路

    3.内部结构框图


    64-BITROM:作为器件地址,用于总线通信的寻址
    SCRATCHPAD(暂存器):用于总线的数据交互
    EEPROM:用于保存温度触发阈值和配置参数

    4.存储器框图

    5.单总线介绍

    单总线(1-WireBUS)是由Dallas公司开发的一种通用数据总线
    一根通信线**:DQ**
    异步、半双工
    单总线只需要一根通信线即可实现数据的双向传输,当采用寄生供电时,还可以省去设备的VDD线路,此时,供电加通信只需要DQ和GND两根线

    6.单总线电路规范

    设备的DO均要配置成开漏输出模式
    DO添加一个上拉电阻,阻值一般为4.7K左右
    若此总线的从机采取寄生供电,则主机还应配一个强上拉输出电路

    7.单总线时序结构

    初始化:主机将总线拉低至少480us.然后释放总线,等待15-60us后,存在的从机会拉低总线60~240us以响应主机,之后从机将释放总线
    发送一位:主机将总线拉低60120us.然后释放总线,表示发送0;主机将总线拉低115us.然后释放总线,表示发送1。从机将在总线拉低30us后(典型值)读取电平,整个时间片应大于60us

    发送一位:主机将总线拉低60120us.然后释放总线,表示发送0;主机将总线拉低115us.然后释放总线,表示发送1。从机将在总线拉低30us后(典型值)读取电平,整个时间片应大于60us

    8.DS18B20操作流程

    初始化:从机复位,主机判断从机是否响应
    ROM操作:ROM指令+本指令需要的读写操作
    功能操作:功能指令+本指令需要的读写操作

    9.DS18B20数据帧

    13.2DS18B20温度读取和温度报警器代码

    1.DS18B20温度读取

    (1)工程目录

    (2)main.c函数

    #include <REGX52.H>
    #include "Delay.h"
    #include "LCD1602.h"
    #include "DS18B20.h"
    
    float T;
    
    void main()
    {
    	LCD_Init();
    	LCD_ShowString(1,1,"Temperature:");
    	
    	while(1)
    	{
    		DS18B20_ConvertT();
    		T=DS18B20_ReadT();
    		if(T<0)
    		{
    			LCD_ShowChar(2,1,'-');
    			T=-T;
    		}
    		else
    		{
    			LCD_ShowChar(2,1,'+');
    		}
    		LCD_ShowNum(2,2,T,3);
    		LCD_ShowChar(2,5,'.');
    		LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);
    	}
    }
    

    (3)DS18B20.c函数

    #include <REGX52.H>
    #include "OneWire.h"
    
    #define DS18B20_SKIP_ROM  0xCC
    #define DS18B20_CONVERT_T 0x44
    #define DS18B20_READ_SCRATCHPAD 0xBE
    
    void DS18B20_ConvertT(void)
    {
    	OneWire_Init();
    	OneWire_SendByte(DS18B20_SKIP_ROM);
    	OneWire_SendByte(DS18B20_CONVERT_T);
    }
    
    float DS18B20_ReadT(void)
    {
    	unsigned char TLSB,TMSB;
    	int Temp;
    	float T;
    	OneWire_Init();
    	OneWire_SendByte(DS18B20_SKIP_ROM);
    	OneWire_SendByte(DS18B20_READ_SCRATCHPAD);
    	TLSB=OneWire_ReceiveByte();
    	TMSB=OneWire_ReceiveByte();
    	Temp=(TMSB<<8)|TLSB;
    	T=Temp/16.0;
    	return T;
    }
    

    (4)OneWire.c函数

    #include <REGX52.H>
    sbit OneWire_DQ=P3^7;
    
    unsigned char OneWire_Init(void)
    {
    	
    	unsigned char  i;
    	unsigned char AckBit;
        OneWire_DQ=1;
    	OneWire_DQ=0;
    	
    	i = 227;while (--i);//Delay 500us
    	OneWire_DQ=1;
    	i = 29;while (--i);//Delay 70us
    	AckBit=OneWire_DQ;
    	i = 227;while (--i);//Delay 500us
    	return AckBit;
    }
    
    void OneWire_SendBit(unsigned char Bit)
    {
    	unsigned char i;
    	OneWire_DQ=0;
    
    	i = 3;while (--i);//Delay 10us
    	OneWire_DQ=Bit;
    	i = 22;while (--i);//Delay 50us
    	OneWire_DQ=1;
    }
    
    unsigned char OneWire_ReceiveBit(void)
    {
    	unsigned char i;
    	unsigned char Bit;
    	OneWire_DQ=0;
    	i = 1;while (--i);//Delay 5us
    	OneWire_DQ=1;
    	i = 1;while (--i);//Delay 5us	
    	Bit=OneWire_DQ;
    	i = 22;while (--i);//Delay 50us	
    	return Bit;
    }
    
    void OneWire_SendByte(unsigned char Byte)
    {
    	unsigned char i;
    	for(i=0;i<8;i++)
    	{
    		OneWire_SendBit(Byte&(0x01<<i));
    	}
    }
    
    unsigned char OneWire_ReceiveByte(void)
    {
    	unsigned char i;
    	unsigned char Byte=0x00;
    	for(i=0;i<8;i++)
    	{
    		if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}
    	}
    	return Byte;
    }
    
    

    2.DS18B20温度报警器

    (1)工程目录

    (2)main.c函数

    #include <REGX52.H>
    #include "DS18B20.h"
    #include "AT24C02.h"
    #include "LCD1602.h"
    #include "Key.h"
    #include "Delay.h"
    
    float T,TShow;
    char TLow,THigh;
    unsigned char KeyNum;
    void main()
    {
    	DS18B20_ConvertT();
    	Delay(1000);
    	THigh=AT24C02_ReadByte(0);
    	TLow=AT24C02_ReadByte(1);
    	if(THigh>125||TLow<-55||THigh<=TLow)
    	{
    		THigh=20;
    		TLow=15;
    	}
    	LCD_Init();
    	LCD_ShowString(1,1,"T:");
    	LCD_ShowString(2,1,"TH:");
    	LCD_ShowString(2,9,"TL:");
    	LCD_ShowSignedNum(2,4,THigh,3);
    	LCD_ShowSignedNum(2,12,TLow,3);
    	while(1)
    	{
    		KeyNum=Key();
    		/*温度读取及显示*/
    		DS18B20_ConvertT();
    		T=DS18B20_ReadT();
    		if(T<0)
    		{
    			LCD_ShowChar(1,3,'-');
    			TShow=-T;
    		}
    		else
    		{
    			LCD_ShowChar(1,3,'+');
    			TShow=T;
    		}
    		LCD_ShowNum(1,4,TShow,3);
    		LCD_ShowChar(1,7,'.');
    		LCD_ShowNum(1,8,(unsigned char)(TShow*100)%100,2);
    		
    		/*阈值判断及显示*/
    		if(KeyNum)
    		{
    			if(KeyNum==1)
    			{
    				THigh++;
    				if(THigh>125){THigh=125;}
    			}
    			if(KeyNum==2)
    			{
    				THigh--;
    				if(THigh<=TLow){THigh++;}
    			}
    			if(KeyNum==3)
    			{
    				TLow++;
    				if(TLow>=THigh){TLow--;}
    			}
    			if(KeyNum==4)
    			{
    				TLow--;
    				if(THigh<-55){TLow=-55;}
    			}
    			LCD_ShowSignedNum(2,4,THigh,3);
    			LCD_ShowSignedNum(2,12,TLow,3);
    			AT24C02_WriteByte(0,THigh);
    			Delay(5);
    			AT24C02_WriteByte(0,TLow);
    			Delay(5);
    		}
    		if(T>THigh)
    		{
    			LCD_ShowString(1,13,"OV:H");
    		}
    		else if(T<TLow)
    		{
    			LCD_ShowString(1,13,"OV:L");
    		}
    		else
    		{
    			LCD_ShowString(1,13,"    ");
    		}
    
    	}
    }
    

    只能先敲出程序,慢慢理解了

    作者:周末不工作

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机学习第14期:DS18B20温度传感器原理与应用

    发表回复