壹拾玖:DS18B20的温度读取

发布者:平和心态最新更新时间:2019-08-13 来源: eefocus关键字:DS18B20  温度读取  数字温度计 手机看文章 扫描二维码
随时随地手机看文章

DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
1.DS18B20产品的特点
(1)只要求一个端口即可实现通信。
(2)在DS18B20中的每个器件都有独一无二的序列号。
(3)实际应用中不需要外部任何元器件即可实现测温。
(4)测量温度范围在-55℃到+125℃之间。
(5)数字温度计的分辨率用户可以从9位到12位选择。
(6)内部有温度上、下限告警设置。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是地位在线。

1、复位时序

这里写图片描述

2、写时序

对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。对于DS18B20写0时序和写1时序的要求不同:
当要求写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采用IO总线上的“0”电平
当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
这里写图片描述

3、读时序

对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读间隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。

这里写图片描述

4、操作程序

延时与复位实例

延时实例

复位实例

读位与写位实例

读位实例

写位实例

读字节与写字节实例

读字节实例

写字节实例

#实验
这里写图片描述

代码

*   【课程20】 ****DS18B20温度的读取***********

*

*   【说  明】 ****

*

*   【描  述】 ****读取环境温度

*

******************************************************************/ 

#include  

#include


//---------常用的两个宏定义-------------- 

#define uint8 unsigned char

#define uint16  unsigned int 


//--------1602的控制引脚定义-------------

sbit RS = P2^0;

sbit RW = P2^1;

sbit EN = P2^2;


sbit DQ = P3^3;


//----------液晶模块的声明---------------

bit BUSY(void);

void Write_cmd(uint8 cmd);

void Write_dat(uint8 dat);

void LCD_Init(void);


//---------DS18B20的函数声明-----------

void DelayUs(uint16 time);

void Init_Ds18b20(void);

void WriteByte(uint8 date);

uint8 ReadTemperature(void);


//-----------函数的声明------------------

void DelayMS(uint16 dly);



//------------------------------------

void main(void)

{

uint8 temp,temp1,temp2;

LCD_Init();

Init_Ds18b20();

while(1)

{

temp = ReadTemperature();

temp1 = temp/10;

temp2 = temp%10;


Write_cmd(0x80);

Write_dat(temp1+0x30);

Write_dat(temp2+0x30);

Write_dat(0xdf);

Write_dat(0x43);

}

}




/********************************************************

** 名称 :void DelayMS(uint16 dly)

** 功能 :毫秒级延时(12M的晶振)

** 入口参数 :dly

用户的延时参数   

** 出口参数 :无   

*********************************************************/

void DelayMS(uint16 dly)

{

uint16 x,y;

for(x=dly;x>0;x--)

for(y=124;y>0;y--);

}


/********************************************************

** 名称 :bit BUSY(void)

** 功能 :检测LCD1602是否处于忙状态;

** 入口参数 :无   

** 出口参数 :bit Bit

返回1,则BUSY

返回0,则OK   

*********************************************************/

bit BUSY(void)

{

bit Bit;

RS = 0;

RW = 1;

EN = 1;

DelayMS(1);

Bit = (bit)(P0 & 0x80); //最高位为忙信号位

EN = 0;

return Bit;

}


/********************************************************

** 名称 :void Write_cmd(uint8 cmd)

** 功能 :写命令

** 入口参数 :cmd

控制命令   

** 出口参数 :无   

*********************************************************/

void Write_cmd(uint8 cmd)

{

while(BUSY()); //测忙

RS = 0;

RW = 0;

EN = 0;

P0 = cmd;

EN = 1;

DelayMS(1);

EN = 0;

}


/********************************************************

** 名称 :void Write_dat(uint8 dat)

** 功能 :写数据

** 入口参数 :dat

要显示的数据  

** 出口参数 :无   

*********************************************************/

void Write_dat(uint8 dat)

{

while(BUSY()); //测忙

RS = 1;

RW = 0;

EN = 0;

P0 = dat;

EN = 1;

DelayMS(1);

EN = 0;

}


/********************************************************

** 名称 :void LCD_Init(void)

** 功能 :液晶的初始化

** 入口参数 :无 

** 出口参数 :无   

*********************************************************/

