HTM-52 单片机开发板教学视频 深圳市航太电子 QQ交流群: 437641066 471167502
12、DS18B20实验 DS18B20简介 DS18B20是DALLAS 公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、搞干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,在同一总线上可以挂接多个传感器芯片。它具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为 9 位~12 位 A/D 转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或 2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。以上特点使DS18B20非常适于远距离多点温度检测系统。
原理图 单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。 单总线通常要求外接一个约为 4.7K—10K 的上拉电阻,这样,当总线闲置时其状态为高电平。
DS18B20共有三种形态的存储器资源: 1、ROM 只读存储器,用于存放DS18B20的ID编码,其前8位是单线系列编码(DS18B20的是 28H),后面48位是芯片唯一的序列号,最后8位是以上56位的CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20共64位ROM。 2、RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、2个字节是温度转换后的数据值(温度寄存器),第3、4个字节是用户EEPROM(温度报警值TH、TL储存)的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像(配置寄存器)。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。 3、EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。
光刻ROM 光刻 ROM 中的 64 位序列号是出厂前被光刻好的,它可以看作是该 DS18B20 的地址序列码。 64 位光刻 ROM 的排列是:开始 8 位(地址: 28H )是产品类型标号,接着的 48 位是该 DS18B20 自身的序列号,并且每个 DS18B20 的序列号都不相同,因此它可以看作是该 DS18B20 的地址序列码;最后 8 位则是前面 56 位的循环冗余校验码( CRC=X8+X5+X4+1 )。由于每一个 DS18B20 的 ROM 数据都各不相同,因此微控制器就可以通过单总线对多个 DS18B20 进行寻址,从而实现一根总线上挂接多个 DS18B20 的目的。
DS18B20 内部存储器结构:
DS18B20 温度寄存器格式 测得的温度值以二进制补码的形式存放于温度寄存器中。S为符号位,S=0时,表示温度值为正;S=1 时表示温度值为负。主机读取数据后,先将数据补码变为原码,再计算其十进制值。
配置寄存器(Configuration Register) 用于确定温度值的数字转换分辨率,DS18B20 工作时按此寄存器中的分辨率将温度转换为相应精度的数值。R1,R2默认均为1,即分辨率为12,精度为0.0625. 0 R1 R0 1 1 1 1 1 分辨率设置表: R1 R0 分辨率/bit 温度最大转换时间/ms 0 0 9 93.75 0 1 10 187.5 1 0 11 375 1 1 12 750
DS18B20初始化命令 主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。 做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。
初始化以及应答时序图
DS18B20读写操作 主机发出各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程。因此首先要搞清主机是如何进行写0、写1、读0和读1的。
DS18B20写指令 写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则将总线置为低电平,若主机想写1,则将总线置为高电平,持续时间最少60微秒直至写周期结束,然后释放总线为高电平至少1微秒给总线恢复 。而DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
//写一个字节 void Ds18b20WriteByte(unsigned char dat) { unsigned int delay, j; for(j=0;j<8;j++) temp_port=0; //先把总线拉低1us delay++; //延时 temp_port=dat&0x01; //然后写入一个数据,从最低位开始 delay=6; while(delay--); //延时60us以上,持续时间最少60us temp_port=1;//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值 dat>>=1; }
DS18B20读指令 读周期是从主机把单总线拉低1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。作为从机DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60微秒才能完成
读时序图
//读一个字节 unsigned char Ds18b20ReadByte() { unsigned char byte,date; unsigned int delay,j; for(j=8;j>0;j--) temp_port=0;//先将总线拉低1us delay++; temp_port=1;//然后释放总线 date=temp_port; //读取数据,从最低位开始读取 byte=(byte>>1)|(date<<7);//将byte左移一位,然后与上右移7位后的date,注意移动之后移掉那位补0。 delay=4; //读取完之后等待48us再接着读取下一个数 while(delay--); } return byte;
DS18B20操作步骤 DS18B20的一线工作协议流程是: 初始化→ROM操作指令→存储器操作指令→数据传输。 其工作时序包括: 初始化时序 写时序 读时序
DS28B20芯片ROM指令表: Read ROM(读ROM)[33H] 这个命令允许总线单片机读到DS18B20的64位ROM。只当总线上只存在一个DS18B20时才可以用此指令,如果挂接不只一个,通信时将会发生数据冲突。 Match ROM(指定匹配芯片)[55H] 这个指令后面紧跟着由单片机发出了64位序列号,当总线上有多只DS18B20时,只有与控制发出的序列号相同的芯片才可以做出反应,其它芯片将等待下一次复位。这条指令适应单芯片和多芯片挂接。 Skip ROM(跳跃ROM指令)[CCH] 这条指令使芯片不对ROM编码做出反应,单总线的情况,为节省时间可以选用此指令。如果在多芯片挂接时使用此指令将会出现数据冲突,导致错误出现。
在芯片初始化后,搜索指令允许总线上挂接多芯片时用排除法识别所有器件的64位ROM。 Alarm Search(报警芯片搜索)[ECH] Search ROM(搜索芯片)[F0H] 在芯片初始化后,搜索指令允许总线上挂接多芯片时用排除法识别所有器件的64位ROM。 Alarm Search(报警芯片搜索)[ECH] 在多芯片挂接情况,报警芯片搜索指令只对符合温度高于TH或小于TL报警条件的芯片做出反应。只要芯片不掉电,报警状态将被保持,直到再一次测得温度达不到报警条件为止。
DS18B20芯片存储器操作指令表: Write Scratchpad (向RAM中写数据)[4EH] 这是向RAM中写入数据的指令,随后写入的两个字节的数据将会被存到地址2(报警RAM之TH)和地址3(报警RAM之TL)。写入过程中可以用复位信号中止写入。 Read Scratchpad (从RAM中读数据)[BEH] 此指令从RAM中读数据,读地址从地址0开始,一直可以读到地址9,完成整个RAM数据的读出。芯片允许在读过程中用复位信号中止读取,即可以不读后面不需要的字节以减少读取时间。
Copy Scratchpad (将RAM数据复制到EEPROM中)[48H] 此指令将RAM中的数据存入EEPROM中,以使数据掉电不丢失。此后由于芯片忙于EEPROM储存处理,当单片机发一个读时间隙时,总线上输出“0”,当储存工作完成时,总线将输出“1”。在寄生工作方式时必须在发出此指令后立刻超用强上拉并至少保持10MS,来维持芯片工作。 Convert T(温度转换)[44H] 收到此指令后芯片将进行一次温度转换,将转换的温度值放入RAM的第1、2地址。此后由于芯片忙于温度转换处理,当单片机发一个读时间隙时,总线上输出“0”,当储存工作完成时,总线将输出“1”。在寄生工作方式时必须在发出此指令后立刻超用强上拉并至少保持500MS,来维持芯片工作。
Recall EEPROM(将EEPROM中的报警值复制到RAM)[B8H] 此指令将EEPROM中的报警值复制到RAM中的第3、4个字节里。由于芯片忙于复制处理,当单片机发一个读时间隙时,总线上输出“0”,当储存工作完成时,总线将输出“1”。另外,此指令将在芯片上电复位时被自动执行。这样RAM中的两个报警字节位将始终为EEPROM中数据的镜像。 Read Power Supply(工作方式切换)[B4H] 此指令发出后发出读时间隙,芯片会返回它的电源状态字,“0”为寄生电源状态,“1”为外部电源状态。
什么是补码 正数的补码是正数本身 负数的补码是原码取反,然后再加1。 DS18B20存储的温度值是以补码的形式存储的,所以读出来的温度值是实际温度值的补码,要把的转换为原码。 正温度的话,原码就是补码本身,所以在12位分辨率下,温度的计算公式是: 温度值=读取值*0.0625 负温度的话,原码是补码减1再取反,所以在12位分辨率下,计算公式为: 温度值= -(读取值减1再取反)*0.0625
谢谢! Thanks!