首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
嵌入式技术
» 基于DS18B20测温系统解决方案
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
基于DS18B20测温系统解决方案
发短消息
加为好友
emtronix20105
当前离线
UID
811198
帖子
72
精华
0
积分
36
阅读权限
0
在线时间
21 小时
注册时间
2010-5-5
最后登录
2010-10-31
禁止访问
UID
811198
1
#
打印
字体大小:
t
T
emtronix20105
发表于 2010-5-7 21:00
|
只看该作者
基于DS18B20测温系统解决方案
测温
,
方案
,
系统
英创嵌入式主板以其优异的稳定性、独特的设计及方便使用等优点,在嵌入式领域占有一席之地。在工业现场,经常有监测环境温度的需求,本方案应用DS18B20为温度采集芯片,与英创嵌入式主板的GPIO相连,就可以组成完整的测温系统。由于DS18B20每条总线上可以最多接8个测温点,那么英创嵌入式主板至少可以接64个测温点。
DS18B20数字温度计是DALLAS公司生产的1-Wire即单总线器件,具有线路简单,体积小的特点。实际应用中不需要外部任何元器件即可实现测温,测量温度范围在-55°C到+125°C之间,数字温度计的分辨率用户可以从9位到12位选择;并且内部有温度上、下限告警设置,使用非常方便。
TO-92封装的DS18B20的引脚排列见图1,其引脚功能描述见表1。
图1 DS18B20管脚示意图
表1 DS18B20详细引脚功能描述:
序号
名称
引脚功能描述
1
GND
地信号
2
DQ
数据输入/输出引脚。开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源。
3
VDD
可选的VDD引脚。当工作于寄生电源时,此引脚必须接地。
DS18B20的使用方法
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对嵌入式主板来说,硬件上并不支持单总线协议,因此,我们必须采用GPIO的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。在本示例中,只需把管脚2接英创嵌入式主板的GPIO,管脚3接5V电源,管脚1接地,就可以搭建起测试环境,如图二所示。如果需要测试多点温度,可以把多个DS18B20并起。
图2 嵌入式主板与DS18B20连接示意图 由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将嵌入式主板作为主设备,单总线器件作为从设备。每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件送回数据,在进行写命令后,主机需要启动读时序完成数据接收。数据和命令的传输都是低位在先。
下面是18B20的时序图,根据时序的要求,改变GPIO的电平,可以完成18B20的操作。
DS18B20复位时序
图3 DS18B20复位时序 根据以上DS18B20的时序,初始化的函数如下:
Init18b20()
{
char flag;
OutBit(1);
Delayus(1);
OutBit(0);
Delayus(600); //复位信号480—960us
OutBit(1);
Delayus(60); //等待15-60us
if(ReadBit()) //检查存在电平,如果为低,说明18B20正确复位
{
printf('init fail');
return false; //detect 1820 fail!
}
else
{
Sleep(1);
OutBit(1);
return true; //detect 1820 success!
}
}
DS18B20的数据读写时通过时间间隙处理位和命令字来确认信息交换。
DS18B20的写时间隙
当主机把数据线从逻辑高电平拉到逻辑低电平的时候,写时间隙开始。有两种写时间隙:写1时间隙和写0时间隙。所有写时间隙必须最少持续60us,包括两个写周期间至少1us的恢复时间。
I/O线电平变低后,DS18B20在一个15us到60us的窗口内对I/O线采样。如果线上是高电平,就是写1,如果线上是低电平,就是写0。如图所示。
图4 DS18B20写时序图 void DS18B20::WriteByte(uchar wr)
{
uchar i;
OutBit(1);
Delayus(1);
for (i=0;i<8;i++) //写8bit
{
OutBit(0) ; // 总线拉低,写间隙开始
Delayus(10); //延时 2-12us
OutBit(wr&0x01) ; //写数据到总线
Delayus(30); //在15us—60us之间采用
OutBit(1); //释放总线
wr >>= 1;
Delayus(2);
}
Sleep(1); //字节之间最好间隔的稍微长一点
}
DS18B20的读时间隙
当从DS18B20读取数据时,主机生成读时间隙。当主机把数据线从高电平拉到低电平时,读时间隙开始,数据线必须保持至少1us;从DS8B20输出的数据在读时间隙的下降沿出现后15us内有效。对于DS18B20的读时隙是从主机把总线拉低之后,在15微秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少要60us才能完成。
图5 DS18B20读时序图 根据以上的读时序图,读字节函数如下:
UCHAR DS18B20::ReadByte()
{
uchar i,u=0;
OutBit(1);
Delayus(1);
for(i=0;i<8;i++) //读一字节
{
OutBit(0) ; // 总线拉低,读间隙开始
Delayus(2);
OutBit(1) ; //拉高总线
Delayus(4); //在1-14us之内读取总线数据
u >>= 1;
if(ReadBit()==1) u |= 0x80;
Delayus(60); //读取数据周期至少60us
OutBit(1) ;
}
return(u);
}
在读温度之前,要先启动温度转换,如果采用寄生电源供电,温度转换的时间应该大于500毫秒。对于一条总线的多个18B20来说,启动转换不需要匹配18B20的ROM地址。
void DS18B20::StartConvert()
{
Init18b20 ();
WriteByte(0xcc); //跳过ROM
WriteByte(0x44); //启动转换命令
}
在读指定的18B20时,就要先发匹配命令,再发ROM序列号,具体请参考下面的程序:
void DS18B20::TemperatuerResult(char id)
{
uchar i;
Init18b20 ();
WriteByte(0x55); //匹配ROM地址
for(i=0;i<8;i++) //发18B20地址码
{
WriteByte(b20rom[id]
);
}
WriteByte(0xbe); //发读温度命令
read_bytes(2); //前2个字节为温度值
temp=temp_buff[1]&0x0f; //去掉符号位
temp=temp<<8;
temp=temp+temp_buff[0];
Temperature=temp*0.0625; //得到温度值
}
源程序请参考光盘源码。
[
查看全文
]
[
关于英创
]
[
更多文章
]
[
技术论坛
]
本文PDF格式下载
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议