基于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

更多相关嵌入式免费资料查看华清远见讲师博文>>

时间: 2025-01-05 22:32:14

基于FS4412的DS18B20温度采集编程实现(1-时序分析)的相关文章

基于QT4的智能温度采集控制系统

硬件环境:Tiny6410开发板一套,DS18B20温度采集芯片 软件环境:Linux 2.6.38,QT4运行库 驱动程序:6410_ds18.ko  设备文件名:/dev/DS18dev0 主控程序:ts9000 程序运行说明:开发板通电后,自动运行. 运行界面如下: 1.主界面,通过点击相关按钮进行功能界面. 2.采集显示,5秒自动更新从DS18采集的温度数据. 3.温度报警设置,如果采集到的温度超过设置范围系统报警. 注意:要保存后,数据才生效. 4.设备控制,可控制蜂鸣器状态.

基于FPGA的nrf24l01与ds18b20温度采集与发送接收

配套FPGA开发板(含该设计的工程代码):https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-4676525296.4.6e8950ed57YPhv&id=17848039135 发送模块整体设计 主要分为三个模块: 18B20温度采集top_mode. 数码管温度显示seg. 24L01发送模块nrf24l01_control和send_function. 整体结构图: 接收模块整体设计 主要分为两个模块: 数码管温度显示seg. 24L0

基于arm的多路温度采集控制系统(1)项目介绍

嵌入式项目实践–多路温度采集控制系统(1)项目介绍 项目实践说明: 本实践项目是嵌入式开发培训(阶段1)基础应用开发视频课程的综合实践项目. 项目开发使用的技术知识点包括:C语言编程,文件编程,串口编程,网络编程,多线程编程,进程间通信,嵌入式交叉开发,嵌入式Web服务器开发,HTML编程. 本文档对应视频教程多路温度采集系统–项目介绍 系统硬件 主控模块:NanoPI开发板(arm9 s3c2451) 功能: 1.运行后台采集控制程序,实时动态采集多路串口与网络的温度数据. 2.运行嵌入式we

基于arm的多路温度采集控制系统(2)需求分析

嵌入式项目实践–多路温度采集控制系统(2)需求分析 本文档视频教程多路温度采集系统–需求分析 项目实践流程: 1.设计项目需求文档 说明项目设计目的,项目功能,项目模块,实现技术. 2.项目编码设计 程序要求模块结构化(函数),编码风格良好,多文件结构实现. 3.项目测试 设计测试用例,说明测试步骤,测试结果. 4.项目总结与演示 编写项目总结文档,PPT演示文档,进行项目演示说明. 项目提交内容: 1.项目需求规格说明书. 2.项目源代码,makefile文件,可执行文件,项目实施说明书. 3

基于arm的多路温度采集控制系统(3)配置文件

嵌入式项目实践–多路温度采集控制系统(3)配置文件 本文档对应视频教程多路温度采集系统–配置文件 配置文件使用 菜单程序会读取配置文件数据.     char cmd[16];//命令数据缓冲区     load_dev(g_dev);     while(1){ 主控程序会读取与保存数据. int init_sys(void) {        printf("init system struct,LED flash.\n");     load_dev(g_dev); }    g

【应用笔记】【AN003】VC++环境下基于以太网的4-20mA电流采集

简介 4-20mA电流环具有广泛的应用前景,在许多行业中都发挥着重要作用.本文主要介绍了以太网接口的4-20mA电流采集模块在VC++环境下进行温度采集,实现WINDOWS平台对数据的采集.分析及显示. 系统组成及工作原理 系统组成主要包括PT100铂电阻.SBWZ温度变送器.4-20mA电流采集模块(GM4008)以及上位机软件组成,如图1所示. PT100铂电阻温度传感器:利用铂金属阻值随温度的变化而变化的特性制成的一种温度传感器,主要用来测量温度的变化量. SBWZ温度变送器:一种现场安装

基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目

一.前言 1.基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目包括用Keil软件编写单片机C语言程序和用Proteus软件仿真单片机外围电路 2.基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目构思 (1).声明程序变量思维导图 (2).程序子函数思维导图 (3).程序主函数思维导图 二.基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目的Keil软件编写的单片机C语言程序 1 #include<reg52.h>//声明51单片机

【应用笔记】【AN004】VB环境下基于RS-485的4-20mA电流采集

版本:第一版作者:周新稳 杨帅 日期:20160226 =========================== 本资料高清PDF 下载: http://pan.baidu.com/s/1c1uuhLQ 源代码包下载: http://pan.baidu.com/s/1LSuXw =========================== 简介 本应用笔记主要说明如何在VB开发环境下基于RS485实现4-20mA电流采集. 系统组成及工作原理 系统组成如图1所示,主要包括 PT100铂电阻温度传感器.S

UWB DWM1000 开源项目框架 之 温度采集

在之前博文开源一套uwb 框架,后面几篇博文会基于这个开源框架进行简单开发. 让uwb使用者更清楚了解基于这个basecode 开发工作. 这里所做内容是,采集dwm1000 温度,并发送到另一个节点,另一个节点通过串口打印,也就是这里是一个远程采集温度的工程.当然可以使用主控stm32 采集任何传感器,按照本文思路将数据打包发送到另外一个节点. 1 在tx_main.c增加温度采集函数,并做验证. 温度采集函数 uint16 BPhero_UWB_Get_Temperature(void) {