找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5833|回复: 2
打印 上一主题 下一主题
收起左侧

详解温度传感器DS18B20编程与使用

[复制链接]
跳转到指定楼层
楼主
DS18B20是由DALLAS半导体公司推出的一种的“一线总线”接口的温度传感器, 与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。

1.测量温度范围:-55~+125℃
2.精度:±0.5℃
3.数据传输:“一线总线”的数字方式传输



图1 硬件连接图

      DS18B20共有6种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1


1.复位操作:
引脚拉低——延时480-960us——引脚高——延时15-60us
图2 红框为复位操作时序

void DS18B20_Rst(void)   
{               
         DS18B20_IO_OUT();     
   DS18B20_DQ_OUT=0;  
   delay_us(750);   
   DS18B20_DQ_OUT=1;   
         delay_us(15);     
}

2.应答操作
将引脚设置为输入模式——判断引脚低电平时间是否大于60us、小于240us——返回应答结果
图3 红框为应答操作时序

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

3. 读0、读1操作
将引脚设置为输出模式——引脚拉低——延时2us——引脚拉高——设置为输入模式——延时2us——读取引脚状态——返回读取结果
图4 读操作

u8 DS18B20_Read_Bit(void)   
{
   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;
}

4.写1操作
设置引脚为输出模式——引脚拉低——延时2us——引脚拉高——延时大于60us


图5 红框为写操作

void DS18B20_Write_Zero(void)
{
         DS18B20_IO_OUT();        //SET PG11 OUTPUT;
DS18B20_DQ_OUT=0;   
   delay_us(2);                           
   DS18B20_DQ_OUT=1;
   delay_us(60);
}

5.写0操作
设置引脚为输出模式——引脚拉低——延时60-120us——引脚拉高——延时2us
图6  红框为写1操作

void DS18B20_Write_One(void)
{
         DS18B20_IO_OUT();        //SET PG11 OUTPUT;
DS18B20_DQ_OUT=0;   
   delay_us(60);                           
   DS18B20_DQ_OUT=1;
   delay_us(2);
}

基本的操作完成后,再写4个功能函数

6.读取一个字节
u8 DS18B20_Read_Byte(void)   
{      
   u8 i,j,dat;
   dat=0;
         for(i=1;i<=8;i++)
         {
       j=DS18B20_Read_Bit();
       dat=(j<<7)|(dat>>1);
    }                                                         
   return dat;
}      

7.写一个字节
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_Write_One();
       else
                DS18B20_Write_Zero();
    }
}

8.开始读取数据
void DS18B20_Start(void)
{                                                                  
   DS18B20_Rst();         
         DS18B20_Check();   
   DS18B20_Write_Byte(0xcc);   // skiprom
   DS18B20_Write_Byte(0x44);  //convert
}

9.初始化DS18B20
u8 DS18B20_Init(void)
{
        GPIO_Init();     //此引脚需根据相应的单片机进行配置
         DS18B20_Rst();
         returnDS18B20_Check();
}

10.获取温度值

图7 程序流程图
short DS18B20_Get_Temp(void)
{
   u8 temp;
   u8 TL,TH;
   short tem;
   DS18B20_Start ();           //开始转换
   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)returntem; //返回温度值
         elsereturn -tem;   
}



参考文献:
STM32F103开发指南-标准库版本_V1.1
DS18B20数据手册

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:342081 发表于 2019-4-6 16:31 | 只看该作者
好贴子
回复

使用道具 举报

板凳
ID:410119 发表于 2019-4-10 18:45 | 只看该作者
不错,感谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表