如何使用DS18B20测量一个温度值: 首先包保证对DS18B20读写操作的函数没有问题基本的 //从DS18B20读取一个位 //返回值:1/0 u8 DS18B20_Read_Bit(void) // read one bit { u8 data; DS18B20_IO_OUT();//SETPA0 OUTPUT DS18B20_DQ_OUT=0; delay_us(2); DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SETPA0 INPUT delay_us(12); if(DS18B20_DQ_IN)data=1; else data=0; delay_us(50); return data; } //从DS18B20读取一个字节 //返回值:读到的数据 u8 DS18B20_Read_Byte(void) // read one byte { u8 i,j,dat; dat=0; for(i=1;i<=8;i++) { j=DS18B20_Read_Bit(); dat=(j<<7)|(dat>>1); } return dat; } //写一个字节到DS18B20 //dat:要写入的字节 void DS18B20_Write_Byte(u8 dat) { u8 j; u8 testb; DS18B20_IO_OUT();//SETPA0 OUTPUT; for (j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if (testb) { DS18B20_DQ_OUT=0;// Write 1 delay_us(2); DS18B20_DQ_OUT=1; delay_us(60); } else { DS18B20_DQ_OUT=0;// Write 0 delay_us(60); DS18B20_DQ_OUT=1; delay_us(2); } } } 因为单片机只对一个DS18B20 进行操作,就不需要读取ROM 编码以及匹配ROM 编码了,只要用跳过ROM (0XCC )命令。
再进行温度的读取和转换就可以得到温度值了
多点温度读取 但是有时我们做一个项目可能要测量多个位置的温度,这个时候我们任然可以选用DS18B20来完成这项工作。每一个DS18B20都有自己的48位序列号,我们可以通过这个序列号在同一个IO口上寻找不同的DS18B20。然后接下来的操作就和读取一个DS18B20温度的是一样的。 得到一个DS18B20的光刻ROM是实现多点温度采集的前提,首先初始化DS18B20的状态,在向DS18B20写读ROM(0X33)的指令,再接收数据即可。如下图。
读取出的光刻ROM可以通过下面的函数进行检验是否正确
得到的光刻ROM可以通过串口,打印到上位机上
然后在上位机中可以看到这样的数据(看不清可以放大WORD来看)
要知道64位的光刻ROM中有8位是产品类型标号,每个DS18B20都是一样的,0X28。要注意的问题是在上位机超过9的数字,并不是以a,b,c,d……..的形式显示,而是以10,11,12…….的形式显示。
然后在通过自己的转换就可得到光刻ROM了。
得到了光刻ROM再借助这两个函数就可以进行温度读取了
完整的程序另外附带
如果还有什么不懂的,欢迎加QQ:1254411429讨论。
8
|
|
|
|
18b20有个id号,读取温度的时候不要跳过检验id,就可以一个io挂多个18b20了。。。
|
|
|
|
|
现在我碰到一个问题,就是不知道怎么在DS18B20中的高温限值、低温限值中设置温度,并且实现掉电保存
|
|
|
|
|
我能实现一个DS18B20的温度上下限设置,但是多个一起的时候就有问题了
|
|
|
|
|
谢谢分享谢谢分享谢谢分享
谢谢分享谢谢分享 谢谢分享
谢谢分享谢谢分享 谢谢分享
谢谢分享 谢谢分享谢谢分享谢谢分享
谢谢分享 谢谢分享 谢 谢
谢谢分享 谢谢分享 谢 谢
谢谢分享 谢谢分享 分 分
谢谢分享 谢谢分享 享 享
谢谢分享 谢谢分享 谢 谢
谢谢分享 谢谢分享 谢 谢
谢 谢谢分享 谢谢分享 分 分
谢谢 谢谢分享 谢谢分享 享 享
谢谢分 谢谢分享 谢谢分享 谢 谢
谢谢分 谢谢分享 谢 谢
谢谢分谢谢分享 谢 谢
谢谢谢谢 分 分
谢谢 享 享
|
|
|
|
|
谢谢分享谢谢分享谢谢分享
谢谢分享谢谢分享 谢谢分享
谢谢分享谢谢分享 谢谢分享
谢谢分享 谢谢分享谢谢分享谢谢分享
谢谢分享 谢谢分享 谢 谢
谢谢分享 谢谢分享 谢 谢
谢谢分享 谢谢分享 分 分
谢谢分享 谢谢分享 享 享
谢谢分享 谢谢分享 谢 谢
谢谢分享 谢谢分享 谢 谢
谢 谢谢分享 谢谢分享 分 分
谢谢 谢谢分享 谢谢分享 享 享
谢谢分 谢谢分享 谢谢分享 谢 谢
谢谢分 谢谢分享 谢 谢
谢谢分谢谢分享 谢 谢
谢谢谢谢 分 分
谢谢 享 享
|
|
|
|
|
DS18B20选择12位分辨率为0.0625,但是老师说它的精度为0.5摄氏度,请问这两者之间有什么差异?
谢谢楼主的分享,正好遇上了
|
|
|
|
|
怎样修改测试的精度的?就是需要什么命令?我想仅仅进行0.25的精度测量以减小测量时间?
|
|
|
|
|