基于FS4412的DS18B20温度采集编程实现(1-时序分析)
作者:秦老师,华清远见嵌入式学院讲师。
一、DS18B20简介
DS18B20是常用的数字温度计。DS18B20数字温度计提供9至12位(可配置)温度读数,表明该设备的温度。
信息通过单总线接口被发送到DS18B20或从DS18B20发出,因此从中央微处理器到DS18B20只有需要一个线(和地线)。
读,写和进行温度转换所需要的电源,可以由数据线本身来提供,无需外部电源。 由于每个DS18B20含有唯一的序列号,多个DS18B20可以挂载在一条单总线上。这允许在许多不同的地方,放置温度传感器。
这个功能是非常有用的,可以应用在包括HVAC环境控制,建筑物内部的温度感应, 设备或机械,过程监测和控制等领域。
二、DS18B20硬件连接

DS18B20引脚图 DS18B20 原理图
DS18B20 有三个引脚。根据原理图可知,DS18B20采用了外部供电的连接方式,而DQ引脚上拉10k电阻。DQ引脚连接在4412芯片的GPK1_1 引脚上面。

三、DS18B20时序分析
DS18B20是一个单总线,输入和输出都是通过DQ引脚,我们需要根据时序图,不断的操作DQ这个引脚,实现具体的功能。
(一)ds18b20复位时序和函数实现

通过复位信号,可以检测DS18B20是否工作正常,并通知DS18B20准备通信。
(1)4412拉低DQ引脚,复位周期开始。
(2)DQ引脚上的低电平保持480us—960us 的时间,然后释放总线。
(3)4412延时16us—60us等待DS18B20应答。
(4)DS18B20拉低DQ引脚60us—240us,表示应答。
4412读取DQ引脚电平,如果是低电平,表示初始化完成。
(5)DS18B20应答信号结束后,释放总线,DQ引脚被上拉电阻拉高,复位周期结束。
实现ds18b20的复位代码:
void DS18_Reset()
{
GPK1.PUD = 0; //GPK1_1 禁止上下拉
GPK1.CON = (GPK1.CON & ~(0xF << 4)) | 0x1 << 4; //设置GPK1_1为输出引脚
GPK1.DAT &= ~(0x1 << 1); //设置GPK1_1 输出‘0’,拉低DQ引脚
delay_us(700); //延时 600us
GPK1.DAT |= 0x1 << 1; //GPK1_1释放总线
GPK1.CON &= ~(0xF << 4); //设置GPK1_1为输入引脚
while(GPK1.DAT & (0x1 << 1)); //等待DS18B20应答信号 (DQ引脚低电平)
while(!(GPK1.DAT & (0x1 << 1))); //等待DS18B20应答信号结束(DQ引脚高电平)
}
(二)ds18b20写时序和函数实现

当我们需要从DS18B20写数据的时候,必须严格DS18B20的写时序,进行操作。
向DS18B20写逻辑0操作:
(1)4412拉低DQ引脚,写周期开始。
(2)DQ引脚保持低电平15us左右。
(3)DQ引脚继续保持低电平20us--45us。
(4)释放总线。
向DS18B20写逻辑1操作:
(1)4412拉低DQ引脚,写周期开始。
(2)DQ引脚上的低电平保持大于1us后,拉高DQ引脚 ,总共15us。
(3)DQ引脚继续保持高电平20us—45us
(4)释放总线。
实现向DS18B20写入一个字节代码:
void DS18_Write(unsigned char data)
{
unsigned char i;
GPK1.CON = (GPK1.CON & ~(0xF << 4)) | 0x1 << 4; //设置GPK1_1为输出引脚
for(i = 0; i < 8; i++)
{
GPK1.DAT |= 0x1 << 1; //设置GPK1_1 输出1
delay_us(1); //延时1us
GPK1.DAT &= ~(0x1 <<
1); //设置GPK1_1 输出0形成下降沿
delay_us(12); //延时12us,大于1us小于15us
if(data & 0x1) //如果数据最低位为1
GPK1.DAT |= 0x1 << 1; //设置GPK1_1 输出1
delay_us(40); //延时40us
data = data >> 2; //数据右移1位
}
}
(三)ds18b20写时序和函数实现

