16.STC15W408AS单片机获取DS18B20温度

Posted 小猿猪哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了16.STC15W408AS单片机获取DS18B20温度相关的知识,希望对你有一定的参考价值。

之前在树莓派系列的文章中写过DS18B20获取温度数据。当时树莓派有1-wire接口,可以直接以读文件的形式读取到温度。18.树莓派3B+ 1-wire获取DS18B20温度

现在在STC单片机里面没有这个接口,只能使用GPIO模拟单总线的时序来读取DS18B20的温度数据了。

DS18B20的特点

Unique 1-Wire interface requires only oneport pin for communication

Can be powered from data line. Power supplyrange is 3.0V to 5.5V

Measures temperatures from -55°C to+125°C. Fahrenheit equivalent is -67°F to+257°F

Converts 12-bit temperature to digital word in750 ms (max.)

(引用数据超过了300字,就截取了部分)

上面是DS18B20的主要特点。主要概括起来就是:

  1. 数据读写只需要一个端口;

  2. 电源电压3V~5.5V;

  3. 测量温度范围是-55℃~125℃;

  4. 温度数据可以是9位的,也可以是12位的,12位转换速度最快为750ms;

BS18B20的封装

这里我使用的是To-92封装的,看起来就是一个普通的三极管样子。

关于DS18B20的其他知识大家可以具体去查看数据手册。

DS18B20时序图

1. 复位时序图

主机先发送复位信号,总线拉低,维持480us~960us,再把主机把总线拉高维持15us~60us之后,DS18B20在接收到这个信号之后就会发送一个60us~240us的低电平信号。

2.读写时序

有了上面的复位时序的说明,再看读写数据就好看一点了。需要注意的是哪些是主机发送,哪些是DS18B20发送的。关键的是要注意时间。

// 从DS18B20读1字节数据
u8 DS18B20_ReadByte()

    u8 i;
    u8 dat = 0;
    for (i=0; i<8; i++)       
    
      DQ = 0;     //拉低数据线
      delayus(4);
      dat>>=1;    //空出第一位
      DQ = 1;     //拉高数据线
      delayus(10);
      if(DQ)      //若为高电平,则最高位置一
        dat|=0x80;
      delayus(45);//延时45us
    
    return dat;

// 向DS18B20写1字节数据
void DS18B20_WriteByte(u8 dat)

    u8 i;
    for (i=0; i<8; i++)             //8位计数器
    
      DQ = 0;            //数据线拉低
      delayus(15);
      DQ = dat&0x01; //将数据最低位送入数据线
      delayus(60);      //延时10us
      DQ = 1;            //数据线拉高
      dat>>=1;  
    

剩下的就是读取温度数据了。

//读取DS18B20的温度数据
u16 ReadTemp(void)

  u8 TL,TH;                    //TL:低八位 TH:高八位
  u16 wd;  
           
  DS18B20_Reset();                //设备复位
  DS18B20_WriteByte(0xCC);        //跳过ROM命令
  DS18B20_WriteByte(0x44);        //开始转换命令
  delayus(125);                   
  DS18B20_Reset();                //设备复位
  DS18B20_WriteByte(0xCC);        //跳过ROM命令
  DS18B20_WriteByte(0xBE);        //读暂存存储器命令
  TL= DS18B20_ReadByte();       //读温度低字节
  TH= DS18B20_ReadByte();       //读温度高字节
  wd = (b << 8) | a;
  wd = wd * 0.0625;
// wd = TL/16+TH*16;
  return(wd);

 

以上是关于16.STC15W408AS单片机获取DS18B20温度的主要内容,如果未能解决你的问题,请参考以下文章

16.STC15W408AS单片机获取DS18B20温度

16.STC15W408AS单片机获取DS18B20温度

16.STC15W408AS单片机获取DS18B20温度

16.STC15W408AS单片机获取DS18B20温度

STC15W408AS系列管脚说明

14.STC15W408AS单片机IIC驱动OLED