基于ds18b20的51单片机lcd1602液晶显示测温系统内容摘要:

18B20 功能指令。 ROM 命令: ROM 命令通过每个器件 64bit 的 ROM 码,使主机指定某一特定器件(如果有多个器件挂在总线上)与之进行通信。 DS18B20 的 ROM 如表 34 所示,每个 ROM 命令都是 8 bit 长。 功能命令: 主机通过功能命令 对 DS18B20 进行读 /写 Scratchpad 存储器,或者启动温度转换。 DS18B20 的功能命令如表 37 所示。 指令 协议 功能 读 ROM 33H 读 DS18B20 中的编码 (即 64 位地址 ) 符合 ROM 55H 发出此命令后,接着发出 64 位 ROM 编码,访问单总线上与该编码相对应的 DS18B20,使之作出响应,为下一步对该 DS18B20 的读写作准备 搜索 ROM 0F0H 用于确定挂接在同一总线上 DS18B20的个数和识别 64位ROM 地址,为操作各器件作好准备 跳过 ROM 0CCH 忽略 64 位 ROM 地址,直接向 DS18B20V 温度转换命令,适用于单个 DS18B20 工作 报警搜索命令 0ECH 执行后,只有温度超过庙宇值上限或下限的片子才做出响应 温度转换 44H 启动 DS18B20 进行温度转换,转换时间最长为 500ms(典14 型为 200ms),结果丰入内部 9 字节 RAM 中 读暂存器 BEH 读内部 RAM 中 9 字节的内容 写暂存器 4EH 发出向内部 RAM 的第 4 字节写上、下温度数据命令,紧该温度命令之后,传达两字节的数据 复制暂存器 48H 将 RAM 中第 4 字内容复制到 E2PROM 中 重调E2PROM 0B8H 将 E2PROM 中内容恢复到 RAM 中的第 4 字节 读供电方式 0B4H 读 DS18B20 的供电模式,寄生供电时 DS18B20 发送“ 0”,外部供电时 DS18B20 发送“ 1” 表 37 DS18B20 的信号方式 DS18B20 采用严格的单总线通信协议,以保证数据的完整性。 该协议定义了几种信号类型:复位脉冲、应答脉冲、写和读。 除了应答脉冲所有这些信号都由主机发出同步信号。 总线上传输的所有数据和命令都是以字节的低位在前。 :复位脉冲和应答脉冲 初始化波形如图 38 所示。 15 DS18B20 的复位时序如下: 480us~950us, 然后释放总线(拉高电平)。 这时 DS18B20 会拉低信号,大约 60~240us 表示应答。 拉低电平的 60~240us 之间,单片机读取总线的电平,如果是低电平,那么表示复位成功, DS18B20 拉低电平 60~240us 之后,会释放总线。 C 程序举例 //DS1820 C51 子程序 //这里以 晶体为例,不同的晶体速度可能需要调整延时的时间 //sbit DQ =P2^1。 //根据实际情况定义端口 void dsreset()//18B20 复位,初始化函数 { uint i。 ds=0。 i=103。 while(i0)i。 ds=1。 i=4。 while(i0)i。 } DS18B20 所有的数据交换都由一个初始化序列开始。 由主机发出的复位脉冲和跟在其后的由 DS18B20 发出的应答脉冲构成。 当 DS18B20 发出响应主机的16 应答脉冲时,即向主机表明它已处在总线上并且准备工作。 在写时序期间,主机向 DS18B20 写入指令;而在读时序期间,主机读入来自 DS18B20 的指令。 在每一个时序,总线只能传输一位数据。 读 /写时序如图39 所示。 ? 写时序 存在两种写时序:“写 1”和“写 0”。 主机在写 1 时序向 DS18B20 写入逻辑 1,而在写 0 时序向 DS18B20 写入逻辑 0。 所有写时序至少需要 60181。 s,且在两次写时序之间至少需要 1181。 s的恢复时间。 两种写时序均以主机拉低总线开始。 在写时序开始后的 15181。 s~60181。 s期间, DS18B20 采样总线的状态。 如果总线为高电平,则逻辑 1被写入 DS18B20;如果总线为低电平,则逻辑 0被写入 DS18B20。 ? 写时序 DS18B20 写步骤如下: 10~15us,。 20~45us 的时间。 17 如果要读或者写一个字节,就要重复以上的步骤八次。 使用 for 循环,和数据变量的左移和或运算,实现一个字节读与写。 函数延迟的时间,必须模拟非常准确,因为单线总线对时序的要求敏感点。 //向 1WIRE 总线上写一个字节 void tempwritebyte(BYTE dat) //向 18B20 写一个字 节 数据 { uint i。 BYTE j。 bit testb。 for(j=1。 j=8。 j++) { testb=datamp。 0x01。 dat=dat1。 if(testb) //写 1 { ds=0。 i++。 i++。 ds=1。 i=8。 while(i0)i。 } else { 18 ds=0。 //写 0 i=8。 while(i0)i。 ds=1。 i++。 i++。 } } } } ? 读时序 DS18B20 读步骤如下: 1us ,然后读取总线电平。 这时候 DS18B20 会送出电平。 ,延迟大约 40~45 微妙 //从 1wire 总线上读取一个字节 bit tempreadbit(void) //读 1位函数 { uint i。 bit dat。 19 ds=0。 i++。 //i++ 起延 时 作用 ds=1。 i++。 i++。 dat=ds。 i=8。 while(i0)i。 return (dat)。 } BYTE tempread(void) //读 1个字 节 { BYTE i,j,dat。 dat=0。 for(i=1。 i=8。 i++) { j=tempreadbit()。 dat=(j7)|(dat1)。 //读 出的数据最低位在最前面, 这样刚 好一个字 节 在DAT里 } return(dat)。 } A . DS18B20 开始转换: 复位。 ROM 的字节命令, 0xCC。 , 0x44。 20 750~900 毫秒 B . DS18B20 读暂存数据: 复位。 ROM 的字节命令, 0xCC。 , 0xee。 0 个字节 LS Byte,转换结果的低八位。 1 个字节 MS Byte,转换结果的高八位。 复位,表示读取暂存结束。 //读取温度 void tempchange(void) //DS18B20 开始 获 取温度并 转换 { dsreset()。 delay(1)。 tempwritebyte(0xcc)。 // 写跳 过读 ROM 指令 tempwritebyte(0x44)。 // 写温度 转换 指令 } uint get_temp() //读 取寄存器中存 储 的温度数据 { BYTE a,b。 dsreset()。 21 delay(1)。 tempwritebyte(0xcc)。 tempwritebyte(0xbe)。 a=tempread()。 //读 低 8 位 b=tempread()。 //读 高 8 位 temp=b。 temp=8。 //两个字 节组 合 为 1 个字 temp=temp|a。 temp = temp *()。 //温度 值扩 大 10 倍,精确到 1 位小数 return temp。 //temp 是整型 } void ds1820disp(uint temp1)//温度 值显 示 { disdata[0]= temp1 /1000+0x30。 //百位数 disdata[1]= temp1 %1000/100+0x30。 //十位数 disdata[2]= temp1%100/10+0x30。 //个位数 disdata[3]=0x2e。 disdata[4]= temp1 %10+0x30。 //小数位 } 简单归纳 22 单线总线高电平为闲置状态。 单片机访问 DS18B20必须遵守, DS18B20 复位 执行 ROM 指令 执行 DS18B20 功能指令。 而在单点上,可以直接跳过ROM 指令。 DS18B20 的转换精度默认为 12 位,而分辨率是。 DS18B20 温度读取函数参考步骤: A . DS18B20 开始转换: 复位。 ROM 的字节命令, 0xCC。 , 0x44。 750~9。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。