单总线协议DS1820代码

一.DS18B20初始化

(1).数据线拉到低电平“0”。

(2).延时480微妙(该时间的时间范围可以从480到960微妙)。

(3).数据线拉到高电平“1”。

(4).延时等待80微妙。如果初始化成功则在15到60微妙时间内产生一个由DS18B20所返回的低电平“0”.根据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时判断。

(5).若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(3)步的时间算起)最少要480微妙。

二.DS18B20读时序

浅灰色线是DS18B20将单总线拉低/高,细黑线是上拉电阻作用将单总线拉高,看上面的时序图斜线可以当做没有具体含义,在读0时序中后45us是单总线输出低电平将总线拉低,读1时序后45us是上拉电阻的作用将单总线拉高

(1).将数据线拉低“0”。

(2).延时1微妙。

(3).将数据线拉高“1”,释放总线准备读数据。

(4).延时10微妙。 //等待数据稳定

(5).读数据线的状态得到1个状态位,并进行数据处理。

(6).延时45微妙。 (7).重复1~7步骤,直到读完一个字节

数据手册内读解释:

三.DS18B20写时序

(1).数据线先置低电平“0”

(2).延时15微妙。

(3).按从低位到高位的顺序发送数据(一次只发送一位)。

(4).延时60微妙。

(5).将数据线拉到高电平。

(6).重复1~5步骤,直到发送完整的字节。

(7).最后将数据线拉高。

数据手册内的解释

写时间片(write timeslots)

DS18B20 的典型温度读取过程为:复位→发 SKIP ROM 命令( 0XCC )→发开始转换命令( 0X44)→延时→复位→发送 SKIP ROM 命令( 0XCC)→发读存储器命令( 0XBE)→连续读出两个字节数据(即温度)→ 结束。

四、初始化、读时序、写时序对应的代码

    sbit DSPORT=P3^7;       //Ds18b20输入输出管脚
 1 void Delay1ms(uint y)    //延时1ms
2 {
3 uint x;
4 for( ; y>0; y--)
5 {
6 for(x=110; x>0; x--);
7 }
8 }
9
10 uchar Ds18b20Init() //初始化时序对应的代码
11 {
12 uchar i;
13 DSPORT = 0; //将总线拉低480us~960us
14 i = 70;
15 while(i--); //延时642us
16 DSPORT = 1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
17 i = 0;
18 while(DSPORT) //等待DS18B20拉低总线
19 {
20 Delay1ms(1);
21 i++;
22 if(i>5) //等待>5MS
23 {
24 return 0; //初始化失败
25 }
26
27 }
28 return 1; //初始化成功
29 }
30
31
32 uchar Ds18b20ReadByte() //读时序对应的代码
33 {
34 uchar byte, bi;
35 uint i, j;
36 for(j=8; j>0; j--)
37 {
38 DSPORT = 0; //先将总线拉低1us
39 i++;
40 DSPORT = 1; //然后释放总线
41 i++;
42 i++; //延时6us等待数据稳定
43 bi = DSPORT; //读取数据,从最低位开始读取
44 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
45 byte = (byte >> 1) | (bi << 7);
46 i = 4; //读取完之后等待48us再接着读取下一个数
47 while(i--);
48 }
49 return byte;
50 }
51
52
53 void Ds18b20WriteByte(uchar dat) //写时序对应的代码
54 {
55 uint i, j;
56
57 for(j=0; j<8; j++)
58 {
59 DSPORT = 0; //每写入一位数据之前先把总线拉低1us
60 i++;
61 DSPORT = dat & 0x01; //然后写入一个数据,从最低位开始
62 i=6;
63 while(i--);        //延时68us,持续时间最少60us
64 DSPORT = 1;      //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
65 dat >>= 1;
66 }
67 }

五、DS1820读写对应的代码(结合上面单总线初始化、读写时序的代码)

 1 /*******************************************************************************
2 * 函 数 名 : Ds18b20ChangTemp
3 * 函数功能 : 让18b20开始转换温度
4 * 输 入 : 无
5 * 输 出 : 无
6 *******************************************************************************/
7
8 void Ds18b20ChangTemp()
9 {
10 Ds18b20Init();
11 Delay1ms(1);
12 Ds18b20WriteByte(0xcc); //跳过ROM操作命令
13 Ds18b20WriteByte(0x44); //温度转换命令
14 //Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了
15
16 }
17
18
19 /*******************************************************************************
20 * 函 数 名 : Ds18b20ReadTempCom
21 * 函数功能 : 发送读取温度命令
22 * 输 入 : 无
23 * 输 出 : 无
24 *******************************************************************************/
25
26 void Ds18b20ReadTempCom()
27 {
28
29 Ds18b20Init();
30 Delay1ms(1);
31 Ds18b20WriteByte(0xcc); //跳过ROM操作命令
32 Ds18b20WriteByte(0xbe); //发送读取温度命令
33 }
34
35
36 /*******************************************************************************
37 * 函 数 名 : Ds18b20ReadTemp
38 * 函数功能 : 读取温度
39 * 输 入 : 无
40 * 输 出 : 无
41 *******************************************************************************/
42
43 int Ds18b20ReadTemp()
44 {
45 int temp = 0;
46 uchar tmh, tml;
47 Ds18b20ChangTemp(); //先写入转换命令
48 Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令
49 tml = Ds18b20ReadByte(); //读取温度值共16位,先读低字节
50 tmh = Ds18b20ReadByte(); //再读高字节
51 temp = tmh;
52 temp <<= 8;
53 temp |= tml;
54 return temp;
55 }