void LCD_Init(void)

{

Write_cmd(0x38); //功能设置

DelayMS(1);

Write_cmd(0x0c); //显示开关控制

DelayMS(1);

Write_cmd(0x06); //输入方式设置

DelayMS(1);

Write_cmd(0x01); //清除LCD的显示内容

DelayMS(1);

}


/**************************************

**Function Name:void DelayUs(uint time)

**Description:delay  US

**Input:Time

**Output:None

**Return: None

**************************************/

void DelayUs(uint16 time)

{

while(time--);

}


/**************************************

**Function Name:void Init_Ds18b20(void)

**Description:DS18B20的初始化

**Input :None

**Output:None

**Return: None

**************************************/

void Init_Ds18b20(void)

{

uint8 i;

DQ=1; //首先DQ是高电平

DelayUs(15); //延时,等DQ稳定

DQ=0; //拉低

DelayUs(75); //延时大概600US

DQ=1; //拉高(释放)

DelayUs(15); //15US左右

i=DQ; //开始采样

DelayUs(7); //延时 (这个延时在仿真时很重要)

// return i //返回0, 说明总线上有器件响应

//返回1, 说明总线上没有器件响应

}


/**************************************

**Fuction Name:void WriteByte(uchar date)

**Description:写一个字节

**Input:Write Data Byte

**Output:None

**Return: None

**************************************/

void WriteByte(uint8 date)

{

uint8 i;

for(i=0;i<8;i++)

{

DQ=0;

DQ=date&0x01;

DelayUs(7);

DQ=1;

date>>=1;

}

DelayUs(7);

}


/**************************************

**Function Name:uchar ReadByte(void)

**Description:读一个字节

**Input:None

**Output:Read Data Byte

**Return: Read Data Byte

**************************************/

uint8 ReadByte(void)

{

uint8 i,value;

for(i=0;i<8;i++)

{

DQ=0;

value>>=1;

DQ=1;

if(DQ)

{

value|=0x80;

}

DelayUs(7);

}

return value;

}


/**************************************

**Function Name:uchar ReadTemperature(void)

**Description:读出温度值

**Input:None

**Output:Read Temperature

**Return: Read Temperature

**************************************/

uint8 ReadTemperature(void)

{

uint8 a,b;

Init_Ds18b20(); //初始化

WriteByte(0xcc); //跳过ROM

WriteByte(0x44); //启动转换

DelayUs(350);

Init_Ds18b20(); //初始化

WriteByte(0xcc); //跳过ROM

WriteByte(0xbe); //准备读取

a=ReadByte();

b=ReadByte();

b<<=4; //读温度的整数部分

b+=(a&0xf0)>>4;

return b;

}



关键字:DS18B20  温度读取  数字温度计 引用地址:壹拾玖:DS18B20的温度读取

上一篇:壹拾捌:LCD12864的显示
下一篇:贰拾:直流电机的驱动

推荐阅读最新更新时间:2024-11-04 01:06

安装温度传感器的葡萄酒塞 利于读取数据
    对于需要爱好者来说,葡萄酒的饮用和储存是一门非常大的学问,葡萄酒所处的温度环境对酒质有很大的影响,但对于饮用者来说,知晓这些因素往往很困难。现在,设计师Kwang-wi Park和Eun-ji Lim结合科技设计了一款名叫Digital Cork装有温度传感器的葡萄酒瓶塞,可以让葡萄酒爱好者轻易读取影响葡萄酒质量的因素,包含环境温度、开瓶日期、有效日期等等。 Digital Cork是一款数字科技瓶塞,上面装有传感器和显示屏,只要将瓶塞插入葡萄酒瓶中,就能够通过传感器探测到红酒的开瓶日期、有效期限和当时温度环境,然后将探测到的信息显示于上方的显示屏上,此外酒塞还可以连接WI-Fi无线网路,通过无线网络把传感器探测到
