DS18B20温度检测程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;