其中:
1、黑色粗线表示主机(AVR)将总线拉低;
2、灰色粗线表示DS18B20将总线拉低;
3、细线表示上拉电阻将总线拉高;
4、斜线表示无效的时间,就是没有任何操作起作用;
5、灰色方块表示器件(主机或者从机采样总线上的数据的时间),
6、还有黑色和灰色的混合线(左下图)表示主机和从机同时将总线拉低。
单总线协议对时序有非常严格的要求,精确到微秒,在此希望大家细心:
“写“时序:原文:“The DS18B20 samples the DQ line in a window of 15 µs to 60 µs after the DQ line falls.If the line is high, a Write 1 occurs.If the line is low, a Write 0 occurs。”
翻译过来便是:DS18B20会在DQ线(数据线)保持低电平之后的15us到60us之间采样DQ线,若为高则表示“写1”,若为低则表示“写0”。
所以我们如果要“写0”:则需要把DQ线保持低电平至少60us(笔者用了65us),然后将DQ设置为高阻态,让外部上拉电阻将DQ拉成高电平;
如果要“写1”,则需要把DQ线置为低电平(至少大于1us小于15us),然后设置DQ为高阻态,让外部上拉电阻将DQ拉成高电平,DS18B20会在此后的45~60us之内采样到这个“写1”的高电平;
“读”时序原文:
A read time slot is initiated when the host pulls the data line from a logic high level to logic low level.The data line must remain at a low logic level for a minimum of 1 µs; output data from the DS18B20 is valid for 15 µs after the falling edge of the read time slot. The host therefore must stop driving the DQ pin low in order to read its state 15 µs from the start of the read slot. By the end of the read time slot, the DQ pin will pull back high via the external pullup resistor. All read time slots must be a minimum of 60 µs in duration with a minimum of a 1-µs recovery time between individual read slots.
翻译过来便是:当将DQ线从高电平拉至低电平时,便开始了读时序。DQ线必须保持低电平最少1us,从DS18B20输出的数据再DQ下降沿之后的15us之内都有效。所以在此15us期间主机不能将DQ线拉低。再读时序的最后,DQ线会被外部上拉电阻拉高。所有的读时序至少要维持60us的时间,并且每两次“读”之间至少要有1us的间隔。
所以“读时序”:我们只需要将DQ从搞拉成低电平至少1us(笔者用2us),然后将DQ设置为上拉电阻拉高,然后在下降沿之后的15us之内将DQ线上的电平读出。在此建议在15us的后半阶段读。
以上就是DS18B20的读写时序,注意无论字节的读写,都是从最低位开始的。下面是DS18B20的控制字,笔者只列出足以让单个DS18B20正常工作的:
跳过ROM检测【0xcc】:此命令可以省去DS18B20内部ROM序列的匹配检测,在使用单个DS18B20器件时可以使用,节省时间。
温度变换【0x44】:此命令可以使DS18B20开始转换温度,按照精度在适当时间内完成转换。
温度数据读取【0xBE】:此命令写入后,DS18B20会输出内部温度数据暂存器的数据,这就是我们需要的温度测量数据。
所以我们要DS18B20转换温度并读出这个温度,遵循以下流程即可:
“复位——写0xcc(跳过匹配ROM)——写0x44(转换温度)——复位——写0xbe(读取温度)”,剩下的就是温度的显示问题了。
以下是源程序: main.rar(1.76 KB, 下载次数: 118)