当我们需要从DS18B20读数据的时候,必须严格DS18B20的读时序,进行操作。
(1)通过4412拉低DQ引脚,读周期开始。
(2)DQ引脚上的低电平至少保持1us 的时间,然后释放引脚。
(3)4412延时几us(留物理电平反应时间),读取DQ引脚的数据。
注意:根据图中MASTER SAMPLES指示,从拉低电平转换开始,留给物理电平转换时间,到最后4412的对DQ引脚读取操作应给在15us之内完成。
(4)15us后读时隙结束时,DQ引脚将通过外部上拉电阻拉回高电平。
4412延时45us等待读周期结束。
实现向DS18B20读入一个字节数据代码:
unsigned char DS18_Read()
{
unsigned char i, Temp = 0; //初始化接受变量Temp为0
for(i = 0; i < 8; i++)
{
GPK1.CON = (GPK1.CON & ~(0xF << 4)) | 0x1 << 4; //设置GPK1_1为输出引脚
GPK1.DAT |= 0x1 << 1; //设置GPK1_1 输出1
GPK1.DAT &= ~(0x1 <<
1); //设置GPK1_1
输出0,形成下降沿
GPK1.DAT |= 0x1 << 1; //GPK1_1释放总线
GPK1.CON &= ~(0xF <<
4); //设置GPK1_1为输出引脚
Temp >>= 1; //接受变量右移1位
if(GPK1.DAT & (0x1 <<
1))
//读取DQ引脚,如果DQ为1
Temp |= 0x80; //接受变量Temp,最高位置1
delay_us(30); //延时30us
}
return Temp; //返回接受变量
}
文章来源:华清远见嵌入式学院,原文地址:http://www.embedu.org/Column/Column909.htm
基于FS4412的DS18B20温度采集编程实现(1-时序分析)的更多相关文章
- 【应用笔记】【AN003】VC++环境下基于以太网的4-20mA电流采集
简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC++环境下进行温度采集,实现WINDOWS平台对数据的采集.分析及显示 ...
- 【应用笔记】【AN001】VC#开发环境下基于以太网的4-20mA电流采集(基于modbus tcp 协议)
版本:第一版 作者:毛鹏 杨帅 日期:20151108 简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC#环境下进行温 ...
- 【应用笔记】【AN005】Qt开发环境下基于RS485的4-20mA电流采集
简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍在Qt开发环境下基于RS485实现4-20mA电流采集,实现WINDOWS平台对数据的采集.分析及显示. 系统组成 ...
- 【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集
版本:第一版作者:周新稳 杨帅 日期:20160226 =========================== 本资料高清PDF 下载: http://pan.baidu.com/s/1c1uuhLQ ...
- 一种快速查询多点DS18B20温度的方法(转)
源:http://hi.baidu.com/james_xiao/item/79b961c90623093e45941623 一种快速查询多点DS18B20温度的方法 引言 为了满足实时性要 ...
- UWB DWM1000 开源项目框架 之 温度采集
在之前博文开源一套uwb 框架,后面几篇博文会基于这个开源框架进行简单开发. 让uwb使用者更清楚了解基于这个basecode 开发工作. 这里所做内容是,采集dwm1000 温度,并发送到另一个节点 ...
- 基于引擎的matlab+vc混合编程的配置
前段时间在项目中做了一些关于基于引擎的vc+matlab混合编程的工作. 如果你是混合编程新手,我相信使用引擎的方式编程是比较简单快捷的一种方式. 当然这种方法也有其缺点,就是不能脱离matlab运行 ...
- atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系
atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系 1. server控件是要server了解了标签.种类型的server控件: 1 1. ...
- Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探
由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...
随机推荐
- 在Application中集成Microsoft Translator服务之开发前准备
第一步:准备一个微软账号 要使用Microsoft Translator API需要在Microsoft Azure Marketplace(https://datamarket.azure.com/ ...
- [Search Engine] 搜索引擎技术之查询处理
我们之前从开发者的角度谈了一些有关搜索引擎的技术,其实对于用户来说,我们不需要知道网络爬虫到底是怎样爬取网页的,也不需要知道倒排索引是什么,我们只需要输入我们的查询词query,然后能够得到我们想要的 ...
- Codeforces Round #262 (Div. 2) 1004
Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...
- Linux 定时任务 Crontab命令 详解
前言 crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比 ...
- C和指针 第十四章 预处理器 头文件
编写一个C程序,第一个步骤称为预处理,预处理在代码编译之前,进行一些文本性质的操作,删除注释.插入被include的文件.定义替换由#define定义的符号,以及确定代码的部分内容是否应该按照条件编译 ...
- sublime 编译运行C程序
{ "cmd": ["gcc", "${file}", "-o","${file_path}/${file_b ...
- WORDPRESS点击标题或图片无法链接到文章页面
在设置出更改固定连接设置
- nginx error_log 错误日志配置说明
nginx的error_log类型如下(从左到右:debug最详细 crit最少): [ debug | info | notice | warn | error | crit ] 例如:error_ ...
- 为什么operator>>(istream&, string&)能够安全地读入长度未知的字符串?
一般而言,实现"读入用户输入的字符串",程序中自然不能对用户输入的长度有所限定.这在C++中很容易实现,而在C中确没那么容易. 这一疑问,我在刚学C++的时候也在脑中闪现过:不过很 ...
- C/C++:C++中static,extern和extern "C"关键字
1. extern 变量 extern 表明该变量在别的地方已经定义过了,在这里要使用那个变量. 当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern in ...