传感器ds18b20:【常用传感器】DS18B20温度传感器原理详解及例程代码

2021/12/25 01:28 · 传感器知识资讯 ·  · 传感器ds18b20:【常用传感器】DS18B20温度传感器原理详解及例程代码已关闭评论
摘要:

传感器ds18b20:【常用传感器】DS18B20温度传感器原理详解及例程代码数字温度传感器(DS18B20)DS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点。传感器参数测温范围为-55℃

传感器ds18b20:【常用传感器】DS18B20温度传感器原理详解及例程代码  第1张

传感器ds18b20:【常用传感器】DS18B20温度传感器原理详解及例程代码

数字温度传感器(DS18B20)
DS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点。

传感器参数

测温范围为-55℃到+125℃,在-10℃到+85℃范围内误差为±0.4°。

返回16位二进制温度数值

主机和从机通信使用单总线,即使用单线进行数据的发送和接收

在使用中不需要任何外围元件,独立芯片即可完成工作。

掉电保护功能 DS18B20 内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。

每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值

宽电压供电,电压2.5V~5.5V

DS18B20返回的16位二进制数代表此刻探测的温度值,其高五位代表正负。如果高五位全部为1,则代表返回的温度值为负值。如果高五位全部为0,则代表返回的温度值为正值。后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值。

传感器引脚及原理图
DS18B20传感器的引脚及封装图如下:

DS18B20一共有三个引脚,分别是:

GND:电源地线DQ:数字信号输入/输出端。VDD:外接供电电源输入端。

单个DS18B20接线方式: VDD接到电源,DQ接单片机引脚,同时外加上拉电阻,GND接地

注意这个上拉电阻是必须的,就是DQ引脚必须要一个上拉电阻

DS18B20上拉电阻
首先我们要知道什么是漏极开路:

首先看一下 场效应管(MOSFET)

场效应管 是电压控制型元器件,只要对栅极施加一定电压,DS就会导通。

漏极开路:MOS管的栅极G和输入连接,源极S接公共端,漏极D悬空(开路)什么也没有接,直接输出 ,这时只能输出低电平和高阻态,不能输出高电平。

那么这个时候会出现三种情况:

图a为正常输出(内有上拉电阻):场效应管导通时,输出低电位输出低电位,截止时输出高电位。

图b为漏极开路输出,外接上拉电阻:场效应管导通时,驱动电流是从外部的VCC流经电阻通过MOSFET到GND,输出低电位,截止时输出高电位。

图c为漏极开路输出,无外接上拉电阻:场效应管导通时输出低电位,截止呈高阻态(断开)。

总结:

开漏输出只能输出低电平,不能输出高电平。漏极开路输出高电平时必须在输出端与正电源(VCC)间外接一个上拉电阻。否则只能输出高阻态。

DS18B20 是单线通信,即接收和发送都是这个通信脚进行的。 其接收数据时为高电阻输入,其发送数据时是开漏输出,本身不具有输出高电平的能力,即输出0时通过MOS下拉为低电平,而输出1时,则为高阻,需要外接上拉电阻将其拉为高电平。 因此,需要外接上拉电阻,否则无法输出1。

外接上拉电阻阻值:

DS18B20的工作电流约为1mA,VCC一般为5V,则电阻R=5V/1mA=5KΩ,

所以正常选择4.7K电阻,或者相近的电阻值。

DS18B20寄生电源
DSl8B20的另一个特点是不需要再外部供电下即可工作。当总线高电平时能量由单线上拉电阻经过DQ引脚获得。高电平同时充电一个内部电容,当总线低电平时由此电容供应能量。这种供电方法被称为“寄生电源”。另外一种选择是DSl8B20由接在VDD的外部电源供电

DS18B20内部构成
主要由以下3部分组成: 64 位ROM,高速暂存器,存储器

64 位ROM存储独有的序列号

ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。这样就可以实现一根总线上挂接多个DS18B20的目的。

高速暂存器包含:

温度传感器一个字节的温度上限和温度下限报警触发器(TH和TL)配置寄存器允许用户设定9位,10位,11位和12位的温度分辨率,分别对应着温度的分辨率为:0.5°C,0.25°C,0.125°C,0.0625°C,默认为12位分辨率,
存储器:由一个高速的RAM和一个可擦除的EEPROM组成,EEPROM存储高温和低温触发器(TH和TL)以及配置寄存器的值,(就是存储低温和高温报警值以及温度分辨率)

DS18B20高速缓存器
高速暂存器由9个字节组成

字节0~1 是温度存储器,用来存储转换好的温度。第0个字节存储温度低8位,第一个字节存储温度高8位字节2~3 是用户用来设置最高报警和最低报警值(TH和TL)。字节4 是配置寄存器,用来配置转换精度,可以设置为9~12 位。字节5~7 保留位。芯片内部使用字节8 CRC校验位。是64位ROM中的前56位编码的校验码。由CRC发生器产生。

DS18B20温度读取与计算
DS18B20采用16位补码的形式来存储温度数据,温度是摄氏度。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。

高字节的五个S为符号位,温度为正值时S=1,温度为负值时S=0

剩下的11位为温度数据位,对于12位分辨率,所有位全部有效,对于11位分辨率,位0(bit0)无定义,对于10位分辨率,位0和位1无定义,对于9位分辨率,位0,位1,和位2无定义

对应的温度计算:

当五个符号位S=0时,温度为正值,直接将后面的11位二进制转换为十进制,再乘以0.0625(12位分辨率),就可以得到温度值;

当五个符号位S=1时,温度为负值,先将后面的11位二进制补码变为原码(符号位不变,数值位取反后加1),再计算十进制值。再乘以0.0625(12位分辨率),就可以得到温度值;

例如:

+125℃的数字输出07D0( )
 
转换成10进制是2000,对应摄氏度:0.0625x2000=125°C

-55℃的数字输出为 FC90。
  
首先取反,然后+1,转换成原码为:
数值位转换成10进制是870,对应摄氏度:-0.0625x870=-55°C

代码:

配置寄存器
在配置寄存器中,我们可以通过R0和R1设置DS18B20的转换分辨率,DS18B20在上电后默认R0=1和R1=1(12分辨率),寄存器中的第7位和第0位到4位保留给设备内部使用。

单总线系统
在每个DS18B20内部都有一个唯一的64位长的序列号,这个序列号值就存在DS18B20内部的ROM中。开始的8位是产品类型编码(DS18B20是10H),接着的48位是每个器件唯一的序号,最后的8位是CRC校验码。

一线总线系统使用单总线主控来控制一个或多个从机设备。每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值。

DS18B20工作步骤
DS18B20的工作步骤可以分为三步:

1.初始化DS18B20
2.执行ROM指令
3.执行DS18B20功能指令