单总线协议DS1820代码的更多相关文章

  1. 单总线协议DS1820

    一. DS18B20简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式.主要根据应用场合的不同而改变其外观.封装后的DS18B20可用于电缆 ...

  2. iOS开发系列--Objective-C之协议、代码块、分类

    概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,这一节将重点介绍ObjC中一些常用的语法特性.当然这些内容虽然和其他高级语言命名不一样,但 ...

  3. 蓝牙简单配对(Simple Pairing)协议及代码流程简述

    kangear注: 文章转自:http://blog.csdn.net/myxmu/article/details/12217135 原文把图给搞丢了.可是文章太好了,这个时候我就发挥多年的Googl ...

  4. LInux基础(04)项目设计一(理解链表管理协议的代码架构)

    要设计好一个项目必须要有一个健全的代码框架 一个结构体内有数据域和处理数据的函数指针, 先实现管理链表的函数 增加节点  删除节点  清空链表  遍历节点对每个节点进行操作 再实现协议的注册 把对象s ...

  5. 由于客户端检测到一个协议错误 代码0x1104

    重新连接N次都还是这个错误提示,最后再重起电脑,还是没用.研究了一下错误终于解决了. 首先检查远程连接端口对不对?Windows远程默认的连接端口是3389,一般大家连接时直接输入IP或域名就可以连接 ...

  6. HTTP协议状态代码和错误状态含义的解释

    面试互联网公司经常被问的就是HTTP协议的知识,甚至比TCP/IP问的还多,其中HTTP代码的知识也是开发过程中经常会接触的,今天学习所有 HTTP 状态代码及其定义. 代码  指示     2xx  ...

  7. php模拟飞鸽传输协议,代码实现向飞鸽发送消息

    飞鸽传书协议:1:23149:riverlet:127.0.0.1:\x20:balabalabalabala版本号:包编号:发送者姓名:发送者主机名:命令字:附加信息(消息内容) <?php ...

  8. http 协议 c++代码 获取网页

    最近接触了些 html 和 JavaScript,索性了解下 http 协议.在园子里找到了 HTTP协议详解,图文并茂,很爽! 于是小小的尝试了下 #include <WinSock2.h&g ...

  9. MODBUS协议相关代码(CRC验证 客户端程序)

    Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议.通过此协议,控制器相互之间.或控制器经由网络(如以太网)可以和其它设备之间进行通信.Modbus协议使用的是主从通讯技术,即由主设备主 ...

随机推荐

  1. k8s 中 nfs作为存储的三种方式

    1.安装nfs服务.直接给命令 yum install nfs-utils vim /etc/exports /data/k8s/ 172.16.1.0/24(sync,rw,no_root_squa ...

  2. 爬虫之Scrapy框架介绍及基础用法

    今日内容概要 爬虫框架之Scrapy 利用该框架爬取博客园 并发编程 今日内容详细 爬虫框架Scrapy 1.什么是框架? 框架类似于房子的结构,框架会提前帮你创建好所有的文件和内部环境 你只需要往对 ...

  3. JAVA——类与对象

    目录 类与对象 一.类 二.对象 2.1对象的内存布局形式 三.类与对象 3.1如何创建 3.2如何访问属性 3.2类与对象的分配机制 3.2.1Java内存的结构分析 注意事项和细节 类与对象 为什 ...

  4. Thread线程基本写法用法

    //线程属性 protected Thread workerThread; protected bool isWorkerThreadStopped = true; public void Initi ...

  5. docker学习笔记(1)- 架构概述

    微服务架构 微服务VS传统分层架构 传统分层架构 优点 对于简单系统: 容易部署 容易测试 容易横向扩展 缺点 对于复杂系统: 耦合度高 不易快速维护 启动慢,部署慢 模块变更引起的回归问题多 难以持 ...

  6. linux echo用法和实例

    echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串.linux的echo命令,在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的,因此有必要了解下 ...

  7. php 23种设计模型 - 装饰模式

    装饰器模式(Decorator) 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. ...

  8. git常用命令及问题

    Git基本操作 git init 创建新的git仓库 git clone [url] 使用 git clone 拷贝一个 Git 仓库到本地 git status 查看工作区 git stash li ...

  9. 创建vue脚手架步骤

    一.在cmd配置npm淘宝镜像 npm config set registry https://registry.npm.taobao.org 二.仅第一次执行安装,安装好后关掉cmd后再开,这个时候 ...

  10. 36 异常机制 自定义异常 实际应用中的经验总结 尽量添加finally语句块去释放占用的资源

    自定义异常 概念 使用Java内置的异常可以描述在编辑时出现的大部分异常情况.除此之外,用户还可以自定义异常.用户自定义异常类,只需继承Exception类即可. 在程序中使用自定义异常类,大体可分为 ...