[工业控制]
单片机温度检测报警程序(ds18b20
程序采用数字温度采集芯片 ds18b20 获取温度 分辨率为12位 可以由此程序获的更低分辨率温度 ds18b20 只有三个i/o接口 其中两个为电源引脚 一个为数据总线 只需要一条口线通信 简化了分布式温度传感应用 无需外部元件 可用数据总线供电 电压范围为3.0 V至5.5 V 无需备用电源 测量温度范围为-55 ° C至+125 ℃ ds18b20 相关介绍: ds18b20 百度百科 Proteus 仿真: Code: #include reg51.h #include math.h #define uchar unsigned char // 宏定义uchar 为无符号字符 #define ui
[单片机]
单片机<font color='red'>温度</font>检测报警程序(<font color='red'>ds18b20</font>)
DS18B20温度显示演示程序(6位数码管显示)
#include AT89X51.H sbit DQ = P3^3; //定义DS18B20端口DQ sbit BEEP=P3^7 ; unsigned char presence ; unsigned char code LEDData = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0xff}; unsigned char data temp_data = {0x00,0x00}; unsigned char data display = {0x00,0x00,0x00,0x00,0x00};
[单片机]
ds18b20温度传感器应用实例
/* ******************************************************************************* * 文件名:main.c * 描 述:温度传感器DS18B20示例 * 备 注:控制DS18B20测量温度并将温度值显示到液晶上 ******************************************************************************* */ #include reg52.h #include stdint.h extern bit startDs18b20();
[单片机]
基于STM32自码DS18B20驱动程序
DS18B20是一款单总线可编程分辨率的数字温度计,详细内容可见中英文datasheet,笔者不在赘述。 很早就接触到的温度传感器,也相信每一个曾学习过嵌入式开发的人都用过,笔者在STM32F4上自码DS18B20驱动,有些小小心得: DS18B20的控制流程 根据DS18B20的通信协议,DS18B20只能作为从机,而单片机系统作为主机,单片机控制DS18B20完成一次温度转换必须经过3个步骤:复位、发送ROM指令、发送RAM指令。每次对DS18B20的操作都要进行以上三个步骤。 复位过程为:单片机将数据线拉低至少480uS,然后释放数据线,等待15-60uS让DS18B20接收信号,DS18B20接收到信号后,会把数据线拉
[嵌入式]
基于单片机的DS18B20温度计设计
上图是Proteus仿真图,数码管为共阳数码管,反相器用74HC14,排阻用10K的,晶振用12MHZ的,电阻R1-R8用200欧的即可。但在实际制作时可以用三极管代替反相器,这样可以节约成本。但代替后无法用Proteus仿真出来,具体如何代替参照本人上篇博文:基于单片机的电子时钟设计,三极管用常用的9012或者9015即可,经本人实际验证效果非常好。 下图为原理图: 下图为PCB设计图 以下为实验源程序 #include reg52.h sbit DQ=P3^3; //定义DS18B20端口DQ sbit BEEP=P3^7 ; unsigned char presence; unsigned
[单片机]
51单片机多路DS18B20温度测量程序
仿真图: 仿真文件和完整 源码 的下载地址: http://www.51hei.com/bbs/dpj-20600-1.html 源代码: #include reg51.h #include intrins.h #include string.h #include stdio.h #define uchar unsigned char #define uint unsigned int sbit RS= P2^0 ; // 液晶显示 引脚定义 sbit RW= P2^1 ; sbit EN= P2^2 ; uint t=0,dian=0; uchar LCD_LINE_ONE ={ tp1: };
[单片机]
51单片机多路<font color='red'>DS18B20</font><font color='red'>温度</font>测量程序
51单片机DS18B20测量温度实验
实验任务 用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+50度之间,用4位数码管显示出来。 DPY-1实验板连接 用排线把JP-CODE连到JP8是,注意:a接P0.0;b接P0.1;c接P0.3…… 把JP-CS连到JP14上,注意:4H接P2.4;3H接P2.5;2H接P2.6;1H接P2.7; 连接好DS18B20注意极性不要弄反,否则可能烧坏。DS18B20的外型与常用的三极管一模一样,上图是它的管脚分布。用导线将JK—DS的DA端连到P3.1上。 硬件电路图 实验原理 DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路
[单片机]
51单片机<font color='red'>DS18B20</font>测量<font color='red'>温度</font>实验
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved