DS18B20(温度传感器)
其为一款数字温度传感器,测量范围为-55°~125°,本质为一款16位单片机,所以数据位有16位,前5位为符号位,接着7位为整数位,后4位为小数位,由于2^7为126,所以其最大温度为125°,而最小温度为物理性质决定,小数位为4位,所以精度为2^(-4)也就是0.0625°,其有三根引脚,结构图如下:
IO通过主机控制,由于只有一根引脚,只可能用单根线通信的方式来首发数据,选择单总线进行主机与从机数据的收发。
单总线
初始化:
操作:首先将线电位置高,接着将其拉低480us以上,然后释放总线(将其置高)
现象:等待15~60us后,从机会响应一个60~240us的低电平,然后也置高。
发送数据
操作:主机将总线拉低60~120us,表示发送0;拉低1~15us,表示发送1;发送完数据后将总线拉低30us,从机才能接受数据,每次发送时间应该大于60us。
接收数据
操作:主机将总线拉低1~15us,然后释放总线,接着开始读取数据(读取时间尽量靠近拉低的那15us)。
现象:低电平为0,高电平为1.
操作流程:
1.初始化单总线;
2.ROM操作;
一般为跳过ROM(只有一个传感器),即用单总线使主机向从机发送0xCC。
3.功能操作
一般是温度变化,即发送0x44。
接着读取温度,即发送0xBE
接着就可以接收温度了,即使用总线接收数据,接收两个字节(两个八进制数),一个为LSB,第二个为LSB;将两者合并转换,就可以得到温度了。
ROM与功能指令表:
简单代码编写:
初始化代码
int tem_init(void)
{
P3_7=1; //传感器对应GPIO置高
P3_7=0;
delay(480); //延时函数延时480us,自己编写
P3_7=1;
delay(40);
}
直接读取引脚上的电平,如:int a=P3_7;
若值为0,则初始化成功;
设置功能
首先编写主机(单片机)向从机(DS18B20)发送消息的代码
发送一个bit
int sendbit(unsigned char bit)
{
P3_7=1;
P3_7=0;
if(bit==0)
{
delay(100);
}
else if(bit==1)
{
delay(10);
}
}
发送一个字节
int sendbyte(int byte)
{
unsigned char i=0;
for(i;i<8;i++)
{
sendbit(byte&(0x01<<i));
}
}
根据功能表发送所需功能
sendbyte(0xCC);//跳过ROM
sendbyte(0x44);//变化温度
接收信号
首先接收一个bit
int recvbit(void)
{
int a;
P3_7=1;
P3_7=0;
delay(14);
a=P3_7;
delay(45);//凑出60us,因为一帧数据的收发至少60us
return a;
}
接收一位数据
int recvbyte()
{
int i,byte=0;
for(i=0;i<8;i++)
{
if(Recvbit())
{
byte |= 0x01<<i;
}
}
return byte;
}
读取并处理温度
sendbyte(0xBE);//设置读取温度的功能
int showtem()
{
int LSB,MSB,tem;
LSB=recvbyte();
MSB=recvbyte();
tem = (MSB<<8) | LSB;
tem=tem/16.0;//右移,得到10进制温度
}