DS18B20温度检测程序

发布时间:2024-10-12

DS18B20温度检测程序,在仿真软件PROTUES中通过!

DS18B20的初始化

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

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

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

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

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

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

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

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

DS18B20温度检测程序,在仿真软件PROTUES中通过!

DS18B20的写操作

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

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

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

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

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

(6) 重复上(1)到(6)的操作直到所有的字节全部发送完为止。

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

DS18B20的写操作时序图如图

DS18B20温度检测程序,在仿真软件PROTUES中通过!

DS18B20的读操作

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

(2)延时2微秒。

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

(4)延时15微秒。

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

(6)延时15微秒。

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

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

DS18B20温度检测程序,在仿真软件PROTUES中通过!

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;

DS18B20温度检测程序,在仿真软件PROTUES中通过!

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;

DS18B20温度检测程序,在仿真软件PROTUES中通过!

} for(x=0;x<z;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) //如果读到低电平,即复位成功

{

DS18B20温度检测程序,在仿真软件PROTUES中通过!

flag=1;

}

else flag=0; //如果没有读到低电平,则复位失败

Delay_50us(9);

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 //450us delay();i++;i++;i++; ds18b20_io=byte&0x01; delay(); delay();delay();delay(); //48us delay(); delay();delay(); byte>>=1;

DS18B20温度检测程序,在仿真软件PROTUES中通过!

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;

DS18B20温度检测程序,在仿真软件PROTUES中通过!

else

jj>>=1;

delay();delay(); delay(); //18us

}

return jj;

}

void write_com(uchar com)

{

}

void write_data(uchar date)

{

lcdrs=1; P1=date; delay1(5); lcdrs=0; P1=com; delay1(5); lcden=1; delay1(5); lcden=0;

DS18B20温度检测程序,在仿真软件PROTUES中通过!

} delay1(5); lcden=0;

void init()

{

}

float read_temp()/*读取温度值并转换*/

{

if(ds18b20_rst()==1); lcden=0; write_com(0x38); write_com(0x0C); write_com(0x06); write_com(0x01);

{

ds18b20_writebyte(0xcc);//*跳过读序列号*/ ds18b20_writebyte(0x44);//*启动温度转换*/ Delay_50us(30);

}

if(ds18b20_rst()==1);

DS18B20温度检测程序,在仿真软件PROTUES中通过!

ds18b20_writebyte(0xcc);//*跳过读序列号*/ ds18b20_writebyte(0xbe);//*读取温度*/ temper0 =ds18b20_readbyte(); temper1 =ds18b20_readbyte(); Delay_50us(20); } if(temper1&0xf8) //判断是正温度还是负温度 { //如果是高5位是0 为正温度,反则为负温度 } else { tflag=0; tvalue=(temper1<<8)|temper0; temperature=tvalue*0.0625; //不用把tvalue进行转换,直接乘0.0625 tflag=1; tvalue=(temper1<<8)|temper0; tvalue=((~tvalue)+1); temperature=tvalue*(0.0625); //的精度

} return(temperature);

DS18B20温度检测程序,在仿真软件PROTUES中通过!

void write_xian(float date) {

uint bai,shi,ge,xiaozheng,xqian,xbai,xshi,xge; float k,m; //把浮点的DATA转换为整数,得到浮点娄的整数部分 bai=(int)(date)/100; //把得到的整数部分拆开 分别存在 BAI SHI GE 中 shi=((int)(date)%100)/10; ge=(int)(date)%10; if (bai!=0) //如果百不为0 则把整数部分全部显示 { write_data(0x30+bai); write_data(0x30+shi); write_data(0x30+ge); } else if (shi!=0) //如果十不为0 则把十位和个位显示 { write_data(0x30+shi); write_data(0x30+ge); } else write_data(0x30+ge);//如果百和十位都为0 ,则只显示个位数

DS18B20温度检测程序,在仿真软件PROTUES中通过!

write_data(0x2e);

}

void main()

{

temperature=0.0;

flag=0;

tflag=0;

tvalue=0;

init(); xqian=(xiaozheng)/1000; xbai=((xiaozheng)%1000)/100; xshi=((xiaozheng)%100)/10; xge=(xiaozheng)%10; write_data(0x30+xqian); write_data(0x30+xbai); write_data(0x30+xshi); write_data(0x30+xge); k=date-(int)date; //取浮点娄的小数部分 m=k*10000; //把得到的小数变为整数并显示 xiaozheng=(int)m;

DS18B20温度检测程序,在仿真软件PROTUES中通过!

while(1)

{

read_temp();

if(tflag==0)

{

write_xian(temperature);

write_data(' '); write_data(' '); }

if(tflag==1) {

write_data('-');

write_xian(temperature); write_data(' '); write_data(' '); }

write_com(0x80); }

}

DS18B20温度检测程序.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219