其中第二步执行ROM指令,也就是访问每个DS18B20,搜索64位序列号,读取匹配的序列号值,然后匹配对应的DS18B20,如果我们仅仅使用单个DS18B20,可以直接跳过ROM指令。而跳过ROM指令的字节是0xCC。

1.初始化DS18B20
任何器件想要使用,首先就是需要初始化,对于DS18B20单总线设备,首先初始化单总线为高电平,然后总线开始也需要检测这条总线上是否存在DS18B20这个器件。如果这条总线上存在DS18B20,总线会根据时序要求返回一个低电平脉冲,如果不存在的话,也就不会返回脉冲,即总线保持为高电平。

初始化具体时序步骤如下:

1.单片机拉低总线至少480us,产生复位脉冲,然后释放总线(拉高电平)。2.这时DS8B20检测到请求之后,会拉低信号,大约60~240us表示应答。3.DS8B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示初始化成功4.DS18B20拉低电平60~240us之后,会释放总线。

代码如下:

2.写时序
总线控制器通过控制单总线高低电平持续时间从而把逻辑1或0写DS18B20中。每次只传输1位数据

单片机想要给DS18B20写入一个0时,需要将单片机引脚拉低,保持低电平时间要在60~120us之间,然后释放总线
单片机想要给DS18B20写入一个1时,需要将单片机引脚拉低,拉低时间需要大于1us,然后在15us内拉高总线.

在写时序起始后15μs到60μs期间,DS18B20处于采样单总线电平状态。如果在此期间总线为高电平,则向DS18B20写入1;如果总线为低电平,则向DSl8B20写入0。

注意:2次写周期之间至少间隔1us

DS18B20写入的功能命令:
ROM指令:

采用多个DS18B20时,需要写ROM指令来控制总线上的某个DS18B20
如果是单个DS18B20,直接写跳过ROM指令0xCC即可

RAM指令,DS18B20的一些功能指令

常用的是:

温度转换 0x44

开启温度读取转换,读取好的温度会存储在高速暂存器的第0个和第一个字节中

读取温度 0xBE
读取高速暂存器存储的数据

读时序
读时隙由主机拉低总线电平至少1μs然后再释放总线,读取DS18B20发送过来的1或者0

DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。

注意:所有读时隙必须至少需要60us,且在两次独立的时隙之间至少需要1ps的恢复时间

同时注意:主机只有在发送读暂存器命令(0xBE)或读电源类型命令(0xB4)后,立即生成读时隙指令,DS18B20才能向主机传送数据。 也就是先发读取指令,再发送读时隙

最后一点: 写时序注意是先写命令的低字节,比如写入跳过ROM指令0xCC(),写的顺序是“零、零、壹、壹、零、零、壹、壹”,

读时序时是先读低字节,在读高字节,也就是先读取高速暂存器的第0个字节(温度的低8位),在读取高速暂存器的第1个字节(温度的高8位) 我们正常使用DS18B20读取温度读取两个温度字节即可

51例程

STM32例程
DS18B20.C

DS18B20.H

传感器ds18b20:【常用传感器】DS18B20温度传感器原理详解及例程代码  第2张

传感器ds18b20:一、数字温度传感器(DS18B20)参数信息介绍

一、数字温度传感器(DS18B20)参数信息介绍
返回16位二进制温度数值
主机和从机通信使用单总线one-wire,即使用单线进行数据的发送和接收
电源可以使用数据线本身提供而不需要外部电源,但在实际应用过程中,确保DS18B20能够获得充足的驱动电流,成为能够返回二进制温度数值的关键。接线模式下文介绍。
每个DS18B20都有全球唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值
DS18B20的测温范围也极其宽泛,测温范围为-55到+125,每秒增量为0.5
DS18B20返回的16位二进制数代表此刻探测的温度值,其高五位代表正负。如果高五位全部为1,则代表返回的温度值为负值。如果高五位全部为0,则代表返回的温度值为正值。后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值。
返回温度值正负与绝对值区分布返回二进制温度值分布封装形式引脚功能描述二、DS18B20的工作过程即时序
DS18B20所有的操作都是从器件初始化开始
ROM操作指令:
Read ROM(读 ROM) [33H]
Match ROM(匹配 ROM) [55H]
Skip ROM(跳过 ROM] [CCH]
Search ROM(搜索 ROM) [F0H]
Alarm search(告警搜索) [ECH]
读时序
写时序
存储器操作指令:
Write Scratchpad(写暂存存储器) [4EH]
Read Scratchpad(读暂存存储器) [BEH]
Copy Scratchpad(复制暂存存储器) [48H]
Convert Temperature(温度变换) [44H]
Recall EPROM(重新调出) [B8H]
Read Power supply(读电源) [B4H]

