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);
}