班级建设怎样建立班级网站,沧州网络运营公司,青海西宁做网站多少钱,网站建设与功能模块本文是关于温度传感器的相关内容。 文章目录 一、 DS18B20数字温度传感器介绍1.1、 DS18B20温度传感器的特点1.2、DA18B20内部结构1.3、 DS18B20的温度转换规则1.4、 DS18B20的ROM指令表1.6、 计算温度1.7、 读写时序 二、DS18B20使用示例 一、 DS18B20数字温度传感器介绍 
DS1… 本文是关于温度传感器的相关内容。 文章目录 一、 DS18B20数字温度传感器介绍1.1、 DS18B20温度传感器的特点1.2、DA18B20内部结构1.3、 DS18B20的温度转换规则1.4、 DS18B20的ROM指令表1.6、 计算温度1.7、 读写时序 二、DS18B20使用示例 一、 DS18B20数字温度传感器介绍 
DS18B20是 DALLAS半导体公司推出的一种“一线总线单总线”接口的温度传感器。与传统的热敏电阻等测温元件相比DS18B20是一种新型的、体积小、使用电压宽、与微处理器接口简单的数字化温度传感器。 
1.1、 DS18B20温度传感器的特点 
DS18B20温度传感器具有如下特点 
1、使用电压范围更宽电压范围3.0V ~ 5.5V在寄生电源方式下可由数据线供电。 
2、独特的单线接口方式DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。 
3、DS18B20支持多点组网功能多个DS18B20可以并联在唯一的三线上实现组网多点测温。 
4、DS18B20在使用中不需要任何外围元件全部传感器元件及转换电路集成在一只形如三极管的集成电路内。 
5、温度范围支持-55°C~125°C在-10 ~ 85°C时精度为±0.5°C。 
6、可编程的分辨率为9 ~ 12位对应的可分辨温度分别为0.5°C、0.25°C、0.125°C和0.0625°C可实现高精度测温。 
7、在9位分辨率时最多在93.75ms内把温度转换为数字12位分辨率时最多在750ms内把温度值转换为数字速度更快。 
8、测量结果直接输出数字温度信号以“一根总线”串行传送给CPU同时可传送CRC校验码具有极强的抗干扰纠错能力。 
9、负压特性电源极性接反时芯片不会因发热而烧毁但不能正常工作。 
1.2、DA18B20内部结构 
DS18B20外观实物如下图所示 从上图中可以看出来当正对传感器切面(上图中间)时传感器的管脚顺序从左到右排列管脚1为GND管脚2为数据DQ管脚3为VDD。如果传感器插反电源将短路传感器会发烫容易损坏。 
通常在开发板上会标出传感器的凸起处所以只需要把传感器凸起的方向对着开发板凸起方向插入即可。 
DS18B20内部结构如下图所示 ROM中的64位序列号是出厂前被光刻好的可以看作是该DS18B20的地址序列号。64位光刻ROM的排列是开始8位(28H)是产品类型标号接着的48位是该DS18B20自身的序列号最后8位是前面56位的循环冗余校验码。光刻ROM的作用是使每一个DS18B20都各不相同这样就可以实现一根总线上挂接多个DS18B20。当接多个DS18B20时通过64位的序列号可以确定使用的是哪个温度传感器。 
64位光刻ROM组成如下: 
8位CRC48位序列号8位类型标号28H 
1.3、 DS18B20的温度转换规则 
DS18B20的核心功能是它可以直接读出数字的温度数值。 
温度传感器的精度是用户可编程功能的9、10、11或12位精度分别为0.5、0.25、0.125、0.0625单位°C。 
上电状态下默认精度是12位。 
DS18B20启动后保持低功耗等待状态当需要执行温度测量和AD转换时总线控制器必须发出[44h]命令。转换完以后产生的温度数据以两个字节的形式被存储到告诉暂存器的温度寄存器中DS18B20继续保持等待状态。读取温度寄存器中的数据再根据精度就可以得到当前测得的温度。 
1.4、 DS18B20的ROM指令表 
指令约定代码功能读ROM33H读DS18B20温度传感器ROM中的编码即64位序列号符合ROM55H发出此命令之后接着发出64位ROM编码访问单总线上与该编码相对应的DS18B20使之做出响应为下一步对DS18B20的读写作准备搜索ROM0F0H用于确定挂接在同一总线上DS18B20的个数和识别64位ROM地址为操作各器件做好准备跳过ROM0CCH忽略64位ROM地址直接向DS18B20发送温度变换命令适用于单片机工作告警搜索命令0ECH执行后只有温度超过设定值上限或下限才做出响应 
1.5、 DS18B20的RAM指令表 
指令约定代码功能温度变换44H启动DS18B20进行温度转换12位转换时最长为750ms结果存入内部9字节RAM中读暂存器0BEH读内部RAM中9字节的内容写暂存器4EH发出向内部RAM的3、4字节写上、下限温度数据命令紧跟该命令之后是传送两字节的数据。复制暂存器48H将RAM中第3、4字节的内容复制到EEPROM中重调EEPROM0B8H将EEPROM中内容恢复到RAM中的第3、4字节读供电方式0B4H读DS18B20的供电模式寄生供电时DS18B20发送0外接电源供电DS18B20发送1 
1.6、 计算温度 
DS19B20温度传感器的内部存储器包括一个高速的暂存器RAM和一个非易失性的可电擦除的EEPROM后者存放高温度和低温度触发器TH、TL和结构寄存器。 
配置寄存器是配置不同的位数来确定温度和数字的转化配置寄存器结构如下 
TMR1R011111 
低五位是1。 
TM是测试模式位用于设置DS18B20在工作模式还是在测试模式。DS18B20出厂时该位被设置为0用户不需要去改动。 
R1和R0用来设置DS18B20的精度(分辨率)可设置为9、10、11或12位对应的分辨率温度是0.5°C、0.25°C、0.125°C和0.0625°C。R0和R1配置如下 
R1R0精度最大转换时间009-bit93.75ms ( t C O N V / 8 ) (t_{CONV}/8) (tCONV/8)0110-bit187.5ms ( t C O N V / 4 ) (t_{CONV}/4) (tCONV/4)1011-bit375ms ( t C O N V / 2 ) (t_{CONV}/2) (tCONV/2)1112-bit750ms ( t C O N V ) (t_{CONV}) (tCONV) 
初始状态默认精度是12位即R1R011。 
高速暂存存储器由9个字节组成分配如下 
寄存器内容字节地址温度值低位LS Byte0温度值高位MS Byte1高温限值TH2低温限值TL3配置寄存器4保留5保留6保留7CRC校验位8 
当温度转换命令44H发布后经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。存储的两个字节高字节的前5位是符号S单片机可通过单线接口读到该数据读取时低位在前高位在后数据格式如下 
寄存器bit7bit6bit5bit4bit3bit2bit1bit0LS Byte 2 3 2^3 23 2 2 2^2 22 2 1 2^1 21 2 0 2^0 20 2 − 1 2^{-1} 2−1 2 − 2 2^{-2} 2−2 2 − 3 2^{-3} 2−3 2 − 4 2^{-4} 2−4MS ByteSSSSS 2 6 2^6 26 2 5 2^5 25 2 4 2^4 24 
如果测得的温度大于0符号位S0将测试得到的数值乘以0.0625(默认精度)即可得到实际温度 
如果测得的温度小于0符号位S1将测到的数据取反加1再乘以0.0625即可得到实际温度。 
温度与数据对应关系如下 
温度°C数据输出二进制数据输出十六进制1250000 0111 1101 000007D0H850000 0101 0101 00000550H25.06250000 0001 1001 00010191H10.1250000 0000 1010 001000A2H0.50000 0000 0000 10000008H00000 0000 0000 00000000H-0.51111 1111 1111 1000FFF8H-10.1251111 1111 0101 1110FF5EH-25.06251111 1110 0110 1111FE6EH-551111 1100 1001 0000FC90H 
上电复位时温度寄存器默认值为85°C。 
比如测试到的数据为0x0550高5位是0表示测试到的温度是正温度0x0550十进制是1360将1360乘以0.0625等于85就是得到的温度值即0x0550对应的是85°C。 
1.7、 读写时序 
由于DS18B20是单总线器件所有的单总线器件都要求采用严格的信号时序以保证数据的完整性。 
DS18B20时序包括初始化时序、写(0和1)时序、读(0和1)时序。 
DS18B20发送所有的命令和数据都是字节的低位在前。 
(1) 初始化时序 
单总线上的所有通信都是以初始化序列开始的。 
主机输出低电平保持低电平时间至少480us该时间的时间范围可以从480到960us以产生复位脉冲。 
接着主机释放总线外部的上拉电阻将单总线拉高延时15~60us并进入接收模式。 
接着DS18B20拉低总线60~240us以产生低电平应答脉冲若为低电平还要做延时其延时时间从外部上拉电阻将单总线拉高算起算起最少要480us。 
初始化时序图如下 ① 数据线拉到低电平0 
②延时480us 
③ 数据线拉到高电平1 
④ 延时等待80us如果初始化成功则在15~60us内产生一个由DS18B20返回的低电平根据该状态可以确定它存在 
⑤ 如果CPU读到了数据线上的低电平0后还要延时其延时时间从发出的高电平算起(第③步)的时间算起最少要480us。 
根据上述时序可以编写对应的初始化代码如下 
/*************************************************************************
* 函数名		DS18B20Init
* 函数功能	DS18B20温度传感器初始化
* 输入			void
* 输出			初始化成功返回1失败返回0
**************************************************************************/
uchar DS18B20Init()
{uchar i;DSPORT0;  // 数据线拉低i80;while(i--);  // 延时480usDSPORT1;  // 数据线拉高i0;while(DSPORT){delay1ms(1);  // 数据线拉高后延时至少480usi;if(i5){return 1;}}return 0;
}其中DSPORT定义如下 
sbit DSPORT  P3^7; // DS18B20的数据线连接到P3.7口(2) 写时序 
写时序包括写0时序和写1时序。 
所有写时序至少需要60us且在2次独立的写时序之间至少需要1us的恢复时间两种写时序均起始于主机拉低总线。 
写1时序主机输出低电平延时2us然后释放总线延时60us。 
写0时序主机输出低电平延时60us然后释放总线延时2us。 
写时序图如下 ① 数据线先置低电平0 
② 延时15us 
③ 按从低位到高位的顺序发送数据一次只发送一位 
④ 延时60us 
⑤ 将数据线拉到高电平。 
⑥ 重复1~5步骤直到发送完整的字节 
⑦ 最后将数据线拉高。 
根据上述时序编写出DS18B20写数据的代码如下 
/*************************************************************************
* 函数名		DS18B20WriteByte
* 函数功能	DS18B20按照时序写一个字节
* 输入			dat写入的数据
* 输出			void
**************************************************************************/
void DS18B20WriteByte(uchar dat)
{uchar i, j;j0;for(i0;i8;i){DSPORT0;  // 数据线拉低j;  // 延时15usj;DSPORTdat0x01;j10;  // 延时60uswhile(j--);DSPORT1;datdat1;}
}	(3) 读时序 
单总线器件仅在主机发出读时序时才向主机传输数据所以在主机发出读数据命令后必须马上产生读时序以便从机能够传输数据。 
所有读时序至少需要60us且在2次读时序之间至少需要1us的恢复时间。 
每个读时序都由主机发起至少拉低总线1us。主机在读时序期间必须释放总线并且在时序起始后的15us内采样总线状态。 
读时序图如下 ① 将数据线拉低0 
② 延时1us 
③ 将数据线拉高1释放总线准备读数据 
④ 延时10us 
⑤ 读数据线的状态得到1个状态位并进行数据处理 
⑥ 延时45us 
⑦ 重复1~6步骤直到读完一个字节。 
根据上述时序可以编写DS18B20读数据的时序如下 
/*************************************************************************
* 函数名		DS18B20ReadByte
* 函数功能	DS18B20按照时序读一个字节
* 输入			void
* 输出			返回读取到的一个字节的数据
**************************************************************************/
uchar DS18B20ReadByte()
{uchar i, j;uchar bi, dat;j0;dat0;for(i0;i8;i){DSPORT0;  // 数据线拉低j;  // 延时1usDSPORT1;j;  // 延时10usj;biDSPORT;dat (dat1)|(bi7);j7;while(j--);}return dat;
}(4) DS18B20读取温度 
根据ROM指令表当总线上只有一个DS18B20时首先发送CCH指令然后发送RAM温度转换指令44H 
那么如果总线上只挂接了一个DS18B20那么DS18B20典型温度读取过程为复位→发SKIP ROM命令0xCC→发开始转换命令0x44→延时→复位→发送SKIP ROM命令0xCC→发读存储器命令0xBE→连续读出两个字节数据即温度→结束。 
二、DS18B20使用示例 
本示例实现的功能为系统运行时插上DS18B20温度传感器数码管显示检测的温度值。用到的资源包括数码管和DS18B20proteus设计如下 根据上面介绍的时序及读温度流程DS18B20读取温度代码如下 
// DS18B20转换温度复位-发送0xcc跳过ROM命令-发送0x44温度转换命令
void DS18B20ChangeTemp()
{DS18B20Init();delay1ms(1);DS18B20WriteByte(0xcc);  // 发送0xcc命令DS18B20WriteByte(0x44);  // 发送0x44命令
}// DS18B20发送读取温度命令复位-发送0xcc跳过ROM命令-发送0xBE读存储器命令
void DS18B20ReadTempCom()
{DS18B20Init();delay1ms(1);DS18B20WriteByte(0xcc);  // 发送0xcc命令DS18B20WriteByte(0xBE);  // 发送0xBE命令
}// DS18B20读取检测到的温度温度转换-发送读温度命令-读取数据
int DS18B20ReadTemp()
{int temp;uchar tmH, tmL;DS18B20ChangeTemp();DS18B20ReadTempCom();tmLDS18B20ReadByte();tmHDS18B20ReadByte();temptmH;temp  (temp8)|tmL;return temp;
}主函数main.c如下 
/*实现功能使用DS18B20温度传感器检测当前温度并将结果显示到数码管中[2023-12-25] zoya
*/
#include reg52.h
#include TempDS18B20.htypedef unsigned char u8;
typedef unsigned int u16;#define GPIO_LED P0
sbit LSAP2^2;
sbit LSBP2^3;
sbit LSCP2^4;u8 code smg[]{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
u8 display[6];// 延时函数
void delay(u16 i)
{while(i--);
}// 数码管显示函数
void DigDisplay()
{u8 i;for(i0;i6;i){switch(i){case 0: LSA1; LSB1; LSC1; break;  // Y7case 1: LSA0; LSB1; LSC1; break;  // Y6case 2: LSA1; LSB0; LSC1; break;  // Y5case 3: LSA0; LSB0; LSC1; break;  // Y4case 4: LSA1; LSB1; LSC0; break;  // Y3case 5: LSA0; LSB1; LSC0; break;  // Y2case 6: LSA1; LSB0; LSC0; break;  // Y1case 7: LSA0; LSB0; LSC0; break;  // Y0}GPIO_LEDdisplay[i];delay(500);GPIO_LED0x00;}
}// 温度处理函数
void TempPros(int temp)
{float tp;if(temp0){display[0]0x40;  // -temptemp-1;temp~temp;tptemp;temptp*0.0625*1000.5;}else{display[0]0x00;tptemp;temptp*0.0625*1000.5;}display[1]smg[temp%10000/1000];display[2]smg[temp%1000/100]|0x80;  // |0x80显示小数点display[3]smg[temp%100/10];display[4]smg[temp%10/1];display[5]0x39;}void main()
{while(1){TempPros(DS18B20ReadTemp());DigDisplay();}
}仿真结果DS18B20默认温度是85°所以系统初始运行时显示85度。