单片机与DSB.ppt

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.跳过ROM 主机能够采用该命令同时访问总线上的所有从机设备,而无须发出任何ROM代码信息。例如,主机通过在发出跳过ROM命令后跟随转换温度命令(44H),就可以同时命令总线上所有的DS18B20开始转换温度,这样大大节省了主机的时间。值得注意的是,如果跳过ROM命令跟随的是读暂存器(BEH)的命令,则该命令只能应用于单节点系统,否则由于多个节点都响应该命令而引起数据冲突。 4.搜索ROM 当系统初始上电时,主机必须找出总线上所有从机设备的ROM代码,这样主机能够判断从机的数目和类型。主机通过重复执行搜索ROM循环,以找出总线上所有的从机设备。如果总线上只有一个从机设备,则可以采用读ROM命令来代替搜索ROM命令。每次执行完搜索ROM循环后,主机必须返回第一步(初始化)。 5.报警搜索 此命令的流程与搜索ROM命令相同。但是,仅在最近一次温度测量出现报警的情况下,DS18B20才对此命令作出响应。报警的条件定义为温度高于TH或低于TL。只要DS18B20一上电,报警条件就保持在设置状态,直到另一次温度测量显示出非报警值,或者改变TH或TL的设置,使得测量值再一次位于允许的范围内。 (3)发送存储器指令 DS18B20 的存储器指令集 1.读暂存器 此命令用于读暂存存储器的内容。读出的数据从暂存存储器的字节0开始,直至第九个字节(字节8,CRC)被读出为止。如果不想读完所有字节,控制器可以再任何时间发出复位命令中止读取。暂存存储器的数据组织如表 数据 8 7 6 5 4 3 2 1 0 含义 CRC 保留 保留 保留 配置寄存器 低温报警值 高温报警值 温度高位 温度低位 现在我们要做的是让DS18B20进行一次温度的转换,那具体的操作就是: 1、主机先作个复位操作, 2、主机再写跳过ROM的操作(CCH)命令, 3、然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让DS18B20完成转换的操作。在这里要注意的是每个命令字节在写的时候都是低字节先写,例如CCH的二进制在写到总线上时要从低位开始写,写的顺序是“零、零、壹、壹、零、零、壹、壹”。整个操作的总线状态如下图。 读取RAM内的温度数据。同样,这个操作也要接照三个步骤。 1、主机发出复位操作并接收DS18B20的应答(存在)脉冲。 2、主机发出跳过对ROM操作的命令(CCH)。 3、主机发出读取RAM的命令(BEH),随后主机依次读取DS18B20发出的从第0一第8,共九个字节的数据。如果只想读取温度数据,那在读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可。同样读取数据也是低位在前的。整个操作的总线状态如下图: 在这里说明一下,第二步跳过对ROM操作的命令是在总线上只有一个器件时,为节省时间而简化的操作,若总线上不止一个器件,那么跳过ROM操作命令将会使几器件同时响应,这样就会出现数据冲突。 初始化时序 bit Init_DS18B20(void) { bit flag; //储存DS18B20是否存在的标志,flag=0,存在;flag=1,不存在 DQ = 1; //先将数据线拉高 for(time=0;time2;time++) ;//略微延时约6微秒//再将数据线从高拉低,要求保持480~960us DQ = 0; for(time=0;time200;time++) ; //略微延时约600微秒//以向DS18B20发出一持续480~960us的低电平复位脉冲 DQ = 1; //释放数据线(将数据线拉高) for(time=0;time10;time++) ; //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲) flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在) for(time=0;time200;time++) ; //延时足够长时间,等待存在脉冲输出完毕 return (flag); //返回检测成功标志 } unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat; //储存读出的一个字节数据 for (i=0;i8;i++) {DQ =1;

文档评论(0)

iuad + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档