温度传感器DS18B20的使⽤⽅法(以STM32为例)
⼀、DS18B20是什么?
是常⽤的数字温度传感器,其输出的是数字信号,具有体积⼩,硬件开销低,抗⼲扰能⼒强,精度⾼的特点。DS18B20数字温度传感器接线⽅便,封装成后可应⽤于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样。
⼆、主要参数
1.独特的单线接⼝⽅式,DS18B20在与微处理器连接时仅需要⼀条⼝线即可实现微处理器与DS18B20的双向通讯。
2.测温范围 -55℃~+125℃,固有测温误差(注意,不是分辨率,这⾥之前是错误的)1℃。
3.⽀持多点组⽹功能,多个DS18B20可以并联在唯⼀的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从⽽造成信号传输的不稳定。
4.⼯作电源: 3.0~
5.5V/DC (可以数据线寄⽣电源)
网线接线顺序
5.在使⽤中不需要任何外围元件
6.测量结果以9~12位数字量⽅式串⾏传送
7.不锈钢保护管直径 Φ6
8.适⽤于DN15~25, DN40~DN250各种介质⼯业管道和狭⼩空间设备测温
9.标准安装螺纹 M10X1, M12X1.5, G1/2”任选
爱的重量三、基于嵌⼊式的使⽤步骤(以STM32F1X为例)
在我使⽤的STM32F103ZET6中,DS18B20的电源电压选择为3.3V,5V电压不能⼯作。
根据时序图来进⾏配置和初始化。
管脚定义:
#define DS_DQ_PORT GPIOC //数据线
#define DS_DQ_PIN GPIO_Pin_5
下⾯为DS18B20配置的步骤,可以分别封装也可以封装在⼀个函数⾥。
配置输⼊模式(注意端⼝输⼊输出模式的选择):
void DS_DIR_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DS_DQ_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DS_DQ_PORT,&GPIO_InitStructure);
}
配置输出模式:
void DS_DIR_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DS_DQ_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DS_DQ_PORT,&GPIO_InitStructure);
}
复位函数:
uint8_t Ds18b20_Ret(void)
{
uint8_t timeout;
DS_DIR_OUT();
DS_BIT_LOW();
delay_us(600);
DS_BIT_HIGH();
delay_us(60);//最低延时15us 15us-60us
DS_DIR_IN();
//等待DS18B20应答
while(DS_BIT_IN())//等待拉低
{
delay_us(1);
if(++timeout >200)//时间超时
goto Exit;
}
timeout =0;
while(!DS_BIT_IN())//等待拉⾼
{
delay_us(1);
if(++timeout >240)//超时
goto Exit;
}
return0;//成功
Exit:
return0xFF;
}
数据线写0(为了实现DS18B20与主机通信):
void Ds18b20_WR_0(void)
{
DS_BIT_LOW();//拉低
delay_us(70);//最低60 60~120
DS_BIT_HIGH();//拉⾼延时2us
delay_us(2);
}
数据线写1(为了实现DS18B20与主机通信):
void Ds18b20_WR_1(void)
{
DS_BIT_LOW();//拉低
delay_us(15);//延时15秒,最低1us,发送数据起始位DS_BIT_HIGH();//拉⾼,释放总线
delay_us(60);//延时60us,最低60us 最⾼120us
蚕丝被怎么鉴别真假
}
残忍歌词
写Byte:
电饭煲蛋糕做法void Ds18b20_WR_Byte(u8 data)
{
u8 i,temp;
DS_DIR_OUT();//数据线配置为输出
for(i =0; i <8; i++)
{
temp = data&0x01;
if(temp)
Ds18b20_WR_1();//写1
el
Ds18b20_WR_0();//写0
data >>=1;//⼀共8位,从低位开始,然后向右移}
}
读bit:
u8 Ds18b20_RD_Bit(void)
{
u8 val;
DS_DIR_OUT();//数据线配置为输出
DS_BIT_LOW();//拉低
delay_us(2);//延时2us,要求⼤于1us
DS_BIT_HIGH();//拉⾼
DS_DIR_IN();//数据配置为输⼊
delay_us(10);//延时10个us开始采样总线数据
val =0;
if(DS_BIT_IN())
val =1;//如果⾼电平
delay_us(60);
return val;
}
读Byte:
u8 Ds18b20_RD_Byte(void)
{
u8 i,dat;
dat =0;
for(i =0; i <8; i++)
{
dat |=Ds18b20_RD_Bit()<< i;//先读低位
}
return dat;
}
初始化:
u8 Ds18b20_RD_Byte(void)
{
u8 i,dat;
dat =0;
for(i =0; i <8; i++)
{
dat |=Ds18b20_RD_Bit()<< i;//先读低位
}
return dat;
}
读取DS18B20的转换温度:
void Ds18b20_ReadTemper(void)
{
u8 TH,TL;//温度⾼8位低8位
u16 temper;//温度
Ds18b20_Ret();//复位DS18B20总线
Ds18b20_WR_Byte(ROM_SKIP);//写⼀个字节,先写低位(跳过ROM(只读存储器)(0xcc))Ds18b20_WR_Byte(TEMPER_CONVERT);//读⼀个字节,(启动温度转换(0x44))
Ds18b20_Ret();//复位DS18B20
Ds18b20_WR_Byte(ROM_SKIP);//跳过ROM 0xcc
Ds18b20_WR_Byte(RAM_READ);//读RAM中9字节数据(0xbe)
TL =Ds18b20_RD_Byte();//先读低字节真实未删减
TH =Ds18b20_RD_Byte();//读⾼字节
temper =(TH <<8)+ TL;
if(TH >7)//负温度
{
DS18B20_Measure.Temper_plus_minus =1;//标记负温度
temper =(~temper)+1;//求补码
}
el//正温度
{
DS18B20_Measure.Temper_plus_minus =0;//标记正温度
}
泰国清迈DS18B20_Measure.Temperature = temper *6250/10000;//温度计算精度为0.0625;
}
DS18B20.H⽂件:
#define DS_DQ_PORT GPIOC
#define DS_DQ_PIN GPIO_Pin_5
#define DS_BIT_HIGH() GPIO_SetBits(DS_DQ_PORT, DS_DQ_PIN)
#define DS_BIT_LOW() GPIO_RetBits(DS_DQ_PORT, DS_DQ_PIN)
#define DS_BIT_IN() GPIO_ReadInputDataBit(DS_DQ_PORT, DS_DQ_PIN)
#define ROM_READ 0x33
#define ROM_MATCH 0x55
#define ROM_SEARCH 0xF0
#define ROM_SKIP 0xCC
#define ALARM_SEARCH 0xEC
#define TEMPER_CONVERT 0x44
#define RAM_READ 0xBE
#define RAM_WRITE 0x4E
#define RAM_TO_EE 0x48
#define EE_TO_RAM 0xB8
#define POWER_READ 0xB4
typedef struct
{
u32 Temperature;
u8 Temper_plus_minus;
}DS18B20_MEASURE;
怎么治疗咳嗽extern DS18B20_MEASURE DS18B20_Measure;
void DS_DIR_IN(void);
void DS_DIR_OUT(void);
u8 Ds18b20_Ret(void);
void Ds18b20_ReadTemper(void);
u8 Ds18b20_Init(void);