ds18b20温度传感器pptDS18B20与Usb数据采集卡怎么连接?直接连接可以吗

  &在单片机与器件的有线通信中,并行最简单了,比方说1602液晶屏。但是代价就是连线多,占用单片机较多的IO口。一般的话,都是使用串行通信方式,其中有UART、SPI、IIC,还有一个我一直以来都比较头疼的达拉斯公司(现被美信收购)的单总线。单总线,故名思意,就是用1条连线进行通信,比起两条线的IIC(时钟线、数据线),单总线在操作上比较困难,对于时序要求比较高。没有了时钟线的帮助,它依靠电平持续时间判断信号,操作难度可想而知。
&&&&&&&& 在这之前,个人曾经购买过两个价格不菲(主要是价格贵,传感器又是小得不起眼)的DS18B20。这两块都在我手上经过了相同的经历:起初用用还行,勉强能够用单片机驱动,可以读出温度值来。一段时间没有用过后,重新拿出来后就出现各色各样的问题(要不就原来的程序压根驱动不了,要不就是有温度,当是读出来的温度是芯片内部默认的85度)。就这样子,毁掉了。所以,对于单总线,我有一种莫名的恐惧。
&&&&&&&& 不过现在,被我花了大半天时间,从阅读手册开始,重新开始掌握单总线的编程。当然,也花了几个钟头调试(在protues上面仿真),结果,是看到了成功。现在将其中的一点点心得记载下来。
&&&&&&&&DS18B20的硬件连接就不多说了,分为外部电源供电与寄生电源供电方式。
其内部方框图如下图,64位的ROM(只读),可以理解为DS18B20的ID。一个暂存器(掉电丢失数据)有8byte:从低字节开始是温度传感器的低字节、高字节、上限触发(用于设置温度报警上限)、下限触发、配置寄存器(用于设置温度传感器转化位数,默认12位)、(3字节保留位)、CRC。另外有一个EEPROM(掉电不丢失数据),用来保存暂存器相应的上限触发、下限触发、配置寄存器、CRC。
& & & & & & & & & & & &
现在,我们需要跟传感器通信,通信的话一般先要先要有一个初始化,所谓初始化,说白了就是问一下DS18B20在不在,然后,如果DS18B20还&活&着的话,它会给你回话,当然这里的回话很简单,把原来高电平拉至低电平。(跟IIC差不多,平常状态是高电平,低电平的话就是非常态)
初始化的时序如下图:
仔细看这张图就知道,主控器先将电平拉低,最少拉低480us,然后将总线释放掉(回到高电平)。然后,DS18B20为了表示存在,会在60-240us这段时间之间把总线拉低。这样,你可以在将总线释放掉后大约70us时候,读取一下总线电平状态,就可以知道了。
打完了招呼之后,就需要聊天。没错,就是向其发送命令或者数据。但你得知道怎么在一条总线上发一位数据。
上图就是单片机向总线发送1位数据的时序图。先拉低总线(持续时间要大于1us),然后在15us之内,你要发送你的电平(如果是高电平,释放掉总线;如果是低电平,就持续拉低电平),在接下来的45us之内,DS18B20会采样总线电平值。最后你还要把总线释放掉,便会常态。通常需要一次发个8bit,在每比特之间,要记得至少有1us的延时,当然,延时没上限。
学会了发送数据,也要学会接受数据。
从总线上面接受数据也跟发送数据一样,仔细看时序图,就可以解决了。
通常,我们会写成发一个字节的函数(而不是一比特)。有了通信的手段,再去看看通信的内容。就像人类可以看懂a,b,c一样,DS18B20可以看懂的就比较少,而且你得按照规则发送,不然它也看不懂。
在数据手册上,分为ROM指令:包括MATCH ROM[0x55]、SKIP ROM[0xCC]等。当然SKIP ROM这几个单词是给人类看的,真正发送给DS18B20的是0xcc(十六进制)。还有功能指令:包括CONVERT T[0x44]等。
总结来看,你得这样跟DS18B20交流:
步骤1:初始化(打招呼)
步骤2:ROM操作指令(就是发送指令)
步骤3:DS18B20功能指令(还是发送指令)
当然,可能需要读取温度数据,就跟在发送完读取指令之后。需要提醒一下:各个步骤之间不必没有空隙,而是需要有个延时(总线一直处于高电平),这个延时很长也不要紧,就是不要太短,不然的话,DS18B20就工作不正常。
下面贴出我写的代码:
头文件部分:(通常头文件写常数、变量、宏定义、函数原型,C文件写函数实体)
#ifndef __hal_ds18b20_h__
#define __hal_ds18b20_h__
#include&reg52.h&
#include"datatype.h"
#include"hal.h"
#include"delay.h"
sbit dq=P1^2;
#define DQ dq
//DS18B20 ROM指令
#define SEARCH_ROM 0xf0
#define READ_ROM 0x33
#define MATH_ROM 0x55
#define SKIP_ROM 0xcc//使用该指令跳过ROM指令
#define ALARM_SEARCH 0xec
//DS18B20 功能指令
#define CONVERT_T 0x44//使用该指令开始转换温度
#define WRITE_SCRATCHPAD 0x4e
#define READ_SCRATCHPAD 0xbe//使用该指令读取温度值
#define COPY_SCRATCHPAD 0x48
#define RECALL_E2 0xb8
#define READ_POWER_SUPPLY 0xb4
bit hal_ds18b20_init();
void hal_ds18b20_bit_write(bit val);
bit hal_ds18b20_bit_read();
void hal_ds18b20_byte_write(uchar val);
uchar hal_ds18b20_byte_read();
uint hal_ds18b20_get_temp(bit length,uchar * flag);
C文件部分:
#include"hal_ds18b20.h"
//返回1:表示初始化成功
bit hal_ds18b20_init()
&&&&&&&& //DQ高电平
&&&&&&&& DQ=0;//先拉低
&&&&&&&& delay_480us();//等待480us
&&&&&&&& DQ=1;//再释放总线,进入等待状态
&&&&&&&& delay_70us();//等待70us
&&&&&&&& return !DQ;
&&&&&&& //延时一段时间后,DQ高电平
void hal_ds18b20_bit_write(bit val)
&&&&&&&& //DQ高电平
&&&&&&&& DQ=0;//拉低
&&&&&&&& delay_8us();//延时8us
&&&&&&&& if(val)
&&&&&&&& {
&&&&&&&&&&&&&&&&&& DQ=1;//写1的话,需要在15us之内拉高
&&&&&&&& }
&&&&&&&& //如果写0,则DQ依旧是低电平
&&&&&&&& delay_52us();
&&&&&&&& DQ=1;//经过60us,然后释放总线
&&&&&&&& //DQ高电平
bit hal_ds18b20_bit_read()
&&&&&&&& bit tmp=0;
&&&&&&&& //DQ高电平
&&&&&&&& DQ=0;
&&&&&&&& _nop_();_nop_();//拉低电平2us
&&&&&&&& DQ=1;//释放总线
&&&&&&&& delay_10us();//时间到此有12us
&&&&&&&& tmp=DQ;//对总线进行采样
&&&&&&&& delay_48us();//时间到此有60us
&&&&&&&& //此时,DQ被ds18b20释放
&&&&&&&& //DQ高电平
//单总线要求从最低有效位开始传送
void hal_ds18b20_byte_write(uchar val)
&&&&&&&& for(i=0;i&8;i++)
&&&&&&&& {&
&&&&&&&&&&&&&&&&&& _nop_();_nop_();//每传送一位,期间至少间隔1us
&&&&&&&&&&&&&&&&&& if(val&(0x01&&i))
&&&&&&&&&&&&&&&&&&&&&&&&&&& hal_ds18b20_bit_write(1);
&&&&&&&&&&&&&&&&&& else
&&&&&&&&&&&&&&&&&&&&&&&&&&& hal_ds18b20_bit_write(0);
&&&&&&&& }&&&&&&&
uchar hal_ds18b20_byte_read()
&&&&&&&& uchar tmp=0,i;
&&&&&&&& for(i=0;i&8;i++)
&&&&&&&& {
&&&&&&&&&&&&&&&&&& _nop_();_nop_();//每传送一位,期间至少间隔1us
&&&&&&&&&&&&&&&&&& if(hal_ds18b20_bit_read())
&&&&&&&&&&&&&&&&&&&&&&&&&&& tmp=tmp|(0x01&&i);
&&&&&&&& }
//参数length=0:返回精确度为1位小数,此时返回值扩大了10倍
//参数length=1:返回精确度为2位小数,此时返回值扩大了100倍
//参数*flag,只是作为温度正负值标志传出用。0:正;1:负
//注意接收返回值变量需要是int型的
uint hal_ds18b20_get_temp(bit length,uchar * flag)
&&&&&&&& uint val=0;
&&&&&&&& uchar tmp1,tmp2;
&&&&&&&& while(!hal_ds18b20_init())
&&&&&&&&&&&&&&&&&& DELAY_500MS();
&&&&&&&& delay_ms(1);//发指令期间延时比较重要
&&&&&&&& hal_ds18b20_byte_write(SKIP_ROM);
&&&&&&&& delay_ms(1);
&&&&&&&& hal_ds18b20_byte_write(CONVERT_T);
&&&&&&&& DELAY_1S();//12bit精度情况下,需要750ms转换温度时间
&&&&&&&& while(!hal_ds18b20_init())
&&&&&&&&&&&&&&&&&& DELAY_500MS();
&&&&&&&& delay_ms(1);
&&&&&&&& hal_ds18b20_byte_write(SKIP_ROM);
&&&&&&&& delay_ms(1);
&&&&&&&& hal_ds18b20_byte_write(READ_SCRATCHPAD);
&&&&&&&& delay_ms(1);
&&&&&&&& tmp1=hal_ds18b20_byte_read();//一共可以读取9字节
&&&&&&&& tmp2=hal_ds18b20_byte_read();//这里来只读取前两个字节,温度值
&&&&&&&& //tmp1低字节&&&&&&&& tmp2高字节
&&&&&&&& *flag=(tmp2&0x80)?1:0;//传回温度正负
&&&&&&&& val=tmp1|tmp2&&8;//组成16位
&&&&&&&& if(*flag)//温度值是负数,需要取反加一
&&&&&&&&&&&&&&&&&& val=(~val)+1;
&&&&&&&& //按照12bit测温精度来算,扩大了100倍
&&&&&&&& return ((uint)(val*6.25+(length?0.5:50)))/(length?1:10);
阅读(...) 评论()温度传感器DS18B20与Usb数据采集卡怎么连接?直接连接可以吗?采集卡连接到PC机。Labview怎么设计该程序 - LabVIEW论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
温度传感器DS18B20与Usb数据采集卡怎么连接?直接连接可以吗?采集卡连接到PC机。Labview怎么设计该程序
14:38:53  
看了很多论文和资料依旧是一脑子浆糊,马上就要上交了,一点头绪都没有。整体的目标是用自己的PC机通过数据采集卡实现对温度的采集和显示。有以下疑惑:
假如选择温度 传感器DS18B20,因为它是输出数字信号,是不是就可以与数据采集卡的数字信号输入端连接?因为我们要对DS18B20初始化(如预警温度等等在使用之前需要初始化该温度传感器的等信息)。这个初始化我们怎样实现?如果是基于单片机的我们可以用c语言编程然后下载到单片机从而对该传感器进行初始化,但是我们这里不使用单片机,只有PC,数据采集卡,和传感器。怎样实现对其初始化等工作。还要对数据采集卡等有关信息进行设置比如通道选择,采集频率等等。这个是不是可以通过Labview来实现?数据采集卡与PC机通过USB接口连接时,如果Labview里没有该数据采集卡的驱动程序,我们是不是还要自通过调用DLL文件来编写,如果编写应该怎样具体的编写该驱动程序,具体流程如何?我们上述说的用USB接口连接到PC,假如我们用串口通信,那么实现该功能与用Usb实现该功能,不同在什么地方?是连接这三者(传感器,数据采集卡,Pc)硬件电路不同?还是Labview编写的软件不同?& && && & 学生 我真的很急,感觉很无奈有力无处使,求各位大神帮帮我,指点指点方向。学生在此先谢过各位大大了!
等待验证会员
16:29:49  
我也觉得头疼呀,给你顶一下吧
01:56:41  
请问,你这个问题解决了吗?我最近也遇到这样的问题,在使用labview的前提下,单片机和数据采集卡已经搞不明白了
14:21:07  
请问,你这个问题解决了吗?我最近也遇到这样的问题,在使用labview的前提下,单片机和数据采集卡已经搞不明白了
怎么做呢?我也遇到了这个问题呢
14:22:15  
怎么做呢?我最近也在做这个,
17:49:28  
怎么做呢?我最近也在做这个,
你好,你现在解决了这个问题没?最近也在做这个。谢谢
17:04:44  
楼主的这个问题最后是怎么解决的呀
17:38:20  
楼主能不能发我一份 ,我也在做这个
15:39:38  
楼主,这个问题怎么解决的啊,可以发给我一份吗?我现在也在做这个
16个问题&&&&&&&&3886个浏览
19个问题&&&&&&&&4024个浏览
CellWise周军
21个问题&&&&&&&&5571个浏览
Powered byiUSBDAQ数据采集卡与温度传感器配套使用
iUSBDAQ数据采集卡功能很多,在工业测量记录,学校教学等方面使用非常广泛,在不同的场合起到不同的作用。现在我们举出一种的例子教会您如何配套使用:
iUSBDAQ数据采集卡与温度传感器的配套使用(以PT100为例),如果手头有一款PT100的温度传感器,它的测量温度范围是-30&C到30&C,经过变送器后输出的是4-20mA的电流形式,如果是在这种允许的条件下完全可以用我们的iUSBDAQ数据采集卡来测量,实物图连接如001所示(粗略图):
iUSBDAQ数据采集卡与温度传感器配套使用下载
下载资料需要,并消耗一定积分。
下载此资料的人还喜欢:
技术交流、我要发言! 发表评论可获取积分! 请遵守相关规定。
本月热点资料
电子资料热门词

我要回帖

更多关于 ds18b20温度传感器 的文章

 

随机推荐