DS18B20温度检测程序
时间:2025-02-27
时间:2025-02-27
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); } …… 此处隐藏:2510字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:《戴尔:差异化战略》案例分析
下一篇:轻质隔墙板在钢结构建筑中的应用