如何使用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
|
|
|
|
多谢啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
|
|
|
|
|
您好,我想咨询一下如何实现在cc2530芯片的一个IO口上挂多个ds18b20? 最好有附带的程序
|
|
|
|
|
发送校验ROM指令后迅速设置,试试看。。 谢谢分享
|
|
|
|
|