单总线温度传感器DS18B20通信

DS18B20是一款单总线通信的温度传感器芯片。也就是说只需要一个GPIO就能实现通信。它的典型应用电路如下图所示。
在这里插入图片描述

下面讲解一下单总线通信协议的实现。
在这里插入图片描述

/*DQ--->P9.7
温度传感器的分辨率可由用户配置为9、10、11或12位,
分别对应0.5℃、0.25 ℃、0.125℃和0.0625℃的增量。
开机时的默认分辨率是12位。*/
#include "ds18b20.h"
uint8 temp[10] = {0};
void Ds18b20_Init(void)
{
    DQ_OUT;//将GPIO配置为输出
    P9OUT |= BIT7;//首先DQ是高电平
    delay_us(15);//延时,等DQ稳定
    P9OUT &= ~BIT7;//拉低
    delay_us(600);//延时大概600US
    P9OUT |= BIT7;//拉高(释放)
    delay_us(15);//15US左右
    delay_us(500);//延时
}

在这里插入图片描述

void Ds18b20_WriteByte(uint8 date)
{   
    uint8 i;
    DQ_OUT;//输出
    for(i=0;i<8;i++)
    {
      //
      if(date&0x01)//写1
      {
      P9OUT &= ~BIT7;
      delay_us(2);
      P9OUT |= BIT7;
      delay_us(60);
      }       
      else//写0
      {
      P9OUT &= ~BIT7;
      delay_us(60);
      P9OUT |= BIT7;//拉高
      delay_us(2);
      } 
      date>>=1;	
    }
   	
}
uint8 ReadByte(void)
{
  uint8 value=0,dat=0;  
  for(uint8 i=0;i<8;i++)
  {
    DQ_OUT;//输出
    P9OUT &= ~BIT7;//拉低
    delay_us(2);
    P9OUT |= BIT7;//拉高   
    DQ_IN;//输入
    delay_us(12);
    if((P9IN&BIT7)==BIT7)
      dat=0x01;
    else
      dat=0x00;
     value=(dat<<7)|(value>>1);	
    delay_us(50);	
  }
  return value;
}

读取温度值

uint8 ReadTemperature(void)
{
  uint8 TH,TL;
  Ds18b20_Init();//初始化
  Ds18b20_WriteByte(0xcc);//跳过ROM
  Ds18b20_WriteByte(0x44);//启动转换
  delay_us(350);
  Ds18b20_Init();//初始化
  Ds18b20_WriteByte(0xcc);//跳过ROM
  Ds18b20_WriteByte(0xbe);//准备读取
  TL=ReadByte();
  TH=ReadByte();
  TL>>=4;//读温度的整数部分
  TH<<=4;
  TH+=TL;
  return (TH);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值