单总线协议-以DS18B20举例
- 格式:pdf
- 大小:577.17 KB
- 文档页数:10
DS18B20原理及程序编写(一)概述DS18B20为单总线12位(二进制)温度读数。
内部有64位唯一的ID编码。
工作电压从3.0~5.5V。
测量温度范围从-55℃~125℃。
最高±0.0625℃分辩率。
其内部结构如下图所示。
DS18B20的核心功能是直接数字温度传感器。
温度传感器可以配置成9、10、11和12位方式。
相应的精度分别为:0.5℃、0.25℃、0.125℃和0.0625℃。
默认的分辨率为12位。
DS18B20在空闲低功耗状态下加电(寄生电源工作方式)。
主机必须发出Convert T [44h]命令使其对测量温度进行A-D转换。
接下来进行采集转换,结果存于两字节高速温度寄存器并返回到空闲低功耗状态。
如果DS18B20在外部VDD供电方式下,单片机可以在发出Convert T 命令并总线为1时(总线为0表示正在转换)发出“read time slots”命令。
DS18B20芯片内部共有8字节的寄存器,其中地址编号0,1为温度寄存器,里面存储着DS18B20温度转换后的AD值,其格式如表1所示。
地址编号2,3为温度报警寄存器,里面为报警设定值,地址编号4为配置寄存器(这三个寄存器在读取之前请使用“重新调入EEPROM”命令将存储在EEPROM里的内容调出,同样,在向温度报警寄存器里写入内容后,也要使用“复制到存储器”命令48H将温度报警寄存器内的内容存入EEPROM当中,以免掉电丢失数据)。
DS18B20内部寄存器映射如下图所示。
配置寄存器的格式如表2和表3所示。
DS18B20内部寄存器映射表1 温度寄存器的格式表2 配置寄存器的格式表3 温度分辨率配置DS18B20使用单总线工作方式,其通信协议以电平的高平时间作为依据,其基本时序有复位时序,写时序、读时序。
//********************************************************************** //** 文件名:DS18B20.c//** 说明:DS18B20驱动程序文件//----------------------------------------------------------------------//** 单位://** 创建人:张雅//** 创建时间:2010-01-20//** 联系方式:QQ:276564402//** 版本:V1.0//----------------------------------------------------------------------//**********************************************************************//----------------------------------------------------------------------//** 芯片:AT89S52//** 时钟:11.0592MHz//** 其它:这个文档为18B20的驱动程序,引用了数码管的驱动。
单⽚机学习(⼗⼆)1-Wire通信协议和DS18B20温度传感器⽬录⼀、DS18B201. DS18B20简介DS18B20是⼀种常见的数字温度传感器,其控制命令和数据都是以数字信号的⽅式输⼊输出,相⽐较于模拟温度传感器,具有功能强⼤、硬件简单、易扩展、抗⼲扰性强等特点测温范围:-55°C 到 +125°C通信接⼝:1-Wire(单总线)其它特征:可形成总线结构、内置温度报警功能、可寄⽣供电2. 电路原理图其中1和3号引脚分别连接GND和VCC,⽽⼆号引脚则⽤于使⽤1-Wire(单总线)接⼝进⾏通信。
即:3. 内部结构内部完整结构框图64-BIT ROM:作为器件地址,⽤于总线通信的寻址SCRATCHPAD(暂存器):⽤于总线的数据交互EEPROM:⽤于保存温度触发阈值和配置参数其中配置寄存器可以配置温度变化的精度值。
存储器结构当我们希望修改EEPROM中存储的内容时,我们需要先将数据写⼊到暂存器中,然后再发送⼀条指令使从机将暂存器中的数据写⼊到EEPROM中。
⼆、单总线(1-Wire BUS)由于DS18B20使⽤的通信接⼝是1-Wire,因此我们需要学习1-Wire相关的通信协议,这样才能使单⽚机和它进⾏通信。
1. 单总线简介单总线(1-Wire BUS)是由Dallas公司开发的⼀种通⽤数据总线⼀根通信线:DQ异步、半双⼯单总线只需要⼀根通信线即可实现数据的双向传输,当采⽤寄⽣供电时,还可以省去设备的VDD线路,此时,供电加通信只需要DQ和GND两根线2. 电路规范设备的DQ均要配置成开漏输出模式DQ添加⼀个上拉电阻,阻值⼀般为4.7KΩ左右若此总线的从机采取寄⽣供电,则主机还应配⼀个强上拉输出电路3. 单总线的时序结构①初始化:主机将总线拉低⾄少480us然后释放总线,等待15~60us存在的从机拉低总线60~240us以响应主机最后从机将释放总线对应的信号时序图:②发送⼀位:主机将总线拉低60~120us,然后释放总线,表⽰发送0;主机将总线拉低1~15us,然后释放总线,表⽰发送1。
DS18B20单总线温度采集实验一、实验目的1. 熟悉Keil IDE uVision集成开发环境软件的使用方法。
2. 学习DS18B20 单总线温度传感器的使用。
二、实验内容DS18B20 为单总线12 位(二进制)温度读数。
内部有64 位唯一的ID 编码。
工作电压从 3.0~5.5V。
测量温度范围从-55℃~125℃。
高位±0.0625℃分辨率。
三、实验要求1. 数码管显示温度数据,显示百、十、个位并保留一位小数。
2. 画出程序流程图,并独立编写C51程序。
3. 做好实验前预习,完成proteus仿真和实物搭建。
四、实验硬件电路及芯片特性DS18B20 内部框图:温度寄存器格式:DSl8B20 工作过程中的协议如下:初始化ROM 操作命令存储器操作命令处理数据初始化:单总线上的所有处理均从初始化开始。
单片机将总线拉低至少480μs 然后释放总线,DS18B20 检测到上升沿后在等待15~60μs 后拉低总线,说明器件存在。
拉低持续时间为60~240μs。
读写时序:推荐的读时序:DS18B20 的核心功能是直接数字温度传感器。
温度传感器可以配置成9、10、11 和12 位方式。
相应的精度分别为:0.5℃、0.25℃, 0.125℃和0.0625℃。
默认的分辨率为12 位。
DS18B20 在空闲低功耗状态下加电(寄生电源工作方式)。
主机必须发出Convert T [44h]命令使其对测量温度进行A-D 转换。
接下来进行采集转换,结果存于两字节高速温度寄存器并返回到空闲低功耗状态。
如果DS18B20 在外部VDD 供电方式下,单片机可以在发出Convert T 命令并总线为1 时(总线为0 表示正在转换)发出“read time slots”命令。
温度分辩率配置:五、实验步骤1. 在Keil IDE u Vision集成开发环境下建立工程文件,编辑源文件、编译、链接并生成目标文件,仿真调试验证结果。
DS18B20的工作原理DS18B20是一种数字温度传感器,它采用单总线接口进行通信,并且具有高精度和可靠性。
DS18B20的工作原理基于温度对半导体材料电阻值的影响。
DS18B20传感器内部包含一个温度传感器和一个数字转换器。
温度传感器是基于PN结的二极管,其电阻值与温度呈负温度系数。
当温度升高时,半导体材料的电阻值减小,反之亦然。
DS18B20传感器通过单总线接口与主控设备进行通信。
在通信过程中,主控设备发送指令给传感器,传感器将温度数据转换成数字信号并发送回主控设备。
DS18B20传感器采用一种称为“1-Wire”的通信协议。
这种协议允许多个DS18B20传感器通过单根总线进行连接,每个传感器都有唯一的64位ROM代码,用于区分不同的传感器。
在通信过程中,主控设备向总线发送复位脉冲,然后传感器会回应存在脉冲。
主控设备发送指令给传感器,传感器根据指令进行相应的操作,例如读取温度值。
传感器将温度值转换为数字信号,并通过总线发送给主控设备。
DS18B20传感器具有高精度和可靠性。
它可以测量范围从-55°C到+125°C,并且具有±0.5°C的温度精度。
传感器内部有一个温度转换器,可以将温度转换为12位的数字信号,提供更高的精度。
DS18B20传感器还具有一些其他特性,例如可编程分辨率和温度报警功能。
可编程分辨率允许用户选择不同的温度精度,从9位到12位。
温度报警功能可以设置上下限温度值,当温度超过或低于设定值时,传感器将触发警报。
总结一下,DS18B20的工作原理是基于温度对半导体材料电阻值的影响。
它通过单总线接口与主控设备通信,采用1-Wire通信协议。
传感器内部有一个温度传感器和数字转换器,可以将温度转换为数字信号并发送给主控设备。
DS18B20具有高精度、可靠性和一些额外的特性,使其在许多应用中被广泛使用。
DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
单总线,意味着没有时钟线,只有一根通信线。
单总线读写数据是靠控制起始时间和采样时间来完成,所以时序要求很严格,这也是DS18B20驱动编程的难点。
一.DS18B20温度传感器1.引脚图2.DS18B20内部结构图主要由2部分组成:64位ROM、9字节暂存器,如图所示。
(1) 64 位ROM。
它的内容是64 位序列号,它可以被看作是该DS18B20 的地址序列码,其作用是使每个DS18B20 都各不相同,这样就可以实现一根总线上挂接多个DS18B20 的目的。
(2) 9字节暂存器包含:温度传感器、上限触发TH高温报警器、下限触发TL低温报警器、高速暂存器、8位CRC产生器。
3.64位ROM结构图8位CRC:是单总线系列器件的编码,DS18B20定义为28H。
48位序列号:是一个唯一的序列号。
8位系列码:由CRC产生器生产,作为ROM中的前56位编码的校验码。
4.9字节暂存器结构图以上是内部9 个字节的暂存单元(包括EEPROM)。
字节0~1 是温度存储器,用来存储转换好的温度。
字节2~3 是用户用来设置最高报警和最低报警值。
这个可以用软件来实现。
字节4 是配置寄存器,用来配置转换精度,让它工作在9~12 位。
字节5~7 保留位。
字节8 CRC校验位。
是64位ROM中的前56位编码的校验码。
由CRC发生器产生。
5.温度寄存器结构图温度寄存器由两个字节组成,分为低8位和高8位。
一共16位。
其中,第0位到第3位,存储的是温度值的小数部分。
第4位到第10位存储的是温度值的整数部分。
第11位到第15位为符号位。
全0表示是正温度,全1表示是负温度。
表格中的数值,如果相应的位为1,表示存在。
如果相应的位为0,表示不存在。
6.配置寄存器精度值:9-bit 0.5℃10-bit 0.25℃11-bit 0.125℃12-bit 0.0625℃7.温度/数据关系注意:如果温度是一个负温度,要将读到的数据减一再取反二.单总线协议1.单总线通信初始化初始化时序包括:主机发出的复位脉冲和从机发出的应答脉冲。
#in clude<reg52.h>#defi ne uchar un sig ned char#defi ne uint un sig ned int sbit DQ=P1A 0;sbit rs=P2A0; sbit rw=P2A1;sbit e=P2A2;uchar temp1,temp2;II 定义两个存放温度的变量 //uchar ID[8]; 〃存放DS18B20的64位序列号的数组uchar code ID_1[]={0x28,0x3a,0x24,0xc6,0x02,0x00,0x00,0xa4}; II 第一个 DS18B20 的序列号uchar code ID_2[]={0x28,0x66,0xa2,0xc1,0x02,0x00,0x00,0x26};II 第二个 DS18B20 的序列号 uchar code table[]="0123456789";uchar code table_temp[]="tempreture:";uchar code table_0[]="C :/****************************************************/ II50us 的延时函数 IILCD1602写指令 IILCD1602写数据 IILCD1602 初 始 IIds18b20初始化 IIwhile ( t--)延时函数 IIDS18B20初始化函数 IIds18b20写一个字节函数 IIds18b20读一个字节函数uchar readtempl(void); ucharreadtemp2(void); void display(void);I*void readrom(void) II 读取温度传感器的序列号子函数 {ini t_ds18b20();delay_50us(2);write_byte(0x33);ID[0]=read_byte();ID[1]=read_byte();ID[2]=read_byte();ID[3]=read_byte();ID[4]=read_byte();ID[5]=read_byte();ID[6]=read_byte();ID[7]=read_byte();/*****************************************************/*void keep_rom(uchar *p) // 存序列号函数{uchar i;void delay_50us( uint time);void write_com(uchar com); voidwrite_data(uchar dat);void in it_LCD1602(void); idini t_ds18b20(void);void delay( uint t);void ini t_ds18b20(void); voidwrite_byte(char dat); ucharread_byte(void);II 第一个ds18b20读取温度函数 //第二个ds18b20读取温度函数IILCD1602显示温度函数*******************************************for(i=0;i<8;i++){*P=ID[i];P++;}}/***************************************************** /*void display_rom(void) // 显示序列号函数{uchar i;write_com(0x80); for(i=0;i<8;i++){write_data(table[ID[i]/16]); write_data(table[ID[i]%16]);}}/****************************************************/ void mai n(void){in it_LCD1602();while(1){temp1=readtemp1();temp2=readtemp2();display();}}]**********************************************'void delay_50us( uint time){uchar j;for(;time>0;time--); for(j=19;j>0;j++);}/************************************************/void write_com(uchar com) //LCD1602 写指令{e=0;rs=0;rw=0;PO=com;delay_50us(10); e=1;delay_50us(20);e=0;}/***************************************************/void write_data(uchar dat) //LCD1602 写数据{e=0;rs=1;rw=0;PO=dat;delay_50us(10);e=1;delay_50us(20);e=0;}]***************************************************]void init_LCD1602(void) //LCD1602 初始化函数{delay_50us(300);write_com(0x38);delay_50us(100);write_com(0x38);delay_50us(100);write_com(0x38);write_com(0x38);//显示模式设置write_com(0x08);〃显示关闭write_com(0x01);〃显示清屏write_com(0x06);〃显示光标移动设置write_com(0x0c);〃显示开及光标设置}/*********************************************/ void delay( uint t){while(t--);}/*************************************************void init_ds18b20(void)〃初始化{uchar n;DQ=1; //默认为高电平delay(8);DQ=O;delay(80); 〃12MHz晶振下大约600微秒的延时DQ=1; 〃释放总线delay(8);n=DQ;delay(4);}/***************************************************/void write_byte(char dat)〃写一个字节{uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;〃从最低位开始写,0x01delay(4);DQ=1;〃拉高,传下一帧数据dat>>=1;}delay(4);}/****************************************************/ uchar read_byte(void)〃读一个字节{uchar i;uchar value;for(i=0;i<8;i++){DQ=0;value>>=1; 〃判断8次,移位七次(起延时作用)DQ=1;if(DQ) 〃采样,判断DQvalue|=0x80; //赋值,与0x80 与一下delay(4);}retur n value;}/*****************************************************/ uchar readtemp1(void){uchar a,b,i; ini//读一个高八位,一个低八位t_ds18b20(); 〃readrom();// keep_rom(IP_1);// display_rom();write_byte(0x55);for(i=0;i<8;i++){write_byte(ID_1[i]);}write_byte(0x44); // 启动温度测量delay(300);ini t_ds18b20();write_byte(0x55);for(i=0;i<8;i++){write_byte(ID_1[i]);}write_byte(0xbe); 〃读这个温度a=read_byte(); 〃低位b=read_byte(); // 高位b<<=4;b+=(a&0 xfO)>>4; // 屏蔽低四位return b;}/******************************************************/ uchar readtemp2(void){uchar a,b,i; //读一个高八位,一个低八位ini t_ds18b20();〃readrom();// keep_rom(IP_1);// display_rom();write_byte(0x55);for(i=0;i<8;i++){write_byte(ID_2[i]);}write_byte(0x44); // 启动温度测量delay(300);ini t_ds18b20();write_byte(0x55);for(i=0;i<8;i++){write_byte(ID_2[i]);}write_byte(0xbe); 〃读这个温度a=read_byte(); 〃低位b=read_byte(); // 高位b<<=4;b+=(a&0 xfO)>>4; // 屏蔽低四位return b;}[未*************************************************** void display(void){uchar i;write_com(0x80);for(i=0;i<11;i++){write_data(table_temp[i]);delay_50us(1);}write_com(0x80+0x40);write_data(table[temp1/10]); write_data(table[temp1%10]); write_data(table_O[O]);write_data(table_0[1]);write_com(0x80+0x47);write_data(table[temp2/10]); write_data(table[temp2%10]); write_data(table_O[O]);write_data(table_0[1]); // 显示tempreture//第一个温度值//显示温度十位//显示温度个位〃第二个温度值〃显示温度十位〃显示温度个位。
最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。
DS18B20 产品的特点: (1)、只要求一个I/O 口即可实现通信。
(2)、在DS18B20 中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55 到+125℃之间; 在-10 ~ +85℃范围内误差为±5℃; (5)、数字温度计的分辨率用户可以从9 位到12 位选择。
将12位的温度值转换为数字量所需时间不超过750ms;(6)、内部有温度上、下限告警设置。
DS18B20引脚分布图DS18B20 详细引脚功能描述:1、GND 地信号;2、DQ数据输入出引脚。
开漏单总线接口引脚。
当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常太下高电平. 通常要求外接一个约5kΩ的上拉电阻.3、VDD可选择的VDD 引脚。
电压范围:3~; 当工作于寄生电源时,此引脚必须接地。
DS18B20存储器结构图暂存储器的头两个字节为测得温度信息的低位和高位字节;第3, 4字节是TH和TL的易失性拷贝, 在每次电复位时都会被刷新;第5字节是配置寄存器的易失性拷贝, 同样在电复位时被刷新;第9字节是前面8个字节的CRC检验值.配置寄存器的命令内容如下:0 R1 R0 11111MSBLSBR0和R1是温度值分辨率位, 按下表进行配置.默认出厂设置是R1R0 = 11, 即12位.温度值分辨率配置表R1R0分辨率最大转换时间(ms)009bit(tconv/8)4种分辨率对应的温度分辨率为0.5℃, 0.25℃, 0.125℃, 0.0625℃(即最低一位代表的温度值)12位分辨率时的两个温度字节的具体格式如下:低字节:高字节:其中高字节前5位都是符号位S, 若分辨率低于12位时, 相应地使最低为0, 如: 当分辨率为10位时, 低字节为:, 高字节不变....一些温度与转换后输出的数字参照如下:由上表可看出, 当输出是负温度时, 使用补码表示, 方便计算机运算(若是用C语言, 直接将结果赋值给一个int变量即可).DS18B20 的使用方法:由于DS18B20 采用的是1-Wire 总线协议方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
DS18B20的工作原理DS18B20是一种数字温度传感器,具有高精度、数字输出和单总线接口的特点。
它适合于各种温度测量和控制系统中,如温度监测、室内温度调节、自动化控制等领域。
DS18B20的工作原理如下:1. 原理概述DS18B20采用了基于CMOS工艺的数字温度传感器技术,利用温度对半导体材料电阻值的变化进行温度测量。
它内部集成为了温度传感器、模数转换器和数字信号处理电路,能够将温度转换为数字信号输出。
2. 温度传感器DS18B20的温度传感器采用了精密的硅材料,具有较高的灵敏度和稳定性。
当温度发生变化时,硅材料的电阻值也会相应变化。
通过测量电阻值的变化,可以得到温度的数值。
3. 模数转换器DS18B20内部集成为了一种精密的模数转换器(ADC),用于将传感器测得的温度值转换为数字信号。
模数转换器能够将连续变化的摹拟信号转换为离散的数字信号,以便于处理和传输。
4. 单总线接口DS18B20采用单总线接口进行数据通信。
单总线接口是一种串行通信协议,通过一个引脚同时实现数据传输和电源供应。
这种接口简化了传感器与控制器之间的连接,减少了线缆的使用。
5. 工作原理DS18B20的工作原理是通过发送一系列命令和接收传感器的响应来实现温度测量和数据传输。
控制器向传感器发送开始转换的命令,传感器开始测量温度并将结果转换为数字信号。
控制器再发送读取命令,传感器将转换后的温度值通过单总线接口传输给控制器。
6. 精度和分辨率DS18B20具有较高的温度测量精度和分辨率。
它可以测量的温度范围为-55℃到+125℃,精度可达±0.5℃。
分辨率可以通过配置寄存器进行设置,可选择9位、10位、11位或者12位的分辨率。
7. 应用领域DS18B20广泛应用于各种温度测量和控制系统中。
例如,它可以用于室内温度监测和调节,通过与控制器连接,实现自动化的温度控制。
此外,它还可以应用于电子设备的散热控制、温度报警系统等领域。
DS18B20的工作原理DS18B20是一种数字温度传感器,其工作原理是基于温度对半导体材料电阻值的影响。
该传感器采用单总线接口,能够直接与微处理器或者其他数字电路连接。
DS18B20传感器内部包含一个温度传感器,一个模数转换器和一个数字接口电路。
温度传感器由一个特殊的半导体材料制成,该材料的电阻值随温度的变化而变化。
模数转换器将传感器测量到的电阻值转换为数字信号,并通过数字接口电路将其传输给外部设备。
DS18B20传感器的数字接口采用单总线协议,即数据线和电源线共用一根路线。
这种设计使得传感器的连接变得简单,只需一根线就可以实现数据传输和供电。
传感器通过发送特定的命令来与外部设备进行通信,并将温度数据传输给外部设备。
DS18B20传感器具有以下特点:1. 高精度:DS18B20传感器能够提供高精度的温度测量,精度可达±0.5℃。
2. 宽温度范围:传感器能够在-55℃到+125℃的温度范围内正常工作。
3. 多点测量:可以通过在同一总线上连接多个DS18B20传感器,实现多点温度测量。
4. 低功耗:传感器在工作时功耗非常低,通常为1mW。
5. 高可靠性:DS18B20传感器采用了数字信号传输和单总线协议,具有较高的抗干扰能力和可靠性。
DS18B20传感器的应用广泛,常见于温度监测系统、气象站、电子设备等领域。
其优点包括简单的连接方式、高精度的温度测量、稳定可靠的性能等。
在实际应用中,可以根据需要选择不同封装形式的DS18B20传感器,如TO-92封装、SOIC封装等。
总结:DS18B20是一种基于温度对半导体材料电阻值的影响来实现温度测量的数字温度传感器。
其工作原理是通过测量半导体材料的电阻值来获取温度信息,并通过单总线接口将温度数据传输给外部设备。
DS18B20传感器具有高精度、宽温度范围、低功耗、多点测量和高可靠性等特点,广泛应用于各种温度监测系统和电子设备中。
最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。
DS18B20 产品的特点: (1)、只要求一个I/O 口即可实现通信。
(2)、在DS18B20 中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55 到+125℃之间; 在-10 ~ +85℃范围内误差为±5℃; (5)、数字温度计的分辨率用户可以从9 位到12 位选择。
将12位的温度值转换为数字量所需时间不超过750ms;(6)、内部有温度上、下限告警设置。
DS18B20引脚分布图DS18B20 详细引脚功能描述:1、GND 地信号;2、DQ数据输入出引脚。
开漏单总线接口引脚。
当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常太下高电平. 通常要求外接一个约5kΩ的上拉电阻.3、VDD可选择的VDD 引脚。
电压范围:3~5.5V; 当工作于寄生电源时,此引脚必须接地。
DS18B20存储器结构图暂存储器的头两个字节为测得温度信息的低位和高位字节;第3, 4字节是TH和TL的易失性拷贝, 在每次电复位时都会被刷新;第5字节是配置寄存器的易失性拷贝, 同样在电复位时被刷新;第9字节是前面8个字节的CRC检验值.配置寄存器的命令内容如下:MSBLSBR0和R1是温度值分辨率位, 按下表进行配置.默认出厂设置是R1R0 = 11, 即12位.温度值分辨率配置表4种分辨率对应的温度分辨率为0.5℃, 0.25℃, 0.125℃, 0.0625℃(即最低一位代表的温度值)12位分辨率时的两个温度字节的具体格式如下:低字节:高字节:其中高字节前5位都是符号位S, 若分辨率低于12位时, 相应地使最低为0, 如: 当分辨率为10位时, 低字节为:, 高字节不变....一些温度与转换后输出的数字参照如下:由上表可看出, 当输出是负温度时, 使用补码表示, 方便计算机运算(若是用C语言, 直接将结果赋值给一个int变量即可).DS18B20 的使用方法:由于DS18B20 采用的是1-Wire 总线协议方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
命令包含:
1. 读取站号命令
2. 写站号命令
3. 读取数据
4. 手动矫正数据
串口参数设置:
"73 删率:庾丽—厂DTR 厂RTS 确T 关闭甲口
|
數据位:f®-
一3楼樹fc 唾~3停止世
17 Mo (fcM*FtlU 15停显示
蛛 X LJ -TV
输AASC S^ASc' 17
恕略空昭辆入
厂自动换行 肓显示间隔
读站号命令(固定命令)
主站 从站地 址
功能码
H
地 址
L 地址 H
数 据
L 数据 CRC 00
03
00 01 00 01
CRClo
CRChi
从站
审口
注:返回帧与主站相同
设备地址:(XX=01-FF
示例:
命令00 03 00 01 00 01 D4 1B (固定命令)
回复00 03 02 00 FF C5 C4 (设备默认站号FF)
写站号命令
注:X X=0X01-0X F F
示例:
命令00 10 00 01 00 01 02 00 33 EA 04
回复00 10 00 01 00 01 51 D8
读数据
注:(F F
示例
命令FF 03 00 00 00 01 91 D4
回复FF 03 02 1C 27 D9 4A
注:温度:第4,5字节1C 27
实际温度=读数/100-40度
1C 27=7270
实际温度=7270/100-40=32.70 度引线定义:红色:5-24V
黑色:GND
黄色:485A
蓝色.
rm485B。
数字温度传感器DS18B20的应用1.DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
2.采用独特的“一线制”通信方式,信号符合TTL电平逻辑; 温度测量范围为-55 oC ~125 oC,以0.5 oC增减。
内部有温度上、下限报警设置。
实际应用中不需要外部任何元器件即可实现测温。
可编程的温度转换分辨率,可根据应用需要在9 Bit~12 Bit之间选取;在12 bit温度转换分辨率下,温度转换时间最大为750 ms; DS18B20采用节能设计,在等待状态下功耗近似为零。
二 DSl820 工作过程及时序DSl820 工作过程中的协议如下初始化 RoM 操作命令 存储器操作命令 处理数据1 初始化单总线上的所有处理均从初始化开始2 ROM 操作品令总线主机检测到DSl820 的存在便可以发出ROM 操作命令之一这些命令如指令代码Read ROM(读ROM) [33H]Match ROM(匹配ROM) [55H]Skip ROM(跳过ROM] [CCH]Search ROM(搜索ROM) [F0H]Alarm search(告警搜索) [ECH]3 存储器操作命令指令代码Write Scratchpad(写暂存存储器) [4EH]Read Scratchpad(读暂存存储器) [BEH]Copy Scratchpad(复制暂存存储器) [48H]Convert Temperature(温度变换) [44H]Recall EPROM(重新调出) [B8H]Read Power supply(读电源) [B4H]4 时序主机使用时间隙(time slots)来读写DSl820 的数据位和写命令字的位(1)初始化时序见图2.25-2主机总线to 时刻发送一复位脉冲(最短为480us 的低电平信号)接着在tl 时刻释放总线并进入接收状态DSl820 在检测到总线的上升沿之后等待15-60us 接着DS1820 在t2 时刻发出存在脉冲(低电平持续60-240 us)如图中虚线所示以下子程序在MCS51 仿真机上通过其晶振为12M.初始化子程序/*************************************/// DS18B20的复位函数uint8 ds18_rst(){uint8 ans=0;B20=1;timer(6,0);B20=0;timer(60,1);B20=1;timer(2,1);if(B20==0)ans=1;timer(40,1);return ans;}(2)写时间隙当主机总线t o 时刻从高拉至低电平时就产生写时间隙从to 时刻开始15us 之内应将所需写的位送到总线上DSl820 在t 15-60us 间对总线采样若低电平写入的位是0若高电平写入的位是1连续写2 位间的间隙应大于1us/***********************************///DS18B20的写数据函数void ds18_write(uint8 date){uint8 i;B20=1;delay(1);for(i=0;i<8;i++){B20=0;B20=date&0x01;delay(8);B20=1;date>>=1;}}3)读时间隙主机总线to 时刻从高拉至低电平时总线只须保持低电平6us在t1 时刻将总线拉高产生读时间隙读时间隙在t1 时刻后t 2 时刻前有效t 2距t2是15us, 也就是说t 2时刻前主机必须完成读位并在t2 后的60us 一120 us 内释放总线/*******************************************/// DS18B20的读数据函数uint8 ds18_read(){uint8 date=0,i;B20=1;delay(1);for(i=0;i<8;i++){B20=0;delay(1); //此处的延时不能超过10usdate>>=1;B20=1;if(B20)date|=0x80;delay(7);B20=1;delay(1);}return date;}DS18B20温度读取函数参考步骤:DS18B20开始转换:1.DS18B20复位。
新型单总线温度传感器DS18B20简介★ 新型单总线温度传感器DS18B20特点:DS18B20是DALLAS公司最新推出的单线数字温度传感器,新的“一线器件”体积更小、适用电压更宽、更经济。
Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
DS18B20、 DS1822 “一线总线”数字化温度传感器,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
DS1822的精度较差为± 2°C 。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20、 DS1822 的特性 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。
DS18B20的性能是新一代产品中最好的!性能价格比也非常出色!1). 只要求一个端口即可实现通信;2). 在DS18B20中的每个器件上都有独一无二的序列号;3). 实际应用中不需要外部任何元器件即可实现测温;4). 测量温度范围在-55。
C到+125。
C之间;5). 数字温度计的分辨率用户可以从9位到12位选择;6). 内部有温度上、下限告警设置;★ DS18B20引脚介绍:TO-92封装的DS18B20的引脚排列见下图,其引脚功能描述见表1。
表1 DS18B20详细引脚功能描述序名称 引脚功能描述号1 GND 地信号2 DO 数据输入/输出引脚。
#in clude<reg52.h>#defi ne uchar un sig ned char#defi ne uint un sig ned int sbit DQ=Pipsbit rs=P 2人0; sbit rw=P 2人1; sbit e=P 2人2;uchar temp 1,te mp2; IIuchar ID[8]; uchar codeID_1[]={0x28,0x3a,0x24,0xc6,0x02,0x00,0x00,0xa4};uchar code ID_2[]={0x28,0x66,0xa2,0xc1,0x02,0x00,0x00,0x26};uchar code table[]="0123456789";uchar code table_te mp []="te mp reture:";uchar code table_0[]="C :I****************************************************Ivoid delay_50us( uint time);void write_com(uchar com);void write_data(uchar dat);void in it_LCD1602(void);id ini t_ds18b20(void);void delay( uint t);void ini t_ds18b20(void);void write_byte(char dat);uchar read_byte(void);uchar readte mp 1(void);uchar readte mp 2(void);void dis pl ay(void); I***********************************************II*void readrom(void) II 读取温度传感器的序列号子函数{ini t_ds18b20(); delay_50us(2); write_byte(0x33);ID[0]=read_byte();ID[1]=read_byte();ID[2]=read_byte();ID[3]=read_byte();ID[4]=read_byte();ID[5]=read_byte();ID[6]=read_byte();ID[7]=read_byte();/*******************************************************/ /*voidkeep_rom(uchar *p) // 存序列号函数 {uchar i;//定义两个存放温度的变量//存放DS18B20的64位序列号的数组//第一个DS18B20的序列号 II 第二个DS18B20的序列号 //50us 的延时函数 IILCD1602写指令 IILCD1602写数据 IILCD1602 初 IIds18b20初始化 IIwhile ( t--)延时函数 IIDS18B20初始化函数 IIds18b20写一个字节函数 IIds18b20读一个字节函数 II 第一个ds18b20读取温度函数 II 第二个ds18b20读取温度函数for(i=0;i<8;i++) {*p=ID[i];P++;} /*****************************************************//*void dis play_rom(void) // 显示序列号函数{uchar i;write_com(0x80); for(i=0;i<8;i++){write_data(table[ID[i]/16]); write_data(table[ID[i]%16]);} /****************************************************/void main (void){in it_LCD1602();while(1){temp 仁readte mp 1();temp 2=readte mp 2();disp lay();/************************************************/ void delay_50us( uint time) {uchar j; for(;time>0;time--); for(j=19;j>0;j++);/************************************************/void write_com(uchar com) //LCD1602 写指令{e=0;rs=0;rw=0;P0=com;delay_50us(10);e=1;delay_50us(20);e=0;}/***************************************************/void write_data(uchar dat) //LCD1602 写数据 {e=0;rs=1;rw=0;P0=dat;delay_50us(10); e=1;delay_50us(20);e=0;/***************************************************///LCD1602初始化函数 delay_50us(300);write_com(0x38);delay_50us(100);write_com(0x38);delay_50us(100);write_com(0x38);write_com(0x38);//显示模式设置write_com(0x08);// 显示关闭write_com(0x01);// 显示清屏write_com(0x06);//显示光标移动设置 write_com(0x0c);//显示开及光标设置/*********************************************/ void delay( uint t) {while(t--);}/***************************************************/void init_ds18b20(void)// 初始化{uchar n;DQ=1; void in it_LCD1602(void){//默认为高电平delay(8);DQ=0;delay(80);DQ=1;delay(8);n=DQ;delay(4);}/***************************************************/ void write_byte(char dat)// 写一个字节{uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;//从最低位开始写,0x01 delay(4);DQ=1;//拉高,传下一帧数据dat>>=1;}delay(4);}/****************************************************/uchar read_byte(void)// 读一个字节{uchar i;uchar value;for(i=0;i<8;i++){DQ=0; value>>=1;DQ=1;if(DQ)value|=0x80;delay(4);}retur n value;}/*****************************************************/uchar readte mp 1(void) {uchar a,b,i;ini t_ds18b20();//readrom(); //12MHz 晶振下大约600微秒的延时 〃释放总线 〃判断8次,移位七次(起延时作用) 〃采样,判断DQ //赋值,与0x80与一下//读一个高八位,一个低八位// keep_rom(IP_1);// dis play_rom();write_byte(0x55);for(i=0;i<8;i++){ write_byte(ID_1[i]);}write_byte(0x44);// 启动温度测量 delay(300);ini t_ds18b20();write_byte(0x55);for(i=0;i<8;i++){ write_byte(ID_1[i]);}write_byte(0xbe);a=read_byte();b=read_byte();b<<=4;b+=(a&0 xf0)>>4;return b;}/******************************************************/ uchar readte mp 2(void){uchar a,b,i;ini t_ds18b20();//readrom();// keep_rom(IP_1);// dis play_rom();write_byte(0x55);for(i=0;i<8;i++){ write_byte(ID_2[i]);}write_byte(0x44);// 启动温度测量 delay(300);ini t_ds18b20();write_byte(0x55);for(i=0;i<8;i++){ write_byte(ID_2[i]);}write_byte(0xbe); 〃读这个温度〃读这个温度 //低位 //屏蔽低四位 //读一个高八位,一个低八位//低位//高位 a=read_byte(); b=read_byte(); b<<=4; b+=(a&0 xf0)>>4; return b; } /******************************************************/ //屏蔽低四位 void dis pl ay(void) {uchar i;write_com(0x80);for(i=0;i<11;i++){write_data(table_te mp [i]);delay_50us(1);}write_com(0x80+0x40);write_data(table[te mp 1/10]);write_data(table[tem p1%10]);write_data(table_0[0]);write_data(table_0[1]);write_com(0x80+0x47);write_data(table[te mp 2/10]);write_data(table[tem p2%10]);write_data(table_0[0]);write_data(table_0[1]);}//显示 tempreture //第一个温度值 //显示温度十位 //显示温度个位 〃第二个温度值 //显示温度十位 〃显示温度个位。
数字温度传感器DS18B20芯片介绍单总线命令序列典型的单总线命令序列如下第一步:初始化;第二步:ROM 命令跟随需要交换的数据;第三步:功能命令跟随需要交换的数据;(每次访问单总线器件,必须严格遵守这个命令序列。
)如果出现序列混乱,则单总线器件不会响应主机。
但是这个准则对于搜索ROM 命令和报警搜索命令例外。
在执行两者中任何一条命令之后,主机不能执行其后的功能命令,必须返回至第一步。
1 初始化基于单总线上的所有传输过程,都是以初始化开始的。
初始化过程由主机发出的复位脉冲和从机响应的应答脉冲组成。
应答脉冲使主机知道总线上有从机设备,且准备就绪,复位和应答脉冲的时间详见单总线信号部分。
2 ROM命令在主机检测到应答脉冲后,就可以发出ROM 命令。
每种命令长度为8 ,主机在发出功能命令之前必须送出合适的ROM 命令。
ROM 命令的操作流程如图3 所示。
ROM命令字如下:·READROM命令代码[33H]:如果只有一片DS1820,可用此命令读出其序列号,若在线DS1820多于一个,将发生冲突。
·MATCHROM命令代码[55H]:多个DS1820在线时,可用此命令匹配一个给定序列号的DS1820,此后的命令就针对该DS1820。
·SKIPROM命令代码[CCH]:此命令执行后的存储器操作将针对在线的所有DS1820。
·SEARCHRDH命令代码[F0H]:用以读出在线的DS1820的序列号。
·ALARMSEARCH命令代码[ECH]:当温度值高于TH或低于TL中的数值时,此命令可以读出报警的DS1820。
3 功能命令(以DS18B20为例)· WRITESCRATCHPAD命令代码[4EH]:写两个字节的数据到温度寄存器。
· READSCRATC HPAD命令代码[BEH]:读取温度寄存器的温度值。
·COPYSCRATCHPAD命令代码[48H]:将温度寄存器的数值拷贝到EEROM中,保证温度值不丢失。
DS18B20的工作原理DS18B20是一种数字温度传感器,它采用单总线接口进行通信,并使用独特的1-Wire协议进行数据传输。
DS18B20的工作原理可以简单概括为温度测量和数据传输两个主要过程。
1. 温度测量过程:DS18B20内部集成为了一个温度传感器,它通过测量半导体材料的电阻值来获取环境温度。
在工作时,DS18B20会将电源电压应用到传感器上,并通过内部电路将传感器的电阻值转换为数字信号。
具体的温度测量过程如下:1.1 上电初始化:当DS18B20接收到电源电压时,它会进行一系列的初始化操作,包括复位传感器、读取存储在ROM中的惟一地址等。
1.2 温度转换:DS18B20内部的温度传感器会将环境温度转换为电阻值。
这个转换过程是通过将电源电压应用到传感器上,然后测量传感器两端的电压来实现的。
传感器的电阻值与环境温度之间存在一种特定的关系,DS18B20会根据这个关系将电阻值转换为温度值。
1.3 数字信号输出:经过温度转换后,DS18B20会将测量到的温度值以数字信号的形式输出。
它使用独特的1-Wire协议将温度数据传输到控制器或者其他外部设备。
2. 数据传输过程:DS18B20使用1-Wire协议进行数据传输,这种协议只需要一个数据线来实现通信。
数据传输过程如下:2.1 主设备发送指令:主设备(通常是控制器)向DS18B20发送指令,指令可以是温度转换命令、读取温度值命令等。
2.2 DS18B20接收指令:DS18B20接收到主设备发送的指令后,会进行相应的处理。
例如,如果是温度转换命令,DS18B20会启动温度转换过程。
2.3 DS18B20发送应答信号:DS18B20在接收到指令后,会向主设备发送一个应答信号,表示已经准备好进行数据传输。
2.4 DS18B20发送数据:DS18B20会将温度数据以1-Wire协议的格式发送给主设备。
数据传输过程中,DS18B20会按照一定的时序将数据位发送给主设备。
单线数字温度传感器DS18B20原理及其应用DALLAS最新单线数字温度传感器DS18B20简介新的"一线器件"体积更小、适用电压更宽、更经济Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持"一线总线"接口的温度传感器。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
DS18B20、DS1822 "一线总线"数字化温度传感器同DS1820一样,DS18B20也支持"一线总线"接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
DS1822的精度较差为± 2°C 。
现场温度直接以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20、DS1822 的特性DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20的性能是新一代产品中最好的!性能价格比也非常出色!DS1822与DS18B20软件兼容,是DS18B20的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继"一线总线"的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
单总线协议-以DS18B20举例一、概述1-wire 单总线是Maxim 全资子公司Dallas 的一项专有技术。
与目前多数标准串行数据通信方式,如SPI/I2C/MICROWIRE 不同,它采用单根信号线,既传输时钟,又传输数据,而且数据传输是双向的。
它具有节省I/O 口线资源、结构简单、成本低廉、便于总线扩展和维护等诸多优点。
1-wire 单总线适用于单个主机系统,能够控制一个或多个从机设备。
当只有一个从机位于总线上时,系统可按照单节点系统操作;而当多个从机位于总线上时,则系统按照多节点系统操作。
为了较为全面地介绍单总线系统,将系统分为三个部分讨论:硬件结构、命令序列和信号方式信号类型和时序。
二、硬件结构顾名思义,单总线只有一根数据线。
设备(主机或从机)通过一个漏极开路或三态端口,连接至该数据线,这样允许设备在不发送数据时释放数据总线,以便总线被其它设备所使用。
单总线端口为漏极开路其内部等效电路如图1 所示。
单总线要求外接一个约5k 的上拉电阻;这样,单总线的闲置状态为高电平。
不管什么原因,如果传输过程需要暂时挂起,且要求传输过程还能够继续的话,则总线必须处于空闲状态。
位传输之间的恢复时间没有限制,只要总线在恢复期间处于空闲状态(高电平)。
如果总线保持低电平超过480us,总线上的所有器件将复位。
另外在寄生方式供电时,为了保证单总线器件在某些工作状态下(如温度转换期间EEPROM写入等)具有足够的电源电流,必须在总线上提供强上拉(如图1所示的MOSFET )。
三、命令序列典型的单总线命令序列如下:第一步:初始化第二步:ROM命令(跟随需要交换的数据)第三步:功能命令(跟随需要交换的数据)每次访问单总线器件,必须严格遵守这个命令序列,如果出现序列混乱,则单总线器件不会响应主机。
但是,这个准则对于搜索ROM命令和报警搜索命令例外,在执行两者中任何一条命令之后,主机不能执行其后的功能命令,必须返回至第一步。
3 .1 初始化基于单总线上的所有传输过程都是以初始化开始的,初始化过程由主机发出的复位脉冲和从机响应的应答脉冲组成。
应答脉冲使主机知道,总线上有从机设备,且准备就绪。
复位和应答脉冲的时间详见单总线信号部分。
3.2 ROM命令在主机检测到应答脉冲后,就可以发出ROM 命令。
这些命令与各个从机设备的唯一64位ROM代码相关,允许主机在单总线上连接多个从机设备时,指定操作某个从机设备。
这些命令还允许主机能够检测到总线上有多少个从机设备以及其设备类型,或者有没有设备处于报警状态。
从机设备可能支持5 种ROM命令(实际情况与具体型号有关),每种命令长度为8 位。
主机在发出功能命令之前,必须送出合适的ROM命令。
ROM命令的操作流程如图2 所示。
下面将简要地介绍各个ROM命令的功能,以及使用在何种情况下。
3.2.1 搜索ROM[F0h]当系统初始上电时,主机必须找出总线上所有从机设备的ROM代码,这样主机就能够判断出从机的数目和类型。
主机通过重复执行搜索ROM循环(搜索ROM命令跟随着位数据交换),以找出总线上所有的从机设备。
如果总线只有一个从机设备,则可以采用读ROM命令来替代搜索ROM命令。
关于搜索ROM命令的详细解释,请参见附录A。
在每次执行完搜索ROM循环后,主机必须返回至命令序列的第一步(初始化)。
3.2.2 读ROM[33h](仅适合于单节点)该命令仅适用于总线上只有一个从机设备。
它允许主机直接读出从机的64位ROM代码,而无须执行搜索ROM过程。
如果该命令用于多节点系统,则必然发生数据冲突,因为每个从机设备都会响应该命令。
3.2.3 匹配ROM[55h]匹配ROM命令跟随64位ROM代码,从而允许主机访问多节点系统中某个指定的从机设备。
仅当从机完全匹配64位ROM代码时,才会响应主机随后发出的功能命令;其它设备将处于等待复位脉冲状态。
3.2.4 跳越ROM[CCh] (仅适合于单节点)主机能够采用该命令同时访问总线上的所有从机设备,而无须发出任何ROM 代码信息。
例如,主机通过在发出跳越ROM命令后跟随转换温度命令[44h] ,就可以同时命令总线上所有的DS18B20 开始转换温度,这样大大节省了主机的时间。
值得注意,如果跳越ROM命令跟随的是读暂存器[BEh] 的命令(包括其它读操作命令)则该命令只能应用于单节点系统,否则将由于多个节点都响应该命令而引起数据冲突。
3.2.5 报警搜索[ECh](仅少数1-wire 器件支持)除那些设置了报警标志的从机响应外,该命令的工作方式完全等同于搜索ROM命令。
该命令允许主机设备判断那些从机设备发生了报警(如最近的测量温度过高或过低等)。
同搜索ROM命令一样,在完成报警搜索循环后,主机必须返回至命令序列的第一步。
3 3 功能命令(以DS18B20 为例)在主机发出ROM命令,以访问某个指定的DS18B20 接着就可以发出DS18B20,支持的某个功能命令。
这些命令允许主机写入或读出DS18B20 暂存器,启动温度转换以及判断从机的供电方式。
DS18B20 的功能命令总结于表1中,并在图3 流程图中作了说明表1 DS18B20 功能命令集1、在温度转换和复制暂存器数据至EEPROM期间,主机必须在单总线上允许强上拉。
并且在此期间,总线上不能进行其它数据传输;2、通过发出复位脉冲,主机能够在任何时候中断数据传输;3、在复位脉冲发出前,必须写入全部的三个字节。
四、信号方式所有的单总线器件要求采用严格的通信协议,以保证数据的完整性。
该协议定义了几种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。
所有这些信号,除了应答脉冲以外,都由主机发出同步信号。
并且发送所有的命令和数据都是字节的低位在前,这一点与多数串行通信格式不同(多数为字节的高位在前)。
4.1初始化序列:复位和应答脉冲单总线上的所有通信都是以初始化序列开始,包括:主机发出的复位脉冲及从机的应答脉冲,如图4 所示。
当从机发出响应主机的应答脉冲时,即向主机表明它处于总线上,且工作准备就绪。
在主机初始化过程,主机通过拉低单总线至少480us,以产生(Tx)复位脉冲。
接着,主机释放总线,并进入接收模式(Rx)。
当总线被释放后,5k上拉电阻将单总线拉高。
在单总线器件检测到上升沿后,延时15-60us,接着通过拉低总线60-240 us,以产生应答脉冲。
4.2 读/写时隙在写时隙期间,主机向单总线器件写入数据;而在读时隙期间,主机读入来自从机的数据。
在每一个时隙,总线只能传输一位数据。
4.2.1 写时隙存在两种写时隙:"写1" 和"写0" 。
主机采用写1 时隙向从机写入1,而采用写0 时隙向从机写入0。
所有写时隙至少需要60 us,且在两次独立的写时隙之间至少需要1u s 的恢复时间。
两种写时隙均起始于主机拉低总线(图5 所示)。
产生写1 时隙的方式:主机在拉低总线后,接着必须在15u s 之内释放总线,由5k 上拉电阻将总线拉至高电平;而产生写0 时隙的方式:在主机拉低总线后,只需在整个时隙期间保持低电平即可(至少60 us)。
在写时隙起始后15-60 us 期间,单总线器件采样总线电平状态。
如果在此期间采样为高电平,则逻辑1 被写入该器件;如果为0 ,则写入逻辑0 。
4.2.2 读时隙单总线器件仅在主机发出读时隙时,才向主机传输数,所以,在主机发出读数据命令后,必须马上产生读时隙,以便从机能够传输数据。
所有读时隙至少需要60us,且在两次独立的读时隙之间至少需要1us的恢复时间,每个读时隙都由主机发起,至少拉低总线1us (图5 所示)。
在主机发起读时隙之后,单总线器件才开始在总线上发送0 或1。
若从机发送1,则保持总线为高电平;若发送0,则拉低总线。
当发送0 时,从机在该时隙结束后释放总线。
由上拉电阻将总线拉回至空闲高电平状态。
从机发出的数据在起始时隙之后,保持有效时间15us ,因而,主机在读时隙期间必须释放总线,并且在时隙起始后的15 us 之内采样总线状态。
附录A ROM搜索实例ROM搜索过程只是一个简单的三步循环程序:读一位、读该位的补码、写入一个期望的数据位。
总线主机在ROM的每一位上都重复这样的三步循环程序。
当完成某个器件后,主机就能够知晓该器件的ROM信息。
剩下的设备数量及其ROM代码通过相同的过即可获得。
下面的ROM搜索过程实例假设四个不同的器件被连接至同一条总线上,它们的ROM代码如下所示:ROM1 00110101…ROM2 10101010…ROM3 11110101…ROM4 00010001…具体搜索过程如下:1 、主机发出复位脉冲,启动初始化序列。
从机设备发出响应的应答脉冲;2 、接着主机在总线上发出ROM搜索命令;3 、主机从总线上准备读入一个数据位,这时,每个响应设备分别将ROM代码的第一位输出到单总线上。
ROM1 和ROM4 输出0 至总线,而ROM2 和ROM3 输出1 至总线。
线上的输出结果将是所有器件的逻辑”与“ ,所以,主机从总线上读到的将是0 。
接着,主机开始读另一位,即每个器件分别输出ROM代码中第一位的补码,此时,ROM1 ROM4 输出1至总线,而ROM2 和ROM3 输出0 至总线。
这样,主机读到的该位补码还是0 。
主机由此判定,总线上有些器件的ROM代码第一位为0,有些则为1;两次读到的数据位具有以下含义:00 在该位处存在设备冲突;01 在该位处所有器件为0;10 在该位处所有器件为1;11 单总线不存在任何设备;4、主机写入0,从而禁止了ROM2 和ROM3 响应余下的搜索命令,仅在总线上留下了ROM1和ROM4;5 、主机再执行两次读操作,依次收到0 和1,这表明ROM1 和ROM4 在ROM代码的第二位都是0 ;6 、接着主机写入0,在总线上继续保持ROM1 和ROM4 ;7 、主机又执行两次读操作,收到两个0,表明所连接的设备的ROM代码在第三位既有0,也有1;8 、主机再次写入0 ,从而禁止了ROM1 响应余下的搜索命令,仅在总线上留下了ROM2;9 、主机读完ROM4 余下的ROM数据位。
这样就完成了第一次搜索,并找到了位于总线上的第一个设备;10、重复执行第1 至第7 步,开始新一轮的ROM搜索命令;11、主机写入1 ,使ROM4 离线,仅在总线上留下ROM1;12 、主机读完ROM1 余下的ROM数据,这样就完成了第二次的ROM搜索,找到了第二个ROM代码;13 、重复执行第1 至第3 步开始新一轮的ROM搜索命令14、主机写入1 这次禁止了ROM1 和ROM4 响应余下的搜索命令仅在总线上留下了ROM2和ROM3 ;15 、主机又执行两次读操作时隙读到两个0 ;16、主机写入0 ,这样禁止了ROM3 ,而留下了ROM2;17 、主机读完ROM2 余下的ROM数据,这样就完成了第三次的ROM搜索,找到了第三个ROM代码;18、重复执行第13至第15步,开始新一轮的ROM搜索命令;19 、主机写入1 这次禁止了ROM2 而留下了ROM3;20 、主机读完ROM3 余下的ROM数据,这样就完成了第四次的ROM搜索,找到了第四个ROM代码;说明:每次搜索ROM操作,主机只能找到某一个单总线器件的ROM代码,所需要的最短时间为:960 us+(8+3 64) 61 us=13.16ms ;所以主机能够在1秒之内读出75个单总线的ROM 代码。