一、温度传感器DS18B20介绍
DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点:
采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量。
测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C范围内,精度为 ± 0.5°C 。
在使用中不需要任何外围元件。
持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温。
供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。
测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。
负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。
结构框图:
寄存器MAP:
温度寄存器存储格式:
二、操作时序
1、初始化时序
主机首先发出一个最少480微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。
做为从器件的DS18B20在一上电后就一直在检测总线上是否有至少480微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。
//DS18B20复位
void ds18b20_reset(void)
{
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//DQ-PA1
DS18B20_DQ_OUT_L;
delay_xus(480);//480
DS18B20_DQ_OUT_H;
delay_xus(15); //15us
}
2、写操作时序
写周期最少为60微秒,最长不超过120微秒。若主机想写0,则把总线拉低电平最少60微秒直至写周期结束。若主机想写1,则一开始主机先把总线拉低1微秒表示写周期开始,1微秒后就释放总线为高电平,一直到写周期结束。做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
//向DS18B20写数据
void ds18b20_write(uint8_t data)
{
uint8_t i;
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//DQ-PA1
// for(i = 0; i < 8; i++)
// {
// DS18B20_DQ_OUT_L;
// delay_xus(2);
// DS18B20_DQ_OUT_H;
// delay_xus(2);
// if(data & 0x01)
// {
// DS18B20_DQ_OUT_H;
// }
// else
// {
// DS18B20_DQ_OUT_L;
// }
// delay_xus(50);
// DS18B20_DQ_OUT_H;
// data >>= 1;
// }
for(i = 0; i < 8; i++)
{
if(data & 0x01)
{
DS18B20_DQ_OUT_L;
delay_xus(2);
DS18B20_DQ_OUT_H;
delay_xus(60);
}
else
{
DS18B20_DQ_OUT_L;
delay_xus(60);
DS18B20_DQ_OUT_H;
delay_xus(2);
}
data >>= 1;
}
}
3、读操作时序
对于读数据操作时序也分为读0时序和读1时序两个过程。读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成。
//从DS18B20读取一个bit数据
uint8_t ds18b20_read_bit(void)
{
uint8_t data = 0;
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//DQ-PA1
DS18B20_DQ_OUT_L;
delay_xus(2);
DS18B20_DQ_OUT_H;
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//DQ-PA1
data = DS18B20_DQ_IN;
delay_xus(50);
return data;
}
三、测试效果
工程源代码:
DS18B20 dataset:
参考文档:
STM32F103驱动DS18B20温度传感器(程序注释超详细)
本帖最后由 xinmeng_wit 于 2022-4-4 20:19 编辑