1
一.DS18B20特点
DS18B20 数字温度计提供12位(二进制)温度读数的数字型传感器。传感器仅需要单总线接口与CPU连接,实现信号送入 DS18B20 或从 DS18B20 送出。传感器内部框图如下:
DS18B20内部框图
DS18B20内部RAM图
第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。
二.DS18B20连接图
DS18B20电源连接方式有两种,可通过数据线供电或者电源引脚直接供电;此外,无论哪种连接方式,数据线都需要外置4.7k的上拉电阻。
数据线供电的连接方式
外部电源供电的连接方式
三.DS18B20控制时序分析
1.复位时序
时序见图,主机总线发送一复位脉冲(最短为 480us,最长960us的低电平信号);接着主机将总线拉到高电平,释放总线并进入引脚接收状态;DS18B20 在检测到总线的上升沿之后等待15-60us,接着DS18B20发出存在脉冲(低电平持续 60-240 us) 。主机总线检测到低电平时间在140us内,则检测到DS18B20的应答。
//复位DS18B20
void DS18B20_Rst(void)
{
DS18B20_IO_OUT(); //SET IO OUTPUT
DS18B20_DQ_OUT=0; //拉低DQ
delay_us(750); //拉低750us
DS18B20_DQ_OUT=1; //DQ=1
delay_us(15); //15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void)
{
u8 retry=0;
DS18B20_IO_IN();//SET PA0 INPUT
while (DS18B20_DQ_IN&&retry< 200)
{
retry++;
delay_us(1);
};
if(retry >=200)return 1;
else retry=0;
while (!DS18B20_DQ_IN&&retry< 240)
{
retry++;
delay_us(1);
};
if(retry >=240)return 1;
return 0;
}
2.写时序
当主机总线从高拉至低电平时就产生写时间隙,见图时序图,从下降沿开始15us之内应将所需写的位送到总线上,DS18B20在15-60us间对总线采样,若低电平写入的位是0,若高电平,则写入的位是1,连续写入位数的间隙应大于1us。
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)
{
u8 j;
u8 testb;
DS18B20_IO_OUT();//SET IO OUTPUT;
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat > >1;
if (testb)
{
DS18B20_DQ_OUT=0;// 写入1
delay_us(2);
DS18B20_DQ_OUT=1;
delay_us(60);
}
else
{
DS18B20_DQ_OUT=0;// 写入0
delay_us(60);
DS18B20_DQ_OUT=1;
delay_us(2);
}
}
}
3.读时序
主机总线从高拉至低电平时,总线只须保持低电平1us以上后,将总线拉高,产生读时间隙,如图:
读时间在Trc后到15us内有效,也就是说 t z 时刻前主机必须完成读位,并在 Tinit后的 60us ~ 120 us内释放总线。主机引脚读取总线状态,若低电平读取的位是0,若高电平,则读取的位是1,连续读取位数的间隙应大于1us。
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void) // read one bit
{
u8 data;
DS18B20_IO_OUT();//SET IO OUTPUT
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
DS18B20_IO_IN();//SET IO INPUT
delay_us(12);
if(DS18B20_DQ_IN)data=1;
else data=0;
delay_us(50);
return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void) // read one byte
{
u8 i,j,dat;
dat=0;
for (i=1;i<=8;i++)
{
j=DS18B20_Read_Bit();
dat=(j< < 7)|(dat > >1);
}
return dat;
}
4.读取DS18B20温度值
DS18B20读取温度值步骤如下,其中单个传感器无需匹配ROM,所以程序中跳过匹配ROM。
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); // ds1820 开始转换
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// 跳过匹配ROM
DS18B20_Write_Byte(0xbe);// 转换
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=(float)tem*0.625;//转换
if(temp)return tem; //返回温度值
else return -tem;
}
全部0条评论
快来发表一下你的评论吧 !