DS18B20温度检测程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(1)先将数据线置高电平“1”。

(2)延时(该时间要求的不是很严格,但是尽可能的短一点)

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

(4)延时750微秒(该时间的时间范围可以从480到960微秒)。

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

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

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

(8)将数据线再次拉高到高电平“1”后结束。

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

(2)延时确定的时间为15微秒。

(3)按从低位到高位的顺序发送字节(一次只发送一位)。

(4)延时时间为45微秒。

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

(6)重复上(1)到(6)的操作直到所有的字节全部发送完为止。(7)最后将数据线拉高。

DS18B20的写操作时序图如图

DS18B20的读操作

(1)将数据线拉高“1”。

(2)延时2微秒。

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

(4)延时15微秒。

(5)将数据线拉高“1”。

(6)延时15微秒。

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

(8)延时30微秒。DS18B20的读操作时序图如图所示。

DS18B20的Protues仿真图

源程序代码:

#include "reg51.h"

#include "intrins.h" // 此头文件中有空操作语句NOP 几个微秒的延时可以用NOP 语句,但本人没用NOP,直接用了I++来延时

#define uchar unsigned char

#define uint unsigned int

uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,

0x38,0x39};

sbit ds18b20_io=P2^0; //单片机与DS18B20的连接口

sbit lcdrs=P2^6; //1602与单片机的接口

sbit lcden=P2^7;

unsigned char flag,tflag,i;

unsigned int temper0,temper1,tvalue;

float temperature;

void delay() //6us 在KEIL中仿真出来的时间,这是调用DELAY所用的时间{

i++;

i++;

}

void Delay_50us(unsigned char t) //50us延时程序

{

unsigned char j;

for(;t>0;t--)

for(j=20;j>0;j--)

;

}

void delay1(uint z) //这个延时主要用在1602中,1602的读写时序没有

//DS18B20那么严格

{

uint x,y;

for(x=0;x

{ for(y=0;y<121;y++)

{;};

};

}

uchar ds18b20_rst()

{

unsigned char j;

ds18b20_io=1;

i++; //1us

ds18b20_io=0;

for(j=0;j<60;j++) //543us

{

delay();

}

ds18b20_io=1;

for( j=0;j<7;j++) //65us

{

delay();

}

if(!ds18b20_io) //如果读到低电平,即复位成功{

flag=1;

}

else flag=0; //如果没有读到低电平,则复位失败Delay_50us(9); //450us

ds18b20_io=1;

return flag;

}

void ds18b20_writebyte(unsigned char byte)

{

unsigned char j;

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

{

ds18b20_io=1;

i++;

ds18b20_io=0;

delay(); //15us

delay();i++;i++;i++;

ds18b20_io=byte&0x01;

delay(); delay();delay();delay(); //48us

delay(); delay();delay();

byte>>=1;

ds18b20_io=1;

delay();

}

ds18b20_io=1;

}

unsigned char ds18b20_readbyte() {

unsigned char k,jj,i;

jj=0;

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

{

ds18b20_io=1;

i++; i++;

ds18b20_io=0;

delay(); //15us

delay(); i++;i++;i++;

ds18b20_io=1;

delay(); //15us

delay(); i++; i++;i++;

if(ds18b20_io) //17us jj=(jj>>1)|0x80;

相关文档
最新文档