51单片机 您所在的位置:网站首页 ds18b20温度传感器程序流程图介绍 51单片机

51单片机

2024-07-05 06:53| 来源: 网络整理| 查看: 265

目录

一、DS18B20

1.DS18B20简介

2.DS18B20引脚排列及说明

二、DB18B20通信时序

1.初始化序列

2.写时序

3.读时序

三、环境温度采集

1.代码实现

2.Pertous仿真

3.keil波形分析

4.改变时序再行观察 

总结

一、DS18B20 1.DS18B20简介

DS18B20 是美信公司的一款温度传感器,单片机可以通过 1-Wire 协议与 DS18B20 进行通信,最终将温度读出。1-Wire 总线的硬件接口很简单,只需要把 DS18B20 的数据引脚和单片机的一个 IO 口接上就可以了。

2.DS18B20引脚排列及说明

二、DB18B20通信时序 1.初始化序列

        DS18B20的所有通信都由由复位脉冲组成的初始化序列开始。该初始化序列由主机发出,后跟由DS18B20发出的存在脉冲(presence pulse)。当发出应答复位脉冲的存在脉冲后,DS18B20通知主机它在总线上并且准备好操作了。 

初始化过程“复位和存在脉冲” 

         在初始化步骤中,总线上的主机通过拉低单总线至少480μs来产生复位脉冲。然后总线主机释放总线并进入接收模式。

        当总线释放后,5kΩ的上拉电阻把单总线上的电平拉回高电平。当DS18B20检测到上升沿后等待15到60us,然后以拉低总线60-240us的方式发出存在脉冲。

2.写时序

读/写时序

读写时隙

主机在写时隙向DS18B20写入数据,并在读时隙从DS18B20读入数据。在单总线上每个时隙只传送一位数据。

 写时间隙         有两种写时隙:写“0”时间隙和写“1”时间隙。总线主机使用写“1”时间隙向DS18B20写入逻辑1,使用写“0”时间隙向DS18B20写入逻辑0。

  所有的写时隙必须至少有60us的持续时间。相邻两个写时隙必须要有最少1us的恢复时间。所有的写时隙(写0和写1)都由拉低总线产生。

        为产生写1时隙,在拉低总线后主机必须在15us内释放总线(拉低的电平要持续至少1us)。由于上拉电阻的作用,总线电平恢复为高电平,直到完成写时隙。

        为产生写0时隙,在拉低总线后主机持续拉低总线即可,直到写时隙完成后释放总线(持续时间60-120us)。

         写时隙产生后,DS18B20会在产生后的15到60us的时间内采样总线,以此来确定写0还是写1。

代码实现:

向DS18B20写一位数据

void WR_Bit(bit i) { DQ=0;//产生写时序 _nop_(); _nop_();//总线拉低持续时间要大于1us DQ=i;//写数据 ,0和1均可 Delayxus_DS18B20(3);//延时60us,等待ds18b20采样读取 DQ=1;//释放总线 }

DS18B20写字节函数,先写最低位

void WR_Byte(unsigned char dat) { unsigned char i="0"; while(i++>=1; //注意不要写成dat>>1 } }

3.读时序

读时序

  DS18B20只有在主机发出读时隙后才会向主机发送数据。因此,在发出读暂存器命令 [BEh]或读电源命令[B4h]后,主机必须立即产生读时隙以便DS18B20提供所需数据。另外,主机可在发出温度转换命令T [44h]或Recall命令E 2[B8h]后产生读时隙,以便了解操作的状态(在 DS18B20操作指令这一节会详细解释)。

读时间隙

  所有的读时隙必须至少有60us的持续时间。相邻两个读时隙必须要有最少1us的恢复时间。所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。在主机产生读时隙后,DS18B20开始发送0或1到总线上。DS18B20让总线保持高电平的方式发送1,以拉低总线的方式表示发送0.当发送0的时候,DS18B20在读时隙的末期将会释放总线,总线将会被上拉电阻拉回高电平(也是总线空闲的状态)。DS18B20输出的数据在下降沿(下降沿产生读时隙)产生后15us后有效。因此,主机释放总线和采样总线等动作要在15μs内完成。

代码实现:

向DS18B20读一位数据

unsigned char Read_Bit() { unsigned char ret; DQ=0;//拉低总线 _nop_(); _nop_(); DQ=1;//释放总线 _nop_(); _nop_(); _nop_(); _nop_(); ret=DQ;//读时隙产生7 us后读取总线数据。把总线的读取动作放在15us时间限制的后面是为了保证数据读取的有效性 Delayxus_DS18B20(3);//延时60us,满足读时隙的时间长度要求 DQ=1;//释放总线 return ret; //返回读取到的数据 }

DS18B20读一个字节函数,先读最低位

unsigned char Read_Byte() { unsigned char i; unsigned char dat="0"; for(i=0;i>=1;//先读最低位 if(Read_Bit()) dat|=0x80; } return(dat); } 三、环境温度采集 1.代码实现

要求:使用DS18B20温度传感器采集当前环境温度、数码管显示检测的温度值,以此达到检测环境温度的要求。

具体代码如下:

#include "reg51.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int #define out P0 sbit smg1=out^4; sbit smg2=out^5; sbit DQ=P3^7; void delay5(uchar); void init_ds18b20(void); uchar readbyte(void); void writebyte(uchar); uchar retemp(void); void main(void) { uchar i,temp; delay5(1000); while(1) { temp=retemp(); for(i=0;i0;i--) { DQ =0; delay5(1); DQ =1; date>>=1; if(DQ) date|=0x80; delay5(11); } return(date); } void writebyte(uchar dat) { uchar i=0; for(i=8;i>0;i--) { DQ =0; DQ =dat&0x01; delay5(12); DQ = 1; dat>>=1; delay5(5); } } uchar retemp(void) { uchar a,b,tt; uint t; init_ds18b20(); writebyte(0xCC); writebyte(0x44); init_ds18b20(); writebyte(0xCC); writebyte(0xBE); a=readbyte(); b=readbyte(); t=b; t


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有