三、常见接线方式
单只DS18B20接线示意图
vpU提供单片机输出电压 3.3v
多只DS18B20接线示意图
VPU提供单片机输出电压3.3V
寄生电源模式接线示意图
不需要额外供电? 只需要数据线提供驱动电流四、详细程序
//复位DS18B20
void DS18B20_Rst(void) ? ?
{? ? ? ? ? ? ? ? ?
DS18B20_IO_OUT(); //SET PG11 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 PG11 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;
}
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void) ?
{
? ? u8 data;
DS18B20_IO_OUT(); //SET PG11 OUTPUT
? ? DS18B20_DQ_OUT=0;?
delay_us(2);
? ? DS18B20_DQ_OUT=1;?
DS18B20_IO_IN(); //SET PG11 INPUT
delay_us(12);
if(DS18B20_DQ_IN)data=1;
? ? else data=0; ?
? ? delay_us(50);? ? ? ? ? ?
? ? return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void)? ? ?
{? ? ?
? ? u8 i,j,dat;
? ? dat=0;
for (i=1;i<=8;i++)? { ? ? ? ? j=DS18B20_Read_Bit(); ? ? ? ? dat=(j<<7)|(dat>>1);
? ? } ?
? ? return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)? ? ?
?{? ? ? ? ? ? ?
? ? u8 j;
? ? u8 testb;
DS18B20_IO_OUT(); //SET PG11 OUTPUT;
? ? for (j=1;j<=8;j++)? { ? ? ? ? testb=dat&0x01; ? ? ? ? dat=dat>>1;
? ? ? ? if (testb)?
? ? ? ? {
? ? ? ? ? ? DS18B20_DQ_OUT=0; // Write 1
? ? ? ? ? ? delay_us(2);? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? DS18B20_DQ_OUT=1;
? ? ? ? ? ? delay_us(60);? ? ? ? ? ? ?
? ? ? ? }
? ? ? ? else?
? ? ? ? {
? ? ? ? ? ? DS18B20_DQ_OUT=0; // Write 0
? ? ? ? ? ? delay_us(60);? ? ? ? ? ? ?
? ? ? ? ? ? DS18B20_DQ_OUT=1;
? ? ? ? ? ? delay_us(2);? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? }
? ? }
}
//开始温度转换
void DS18B20_Start(void)?
{? ? ? ? ? ? ? ? ? ?
? ? DS18B20_Rst(); ? ?
DS18B20_Check(); ?
? ? DS18B20_Write_Byte(0xcc); // skip rom
? ? DS18B20_Write_Byte(0x44); // convert
}?
//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在? ? ?
u8 DS18B20_Init(void)
{
? GPIO_InitTypeDef? GPIO_InitStructure;
?
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能PORTG口时钟?
//
// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11; //PORTG.11 推挽输出
// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
// GPIO_Init(GPIOG, &GPIO_InitStructure);
// GPIO_SetBits(GPIOG,GPIO_Pin_11);? ? //输出1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
? GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
? GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
? GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
? GPIO_Init(GPIOA, &GPIO_InitStructure);
? GPIO_SetBits(GPIOA,GPIO_Pin_1);? ? //输出1
DS18B20_Rst();
return DS18B20_Check();
}
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)?
short DS18B20_Get_Temp(void)
{
? ? u8 temp;
? ? u8 TL,TH;
short tem;
? ? DS18B20_Start ();? // ds1820 start convert
? ? DS18B20_Rst();
? ? DS18B20_Check(); ?
? ? DS18B20_Write_Byte(0xcc); // skip rom
? ? DS18B20_Write_Byte(0xbe); // convert ?
? ? 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;? } //从ds18b20得到序列号 void DS18B20_Get_Code(u8 *code) { ? ? DS18B20_Start ();? // ds1820 start convert ? ? DS18B20_Rst(); delay_ms(1); ? ? DS18B20_Write_Byte(0x33); // convert ? for(int i=0;i<8;i++) { *(code+i)=DS18B20_Read_Byte(); ? ? ? ? ? ? } } //获得温度,匹配序列号 u16? Get_Temp_U16_Match_Code(u8 *code) { ? ?u16 temp; ? ? u8 TL,TH; DS18B20_Start();? // ds1820 start convert DS18B20_Rst(); delay_ms(2); DS18B20_Write_Byte(0x55); // 匹配序列号命令 for(int i=0;i<8;i++) { DS18B20_Write_Byte(code[i]); } DS18B20_Write_Byte(0xbe); // convert ? TL=DS18B20_Read_Byte(); // LSB? ? ? ? TH=DS18B20_Read_Byte(); // MSB temp?=(u16)TH<<8; temp |=TL; return temp; } //获得温度,匹配序列号 short? Get_Temp_Match_Code(u8 *code) { u16 temp; ? ? u8 TL,TH; short tem; DS18B20_Rst(); DS18B20_Start ();? // ds1820 start convert DS18B20_Rst(); delay_ms(1); DS18B20_Write_Byte(0x55); // 匹配序列号命令 for(int i=0;i<8;i++) { DS18B20_Write_Byte(code[i]); } DS18B20_Write_Byte(0xbe); // convert ? 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;? } ? 在最近的DS18B20的使用过程中,所遇到的诸多问题如下 多个DS18B20挂载在一条总线,再通过ROM搜索时会存在单个或者多个DS18B20初始化不成功,需要不断更换DS18B20直至,能够通过ROM搜索完成所有DS18B20温度数值的读取,这种挂载同根总线上的DS18B20无法顺利使用任意多个DS18B20实现,实在让人困扰 传感器ds18b20:【常用传感器】DS18B20温度传感器原理详解及例程代码  第3张

传感器ds18b20:单线数字温度传感器DS18B20以及ArduinoDS18B20接口的工作原理

相关推荐

Arduino成长日记1 - Arduino预备知识

涉及电子专业或行业的人都多少听说过Arduino这个词汇,那么…何为Arduino?!Arduino....

发表于 11-05 19:05 ?

2次
阅读

【物联网】14.物联网设备控制器选择 - MCU(单片机)

这部分就是我之前分享过很多的单片机部分,具体可以参考专栏

发表于 11-05 16:21 ?

3次
阅读

RTD温度传感器在选型和应用时的注意事项

RTD(电阻温度探测器)是一种传感器,其阻值会随着温度的升高而变大,随着温度的降低而减小。RTD器件....

得捷电子DigiKey 发表于 11-05 14:21 ?

112次
阅读

PH 传感器说明书FOR Arduino 2.0免费下载

PH 传感器说明书FOR Arduino 2.0免费下载

发表于 11-05 09:30 ?

5次
阅读

蓝桥杯之单片机设计与开发(19)——DS18B20

温度传感器DS18B20DS18B20是美信公司的一款温度传感器,单片机可以通过1-Wire协议与D....

发表于 11-04 17:21 ?

13次
阅读

基于51单片机液晶万年历设计

电子万年历是一种非常广泛日常计时工具,给人们的带来了很大的方便,在社会上越来越流行。 它可以对年、月....

发表于 11-04 13:51 ?

4次
阅读

基于单片机的温度计设计

文末下载完整资料摘要:随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经....

发表于 11-04 12:21 ?

5次
阅读

大联大品佳集团推出基于Infineon产品的低成本汽车照明通用单片机解决方案

本方案的核心是PSoC4200M芯片,该芯片基于Cypress PSoC4平台设计,是一款扩展性极强....

发表于 11-04 10:49 ?

469次
阅读

如何获取DS18B20温度传感器数据?

如何获取DS18B20温度传感器数据?

发表于 11-03 07:24 ?

0次
阅读

请问一下Arduino单片机有何功能呢

Arduino IDE是什么?请问一下Arduino单片机有何功能呢?...

发表于 11-02 09:09 ?

0次
阅读

Arduino和单片机的关系是什么?

什么是单片机?单片机有什么用?
什么是Arduino?Arduino种类有哪些?
Arduino和单片机的关系是什么?...

发表于 11-02 06:33 ?

0次
阅读

基于arduino的STM32的FreeRTOS库

基于arduino的STM32的FreeRTOS库

发表于 11-01 17:54 ?

17次
阅读

如何在arduino IDE上安装STM32的开发板工具包

如何在arduino IDE上安装STM32的开发板工具包

发表于 11-01 17:51 ?

10次
阅读

远程控制开关-Nodemcu+Relay(nodemcu+继电器)

远程控制开关-Nodemcu+Relay硬件nodemcu一个继电器一个杜邦线3根继电器信号端接在n....

发表于 11-01 16:26 ?

17次
阅读

Nodemcu如何用arduino联网的

搭建开发环境转载: 转载.联网转载: 转载.

发表于 11-01 09:27 ?

0次
阅读

如何去读取基于arduino Nodemcu的DS18B20呢

/************************************************************** * Multiple Temperature Sendor Test * *&nb...

发表于 11-01 09:16 ?

0次
阅读

Arduino系列单片机有哪几种?

Arduino系列单片机有哪几种?

发表于 11-01 08:00 ?

0次
阅读

NodeMCU开发板烧录程序的方法,错过后悔

NodeMCUNodeMCU,是一个开源的物联网平台。 它使用Lua脚本语言编程。该平台基于eLua开源项目,底层使用ESP8266 sdk 0...

发表于 11-01 07:31 ?

0次
阅读

如何对arduino中的nodemcu板进行配置

一、搭建环境1.在安装完毕Arduino IDE后,打开文件->首选项,在窗口中的 附加开发板管理器网址 复制以下网址,确定后关闭Ar...

发表于 11-01 07:19 ?

0次
阅读

Arduino/ESP8266与NodeMCU的相关资料分享

1. ArduinoArduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(ArduinoIDE)。...

发表于 11-01 06:33 ?

0次
阅读

NodeMCU V3.0 Arduino开发之点灯测试程序

NodeMCU V3.0 Arduino开发之点灯测试程序手头到了一个NodeMCU v3.0,3.0版本和2.0差别不大,只是v2.0串口芯片是CP21...

发表于 11-01 06:29 ?

0次
阅读

ADI热电偶测量方案

LTC298X测量各种温度传感器并数字输出结果(以°C或°F为单位),具有0.1°C精度和 0.00....

发表于 10-28 14:40 ?

1454次
阅读

使用Blinker APP+NodeMCU控制多路接口

上一期介绍了如何使用语音助手控制多路接口,这一期将为大家介绍如何使用官方提供的APP控制多路接口。1....

发表于 10-28 12:36 ?

4次
阅读

NodeMCU+DHT11测温度(bliker+IIC1602显示)

NodeMCU+DHT11测温度(bliker+IIC1602显示)所需硬件硬件连线IDE代码效果1....

发表于 10-28 12:06 ?

5次
阅读

NodeMCU(ESP-12E)+阿里云实现数据上传和控制继电器开锁

源码及工具下载:

发表于 10-28 12:06 ?

4次
阅读

NodeMcu---DS18B20

DS18B20材料:NodeMcu,DS18B20模块(三线),杜邦线三根(母对母)`。软件:Ard....

发表于 10-28 11:51 ?

15次
阅读

基于MacOS的ESP8266 NodeMCU开发环境搭建(转载整理)

前言前段时间一直使用Windows进行ESP8266的Nonos SDK开发,由于使用的安信可提供的....

发表于 10-28 11:21 ?

8次
阅读

Nodemcu+ESP8266实现WEB控制家用电器

一,教程目的通过Nodemcu+ESP8266通过网页去控制继电器以及灯泡。二,实验环境操作系统: ....

发表于 10-28 11:06 ?

10次
阅读

Arduino-ESP8266 NodeMCU的UDP通信

Arduino-ESP8266 NodeMCU的UDP通信1.环境准备2.代码编写3.串口及网络调试....

发表于 10-28 11:06 ?

14次
阅读

NodeMcu ESP8266 无需任何基础 制作wifi小车

NodeMcu ESP8266 无需任何基础 制作wifi小车 简介硬件连线代码在手机上下载 TCP....

发表于 10-28 10:21 ?

20次
阅读

通过NodeMcu电机拓展板控制两个直流电机

接线方式通过图片可以得知,A+、A-、B+、B-控制电机的方向和电机的转速,且对应的引脚为D1、D2....

发表于 10-28 10:06 ?

4次
阅读

关于ESP8266-NodeMCU和onenet通信传输学习总结

关于ESP8266-NodeMCU和onenet通信传输学习总结1.ESP8266-NodeMCU简....

发表于 10-28 09:41 ?

10次
阅读

【arduino】nodemcu连接阿里云上传温湿度

本博客是使用nodemcu连接温湿度传感器,并上传数据到阿里云。#include "DHT.h" ....

发表于 10-26 20:05 ?

16次
阅读

ESP8266 nodemcu使用arduino编程点亮OLED测试

ESP8266 nodemcu使用arduino编程点亮OLED测试芯片了解ESP8266 node....

发表于 10-26 18:21 ?

32次
阅读

ESP8266 NodeMCU开发板连接手机热点问题

ESP8266 NodeMCU开发板连接手机热点问题前言:众所周知,esp是构建一个IOT工程里得力....

发表于 10-26 15:36 ?

31次
阅读

基于nodemcu开发板与DHT11获取温湿度数值

本文将讲述如何使用nodemcu开发板与DHT11温湿度传感器获取当前环境温湿度数据,并从串口打印出....

发表于 10-26 14:50 ?

23次
阅读

基于NodeMCU的简易TCP连接

基于NodeMCU的简易TCP连接1)在arduino上安装esp8266模块1.点击首选项2.在网....

发表于 10-26 11:21 ?

10次
阅读

WeMOS D1 MIni(Esp8266)、NodeMCU与ST7789 TFT液晶显示屏绘制图形

WeMOS D1 MIni与ST7789 FTF液晶显示屏材料硬件连接图库安装源代码示例材料硬件连接....

发表于 10-26 10:06 ?

29次
阅读

基于 arduino Nodemcu 读取DS18B20

/*************************************************....

发表于 10-25 20:51 ?

23次
阅读

NodeMCU测量电压的简单算法

float ADC(char A) { float red=map(analogRead(A)....

发表于 10-25 20:36 ?

12次
阅读

nodemcu+DHT11上传数据到自己的远程服务器

#include #include #include "DHT11.h" #include "s....

发表于 10-25 20:21 ?

12次
阅读

在PlatformIO中使用ESP-12K开发板Nodemcu-32-S2

在PlatformIO中使用ESP-12K开发板在PlatformIO中使用ESP-12K开发板no....

发表于 10-25 19:51 ?

17次
阅读

tft_espi和nodemcu连接

1、 下载tft_espi库

发表于 10-25 19:51 ?

6次
阅读

基于Arduino+nodemcu+blink的智能家居系统

基于Arduino+nodemcu+blink的智能家居系统#此篇为代码部分,实物视频演示在下面这个....

发表于 10-25 19:21 ?

22次
阅读

Arduino NodeMCU IIC复用案列之双OLED

Arduino NodeMCU I2C复用案列之双OLED

发表于 10-25 17:51 ?

26次
阅读

无线测温装置在中航光电新建厂房项目应用

安科瑞 黄飞蓉 摘要:温度是表征电力一次设备运行正常的一个重要参数。随着用电量的急剧增长,为了满足用....

发表于 10-25 17:08 ?

60次
阅读

NodeMCU开发板烧录程序两种方法介绍

NodeMCUNodeMCU,是一个开源的物联网平台。 它使用Lua脚本语言编程。该平台基于eLua....

发表于 10-25 13:51 ?

27次
阅读

tft连接nodemcu 2

这次入手了一块2.4寸的“大屏”lcd,240*320.。。。大不大。。。我觉得一般大驱动是是ili....

发表于 10-25 13:51 ?

22次
阅读

ESP8266NodeMcu网页控制四个LED页面

代码在太极创客教程基础上进行添加和修改,以下是源代码和增添D1、D2、D3引脚后的代码。原代码项目名....

发表于 10-25 13:06 ?

20次
阅读

使用Arduino开发NodeMcu

NodeMcu的基本介绍,使用Aduino进行开发,使用NodeMcu运行亮灯、打印窗口消息等例子。

发表于 10-25 12:51 ?

27次
阅读

Arduino、ESP8266与NodeMCU

1. ArduinoArduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的A....

发表于 10-25 12:21 ?

29次
阅读

node mcu上使用ad转换

因为node mcu只有一个ad转换的接口即A0所以我们将对应设备接在A0即可#define ADC....

发表于 10-25 12:21 ?

11次
阅读

ESP8266 NodeMCU引脚说明

问题开发ESP8266 NodeMCU GPIO功能时,作为小白的我根本不知道引脚编号,虽然知道ES....

发表于 10-25 11:36 ?

28次
阅读

ESP8266 Nodemcu学习心得②

ESP8266 Nodemcu学习心得②一、库函数记录二、代码学习1、创建一个网络服务器一、库函数记....

发表于 10-25 11:36 ?

23次
阅读

NodeMCU连接SD读卡器

在有些应用中,NodeMCU不连接SD卡怎么行。但没有找到相应的文档,或许这在玩家眼里这事太容易了,....

发表于 10-25 10:06 ?

16次
阅读

单串口服务器连接温度传感器通讯介绍

单串口服务器连接温度传感器通讯 1.概述 目前单串口接口的温度传感器可以通过上海卓岚生产的单串口服务....

发表于 10-21 18:05 ?

109次
阅读

探究TDK TPS4000系列工业电源和Molex NTC温度传感器电缆组件

本期向大家推介两款产品——TDK的TPS4000系列三相4080W工业电源和Molex接线片温度传感....

得捷电子DigiKey 发表于 10-19 11:18 ?

426次
阅读

温度传感器电路原理(数字温度传感器电路 pt100温度传感器电路 LM35温度传感器)

温度传感器是指能感受温度并转换成可用输出信号的传感器。温度传感器是温度测量仪表的核心部分,品种繁多。

发表于 10-19 09:41 ?


阅读

浅析传感器的定义及分类

传感器其实就是一种检测装置。

工程师邓生 发表于 10-19 09:07 ?

454次
阅读

R-8949-34 R-8949-34 RTD 探针和组件

看产品文档,或?联系我们?以了解最新的机构审批信息。?

产品类型特性

传感器类型?:
定子

元件材料?:

引线导线种类?:
标准 PTFE

使用环境

最大温度?:
155?°C?[?311?°F?]

包装特性

元件包装?:
玻璃纤维主体...

发表于 08-21 00:00 ?

23次
阅读

SB0789 SB0789 RTD 传感器元件

看产品文档,或?联系我们?以了解最新的机构审批信息。?

产品类型特性

型号?:
GO 1020

RTD 元件类型?:
铂金玻璃线绕元件

元件材料?:

引线导线种类?:
镍/铂金

导线/覆层类型?:
Ni/Pt

结构特性

连接器类型?:
开口端

尺寸

长度(主体)?:
10?mm?[?.39?in?]

线径?:
.25?mm?[?.009?in?]

直径(主体)?:
2?mm?[?.078?in?]

导线长度?(mm):
15

使用环境

电阻的参考温度?(°C...

发表于 08-20 23:00 ?

36次
阅读

-00 -00 热电偶温度传感器

看产品文档,或?联系我们?以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?:
Type J Thermocouple

热电偶类型?:
J

型号?:
200

导线/覆层类型?:
铁/康铜

结构特性

热电偶传感器连接器类型?:
Mini Flat Pin Thermocouple

尺寸

导线长度?:
914?mm?[?36?in?]

直径?:
3.18?mm?[?.125?in?]

长度?:
76.2?mm?[?3?in?]

使用环境

环境温度范围?:
-50 – 250?°C?[?-58 – 482?°F?]

误差极限/温度精确度?:
...

发表于 08-20 21:00 ?

15次
阅读

CAT-TCS0030 CAT-TCS0030 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
231, 232

参考编号

TE 内部编号
CAT-TCS0030

发表于 07-31 15:00 ?

14次
阅读

CAT-TCS0031 CAT-TCS0031 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
1022

参考编号

TE 内部编号
CAT-TCS0031

发表于 07-31 14:00 ?

12次
阅读

CAT-TCS0032 CAT-TCS0032 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
1023

参考编号

TE 内部编号
CAT-TCS0032

发表于 07-31 14:00 ?

10次
阅读

CAT-TCS0003 MODEL 201 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
201

结构特性

热电偶传感器连接器类型?
Stripped Lead Ends

尺寸

直径?(in)
.125, .188, .25

使用环境

误差极限/温度精确度?
标准限制/+- 1 °C, 特殊误差极限

包装特性

热电偶传感器包装?
Stainless Steel Probe with 1/2NPT compression fitting, Stainless S...

发表于 07-29 20:00 ?

36次
阅读

CAT-TCS0004 MODEL 202 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
ANDO-202

结构特性

热电偶传感器连接器类型?
Miniature Jack, Miniature Plug, Miniature Plug and Jack, Standard Jack, Standard Plug, Standard Plug and Jack

尺寸

直径?(in)
.125, .188, .25

使用环境

误差极限/温度精确度?
标准限制/+- 1 °C, 特殊误差极限

包装特性

...

发表于 07-29 20:00 ?

35次
阅读

CAT-TCS0005 MODEL 203 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
203

尺寸

直径?(in)
.125, .188, .25

使用环境

误差极限/温度精确度?
标准限制/+- 1 °C, 特殊误差极限

包装特性

热电偶传感器包装?
Stainless Steel Probe

其他

接线接地?
已接地, 未接地

参考编号

TE ...

发表于 07-29 20:00 ?

33次
阅读

CAT-TCS0006 MODEL 415,416,417,418 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
ANDO-415, ANDO-416, ANDO-417, ANDO-418

使用环境

环境温度范围?
-100 – 250?°C?[?-148 – 482?°F?]

误差极限/温度精确度?
标准限制/+- 1 °C, 特殊误差极限

包装特性

热电偶传感器包装?
With Feedthrough, Without Feedthrough

其他

接线接地?
已接地, 未接地

参考编号

...

发表于 07-29 20:00 ?

29次
阅读

CAT-TCS0007 MODEL 624 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
624

尺寸

直径?(in)
.125, .156

长度?(in)
.75

使用环境

环境温度范围?
-100 – 250?°C?[?-148 – 482?°F?]

误差极限/温度精确度?
标准限制/+- 1 °C, 特殊误差极限

其他

接线接地?
已接地, 未接地

参考编号

TE 内部编号
CAT-TCS00...

发表于 07-29 20:00 ?

40次
阅读

CAT-NTC0040 GLASS SERIES THERMISTOR SERIES 分离式 NTC

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

分离式 NTC 传感器类型?
NTC 热敏电阻

型号?
玻璃 系列热敏电阻系列

公差 β 值?(%)
±.5

主体特性

导线连接?
开口端

尺寸

分离式 NTC 导线长度?(mm)
76

使用环境

电阻公差?(%)
± .94

分离式 NTC 环境温度范围?(°C)
-40 – 200

电阻的参考温度?(°C)
25

温度精确度?(°C)
± .2 (0 – 70), ± .2 (0 – 70)

...

发表于 07-29 17:00 ?

12次
阅读

CAT-TCS0022 CAT-TCS0022 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
412A

导线/覆层类型?
实芯 TFE

结构特性

热电偶传感器连接器类型?
Stripped Lead Ends

参考编号

TE 内部编号
CAT-TCS0022...

发表于 07-28 20:00 ?

33次
阅读

CAT-TCS0023 CAT-TCS0023 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
413

导线/覆层类型?
实芯 TFE

结构特性

热电偶传感器连接器类型?
Stripped Lead Ends

参考编号

TE 内部编号
CAT-TCS0023...

发表于 07-28 20:00 ?

30次
阅读

CAT-TCS0024 CAT-TCS0024 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
210H, 210M

导线/覆层类型?
实芯 TFE

结构特性

热电偶传感器连接器类型?
Stripped Lead Ends

参考编号

TE 内部编号
CAT-TCS0024...

发表于 07-28 20:00 ?

33次
阅读

CAT-TCS0025 CAT-TCS0025 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
211H, 211M

导线/覆层类型?
实芯 TFE

结构特性

热电偶传感器连接器类型?
Stripped Lead Ends

参考编号

TE 内部编号
CAT-TCS0025...

发表于 07-28 20:00 ?

26次
阅读

CAT-TCS0026 CAT-TCS0026 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
220H, 220M

导线/覆层类型?
实芯 TFE

结构特性

热电偶传感器连接器类型?
Stripped Lead Ends

参考编号

TE 内部编号
CAT-TCS0026...

发表于 07-28 20:00 ?

23次
阅读

CAT-TCS0027 CAT-TCS0027 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
221H, 221M

导线/覆层类型?
实芯 TFE

结构特性

热电偶传感器连接器类型?
Stripped Lead Ends

参考编号

TE 内部编号
CAT-TCS0027...

发表于 07-28 20:00 ?

35次
阅读

CAT-TCS0028 CAT-TCS0028 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
222H, 222M

导线/覆层类型?
实芯 TFE

结构特性

热电偶传感器连接器类型?
Stripped Lead Ends

参考编号

TE 内部编号
CAT-TCS0028...

发表于 07-28 20:00 ?

27次
阅读

CAT-TCS0029 CAT-TCS0029 热电偶温度传感器

看产品文档或联系我们以了解最新的机构审批信息。?

产品类型特性

热电偶传感器类型?
Thermocouple

热电偶类型?
E, J, K, T

型号?
230H, 230M

参考编号

TE 内部编号
CAT-TCS0029

发表于 07-28 20:00 ?

32次
阅读

传感器ds18b20:温度传感器DS18B20

DS18B20 是美信公司的一款温度传感器,单片机可以通过 1-Wire 协议与 DS18B20 进行通信,最终将温度读出。1-Wire 总线的硬件接口很简单,只需要把 DS18B20 的数据引脚和单片机的一个 IO 口接上就可以了。硬件的简单,随之而来的,就是软件时序的复杂。1-Wire总线的时序比较复杂,很多同学在这里独立看时序图都看不明白,所以这里还要带着大家来研究 DS18B20 的时序图。我们先来看一下 DS18B20 的硬件原理图,如图 16-12 所示。
图 16-12 DS18B20 电路原理图
DS18B20 通过编程,可以实现最高 12 位的温度存储值,在寄存器中,以补码的格式存储,如图 16-13 所示。
图 16-13 DS18B20 温度数据格式
一共 2 个字节,LSB 是低字节,MSB 是高字节,其中 MSb 是字节的高位,LSb 是字节的低位。大家可以看出来,二进制数字,每一位代表的温度的含义,都表示出来了。其中 S表示的是符号位,低 11 位都是 2 的幂,用来表示最终的温度。DS18B20 的温度测量范围是从-55 度到+125 度,而温度数据的表现形式,有正负温度,寄存器中每个数字如同卡尺的刻度一样分布,如图 16-14 所示。
图 16-14 DS18B20 温度值
二进制数字最低位变化 1,代表温度变化 0.0625 度的映射关系。当 0 度的时候,那就是0x0000,当温度 125 度的时候,对应十六进制是 0x07D0,当温度是零下 55 度的时候,对应的数字是 0xFC90。反过来说,当数字是 0x0001 的时候,那温度就是 0.0625 度了。
首先,我先根据手册上 DS18B20 工作协议过程大概讲解一下。
1) 初始化
和 I2C 的寻址类似,1-Wire 总线开始也需要检测这条总线上是否存在 DS18B20这个器件。如果这条总线上存在 DS18B20,总线会根据时序要求返回一个低电平脉冲,如果不存在的话,也就不会返回脉冲,即总线保持为高电平,所以习惯上称之为检测存在脉冲。此外,获取存在脉冲不仅仅是检测是否存在 DS18B20,还要通过这个脉冲过程通知 DS18B20准备好,单片机要对它进行操作了,如图 16-15 所示。
图16-15 检测存在脉冲
大家注意看图,实粗线是我们的单片机 IO 口拉低这个引脚,虚粗线是 DS18B20 拉低这个引脚,细线是单片机和 DS18B20 释放总线后,依靠上拉电阻的作用把 IO 口引脚拉上去。这个我们前边提到过了,51 单片机释放总线就是给高电平。
存在脉冲检测过程,首先单片机要拉低这个引脚,持续大概 480us 到 960us 之间的时间即可,我们的程序中持续了 500us。然后,单片机释放总线,就是给高电平,DS18B20 等待大概 15 到 60us 后,会主动拉低这个引脚大概是 60 到 240us,而后 DS18B20 会主动释放总线,这样 IO 口会被上拉电阻自动拉高。
有的同学还是不能够彻底理解,程序列出来逐句解释。首先,由于 DS18B20 时序要求非常严格,所以在操作时序的时候,为了防止中断干扰总线时序,先关闭总中断。然后第一步,拉低 DS18B20 这个引脚,持续 500us;第二步,延时 60us;第三步,读取存在脉冲,并且等待存在脉冲结束。
bit Get18B20Ack(){
bit ack;
EA=0; //禁止总中断
IO_18B20=0; //产生 500us 复位脉冲
DelayX10us(50);
IO_18B20=1;
DelayX10us(6); //延时 60us
ack=IO_18B20; //读取存在脉冲
while(!IO_18B20); //等待存在脉冲结束
EA=1; //重新使能总中断
return ack;
}
很多同学对第二步不理解,时序图上明明是 DS18B20 等待 15us 到 60us,为什么要延时60us 呢?举个例子,妈妈在做饭,告诉你大概 5 分钟到 10 分钟饭就可以吃了,那么我们什么时候去吃,能够绝对保证吃上饭呢?很明显,10 分钟以后去吃肯定可以吃上饭。同样的道理,DS18B20 等待大概是 15us 到 60us,我们要保证读到这个存在脉冲,那么 60us 以后去读肯定可以读到。当然,不能延时太久,太久,超过 75us,就可能读不到了,为什么是 75us,大家自己思考一下。
2) ROM 操作指令
我们学 I2C 总线的时候就了解到,总线上可以挂多个器件,通过不同的器件地址来访问不同的器件。同样,1-Wire 总线也可以挂多个器件,但是它只有一条线,如何区分不同的器件呢?
在每个 DS18B20 内部都有一个唯一的 64 位长的序列号,这个序列号值就存在 DS18B20内部的 ROM 中。开始的 8 位是产品类型编码(DS18B20 是 0x10),接着的 48 位是每个器件唯一的序号,最后的 8 位是 CRC 校验码。DS18B20 可以引出去很长的线,最长可以到几十米,测不同位置的温度。单片机可以通过和 DS18B20 之间的通信,获取每个传感器所采集到的温度信息,也可以同时给所有的 DS18B20 发送一些指令。这些指令相对来说比较复杂,而且应用很少,所以这里大家有兴趣的话就自己去查手册完成吧,我们这里只讲一条总线上只接一个器件的指令和程序。
Skip ROM(跳过 ROM):0xCC。当总线上只有一个器件的时候,可以跳过 ROM,不进行 ROM 检测。
3) RAM 存储器操作指令
RAM 读取指令,只讲 2 条,其它的大家有需要可以随时去查资料。
Read Scratchpad(读暂存寄存器):0xBE
这里要注意的是,DS18B20 的温度数据是 2 个字节,我们读取数据的时候,先读取到的是低字节的低位,读完了第一个字节后,再读高字节的低位,直到两个字节全部读取完毕。
Convert Temperature(启动温度转换):0x44
当我们发送一个启动温度转换的指令后,DS18B20 开始进行转换。从转换开始到获取温度,DS18B20 是需要时间的,而这个时间长短取决于 DS18B20 的精度。前边说 DS18B20 最高可以用 12 位来存储温度,但是也可以用 11 位,10 位和 9 位一共四种格式。位数越高,精度越高,9 位模式最低位变化 1 个数字温度变化 0.5 度,同时转换速度也要快一些,如图 16-16所示。
图 16-16 DS18B20 温度转换时间
其中寄存器 R1 和 R0 决定了转换的位数,出厂默认值就 11,也就是 12 位表示温度,最大的转换时间是 750ms。当启动转换后,至少要再等 750ms 之后才能读取温度,否则读到的温度有可能是错误的值。这就是为什么很多同学读 DS18B20 的时候,第一次读出来的是 85度,这个值要么是没有启动转换,要么是启动转换了,但还没有等待一次转换彻底完成,读到的是一个错误的数据。
4) DS18B20 的位读写时序
DS18B20 的时序图不是很好理解,大家对照时序图,结合我的解释,一定要把它学明白。写时序图如图 16-17 所示。
图 16-17 DS18B20 位写入时序
当要给 DS18B20 写入 0 的时候,单片机直接将引脚拉低,持续时间大于 60us 小于 120us就可以了。图上显示的意思是,单片机先拉低 15us 之后,DS18B20 会在从 15us 到 60us 之间的时间来读取这一位,DS18B20 最早会在 15us 的时刻读取,典型值是在 30us 的时刻读取,最多不会超过 60us,DS18B20 必然读取完毕,所以持续时间超过 60us 即可。
当要给 DS18B20 写入 1 的时候,单片机先将这个引脚拉低,拉低时间大于 1us,然后马上释放总线,即拉高引脚,并且持续时间也要大于 60us。和写 0 类似的是,DS18B20 会在15us 到 60us 之间来读取这个 1。
可以看出来,DS18B20 的时序比较严格,写的过程中最好不要有中断打断,但是在两个“位”之间的间隔,是大于 1 小于无穷的,那在这个时间段,我们是可以开中断来处理其它程序的。发送即写入一个字节的数据程序如下。
void Write18B20(unsigned char dat){
unsigned char mask;

EA=0; //禁止总中断
for (mask=0x01; mask!=0; mask<<=1){ //低位在先,依次移出 8 个 bit IO_18B20=0; //产生 2us 低电平脉冲 _nop_(); _nop_(); if ((mask&dat)==0){ //输出该 bit 值 IO_18B20=0; }else{ IO_18B20=1; } DelayX10us(6); //延时 60us IO_18B20=1; //拉高通信引脚 } EA=1; //重新使能总中断 } 读时序图如图 16-18 所示。 图 16-18 DS18B20 位读取时序 当要读取 DS18B20 的数据的时候,我们的单片机首先要拉低这个引脚,并且至少保持1us 的时间,然后释放引脚,释放完毕后要尽快读取。从拉低这个引脚到读取引脚状态,不能超过 15us。大家从图 16-18 可以看出来,主机采样时间,也就是 MASTER SAMPLES,是在 15us 之内必须完成的,读取一个字节数据的程序如下。 unsigned char Read18B20({ unsigned char dat; unsigned char mask; EA=0; //禁止总中断 for (mask=0x01; mask!=0; mask<<=1){ //低位在先,依次采集 8 个 bit IO_18B20=0; //产生 2us 低电平脉冲 _nop_(); _nop_(); IO_18B20=1; //结束低电平脉冲,等待 18B20 输出数据 _nop_(); //延时 2us _nop_(); if (!IO_18B20){ //读取通信引脚上的值 dat &=~mask; }else{ dat |=mask; } DelayX10us(6); //再延时 60us } EA=1; //重新使能总中断 return dat; } DS18B20 所表示的温度值中,有小数和整数两部分。常用的带小数的数据处理方法有两种,一种是定义成浮点型直接处理,第二种是定义成整型,然后把小数和整数部分分离出来,在合适的位置点上小数点即可。我们在程序中使用的是第二种方法,下面我们就写一个程序,将读到的温度值显示在 1602 液晶上,并且保留一位小数位。 #include
#include
sbit IO_18B20=P3^2; //DS18B20 通信引脚
void DelayX10us(unsigned char t){
do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while (--t);
}
bit Get18B20Ack(){
bit ack;
EA=0; //禁止总中断
IO_18B20=0; //产生 500us 复位脉冲
DelayX10us(50);
IO_18B20=1;
DelayX10us(6); //延时 60us
ack=IO_18B20; //读取存在脉冲
while(!IO_18B20); //等待存在脉冲结束
EA=1; //重新使能总中断
return ack;
}
void Write18B20(unsigned char dat){
unsigned char mask;
EA=0; //禁止总中断
for (mask=0x01; mask!=0; mask<<=1){ //低位在先,依次移出 8 个 bit IO_18B20=0; //产生 2us 低电平脉冲 _nop_(); _nop_(); if ((mask&dat)==0){ //输出该 bit 值 IO_18B20=0; }else{ IO_18B20=1; } } DelayX10us(6); //延时 60us IO_18B20=1; //拉高通信引脚 EA=1; //重新使能总中断 } unsigned char Read18B20(){ unsigned char dat; unsigned char mask; EA=0; //禁止总中断 for (mask=0x01; mask!=0; mask<<=1){ //低位在先,依次采集 8 个 bit IO_18B20=0; //产生 2us 低电平脉冲 _nop_(); _nop_(); IO_18B20=1; //结束低电平脉冲,等待 18B20 输出数据 _nop_(); //延时 2us _nop_(); if (!IO_18B20){ //读取通信引脚上的值 dat &=~mask; }else{ dat |=mask; } DelayX10us(6); //再延时 60us } EA=1; //重新使能总中断 return dat; } bit Start18B20(){ bit ack; ack=Get18B20Ack(); //执行总线复位,并获取 18B20 应答 if (ack==0){ //如 18B20 正确应答,则启动一次转换 Write18B20(0xCC); //跳过 ROM 操作 Write18B20(0x44); //启动一次温度转换 } return ~ack; //ack==0 表示操作成功,所以返回值对其取反 } bit Get18B20Temp(int *temp){ bit ack; unsigned char LSB, MSB; //16bit 温度值的低字节和高字节 ack=Get18B20Ack(); //执行总线复位,并获取 18B20 应答 if (ack==0){ //如 18B20 正确应答,则读取温度值 Write18B20(0xCC); //跳过 ROM 操作 Write18B20(0xBE); //发送读命令 LSB=Read18B20(); //读温度值的低字节 MSB=Read18B20(); //读温度值的高字节 *temp=((int)MSB << 8) + LSB; //合成为 16bit 整型数 } return ~ack; //ack==0 表示操作应答,所以返回值为其取反值 } (此处省略,可参考之前章节的代码) #include
bit flag1s=0; //1s 定时标志
unsigned char T0RH=0; //T0 重载值的高字节
unsigned char T0RL=0; //T0 重载值的低字节
void ConfigTimer0(unsigned int ms);
unsigned char IntToString(unsigned char *str, int dat);
extern bit Start18B20();
extern bit Get18B20Temp(int *temp);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void main(){
bit res;
int temp; //读取到的当前温度值
int intT, decT; //温度值的整数和小数部分
unsigned char len;
unsigned char str[12];

EA=1; //开总中断
ConfigTimer0(10); //T0 定时 10ms
Start18B20(); //启动 DS18B20
InitLcd1602(); //初始化液晶

while (1){
if (flag1s){ //每秒更新一次温度
flag1s=0;
res=Get18B20Temp(&temp); //读取当前温度
if (res){ //读取成功时,刷新当前温度显示
intT=temp >> 4; //分离出温度值整数部分
decT=temp & 0xF; //分离出温度值小数部分
len=IntToString(str, intT); //整数部分转换为字符串
str[len++]='.'; //添加小数点
decT=(decT*10) / 16; //二进制的小数部分转换为 1 位十进制位
str[len++]=decT + '0'; //十进制小数位再转换为 ASCII 字符
while (len < 6){ //用空格补齐到 6 个字符长度 str[len++]=' '; } str[len]='\0'; //添加字符串结束符 LcdShowStr(0, 0, str); //显示到液晶屏上 }else{ //读取失败时,提示错误信息 LcdShowStr(0, 0, "error!"); } Start18B20(); //重新启动下一次转换 } } } unsigned char IntToString(unsigned char *str, int dat){ signed char i=0; unsigned char len=0; unsigned char buf[6]; if (dat < 0){ //如果为负数,首先取绝对值,并在指针上添加负号 dat=-dat; *str++='-'; len++; } do { //先转换为低位在前的十进制数组 buf[i++]=dat % 10; dat /=10; } while (dat > 0);
len +=i; //i 最后的值就是有效字符的个数
while (i-- > 0){ //将数组值转换为 ASCII 码反向拷贝到接收指针上
*str++=buf[i] + '0';
}
*str='\0'; //添加字符串结束符
return len; //返回字符串长度
}
void ConfigTimer0(unsigned int ms){
unsigned long tmp; //临时变量
tmp= / 12; //定时器计数频率
tmp=(tmp * ms) / 1000; //计算所需的计数值
tmp= - tmp; //计算定时器重载值
tmp=tmp + 12; //补偿中断响应延时造成的误差
T0RH=(unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
T0RL=(unsigned char)tmp;
TMOD &=0xF0; //清零 T0 的控制位
TMOD |=0x01; //配置 T0 为模式 1
TH0=T0RH; //加载 T0 重载值
TL0=T0RL;
ET0=1; //使能 T0 中断
TR0=1; //启动 T0
}
void InterruptTimer0() interrupt 1{
static unsigned char tmr1s=0;
TH0=T0RH; //重新加载重载值
TL0=T0RL;
tmr1s++;
if (tmr1s >=100){ //定时 1s
tmr1s=0;
flag1s=1;
}
}

您可能感兴趣的文章

本文地址:https://www.ceomba.cn/40043.html
文章标签: ,  
版权声明:本文为原创文章,版权归 ceomba 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!