//#include"C8051f020.h"
#include "intrins.h"
sbit DQ=P2^1;
int t;
unsigned int num;
unsigned char dat; //读写数据变量
unsigned char a=0;
unsigned char b=0;
float tep=0; //读一个温度时的温度转换中间间
//unsigned char data tempbuf[4]=0;//温度字型显示中间变量
/******************************************************
函数名称:delay(uint num)
返回值:无
参数:uint num
延时数据值
作用:延时
*******************************************************/
void delay512us (void)///512us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=2;b>0;b--)
for(a=250;a>0;a--);
}
void delay60us (void) //70us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=60;a>0;a--);
}
/*void delay66us (void)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=55;a>0;a--);
}*/
void delay10us (void) // 11.5us
{
unsigned char a,b;
for(b=2;b>0;b--)
for(a=1;a>0;a--);
}
void delay25us (void)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=20;a>0;a--);
}
void delay (unsigned x)
{
for (;x>0;x--);
_nop_();
}
/******************************************************
函数名称:void Init_DS18B20(void)
返回值:无
参数:无
作用:初始化18B20
*******************************************************/
char Init_DS18B20(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();//从高拉倒低
DQ=0;
delay512(); //550 us
DQ=1;
delay60(); //66 us
presence=DQ; //presence=0 复位成功,继续下一步
}
delay512(); //延时500 us
presence=~DQ;
}
DQ=1;
return presence; //拉高电平
}
/******************************************************
函数名称:uchar ReadOneChar(void)
返回值:uchar dat
参数: 无
作用:读取1820一个字节
*******************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i;
unsigned char value=0;
for(i=8;i>0;i--)
{
DQ=1;nop();
value>>=1;
DQ=0;nop(); nop(); //4 us
DQ=1;nop(); nop(); //4 us
if(DQ)value|=0x80;
delay60(); //66 us
}
DQ=1;
return(value);
}
/******************************************************
函数名称:void WriteOneChar(uchar dat)
返回值:无
参数: uchar dat
作用:向1820写一个字节
*******************************************************/
/////****写DS18B20***/
//写0 60us读完,写1 30us 内读完
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
DQ=1;
nop();
DQ=0;
nop();
nop();
DQ=dat&0x01;//写所给数据最低位
delay60us();
DQ=1;//给脉冲
dat>>=1;
}
nop();
}
/******************************************************
函数名称:int ReadOneTemperature(void)
返回值:int t
参数: 无
作用:读温度值
*******************************************************/
int ReadOneTemperature(void)
////////***读取温度值***********/
//// 每次读写均要先复位
{
Init_DS18B20();
delay60us () ;
delay60us () ;
delay60us () ;
WriteOneChar(0xcc);//发跳过ROM命令
WriteOneChar(0x44);//发读开始转换命令
Init_DS18B20();
delay60us () ;
delay60us () ;
delay60us () ;
WriteOneChar(0xcc);//发跳过ROM命令
WriteOneChar(0xbe);//读寄存器,共九字节,前两字节为转换值
a=ReadOneChar(); //a存低字节
b=ReadOneChar(); //b存高字节
t=b;
t<<=8;//高字节转换为10进制
t=t|a;
//tep=t*0.0625;//转换精度为0.0625/LSB
//t=tep*10+0.5;//保留1位小数并四舍五入****后面除10还原正确温度值)
return(t);
}
/******************************************************
函数名称:uint Temperaturepro(void)
返回值:void
参数: void
作用:温度处理
*******************************************************/
/*void Temperaturepro(void)
{
int temp;
temp=ReadOneTemperature();
tempbuf[3]=temp/1000;//百位
tempbuf[2]=temp/100%10;//十位
tempbuf[1]=temp%100/10; //个位
tempbuf[0]=temp%10; //小数
} */ 这个是.h文件
#include "intrins.h"
sbit DQ=P2^1;
int t;
unsigned int num;
unsigned char dat; //读写数据变量
unsigned char a=0;
unsigned char b=0;
float tep=0; //读一个温度时的温度转换中间间
//unsigned char data tempbuf[4]=0;//温度字型显示中间变量
/******************************************************
函数名称:delay(uint num)
返回值:无
参数:uint num
延时数据值
作用:延时
*******************************************************/
void delay512us (void)///512us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=2;b>0;b--)
for(a=250;a>0;a--);
}
void delay60us (void) //70us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=60;a>0;a--);
}
/*void delay66us (void)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=55;a>0;a--);
}*/
void delay10us (void) // 11.5us
{
unsigned char a,b;
for(b=2;b>0;b--)
for(a=1;a>0;a--);
}
void delay25us (void)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=20;a>0;a--);
}
void delay (unsigned x)
{
for (;x>0;x--);
_nop_();
}
/******************************************************
函数名称:void Init_DS18B20(void)
返回值:无
参数:无
作用:初始化18B20
*******************************************************/
char Init_DS18B20(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();//从高拉倒低
DQ=0;
delay512(); //550 us
DQ=1;
delay60(); //66 us
presence=DQ; //presence=0 复位成功,继续下一步
}
delay512(); //延时500 us
presence=~DQ;
}
DQ=1;
return presence; //拉高电平
}
/******************************************************
函数名称:uchar ReadOneChar(void)
返回值:uchar dat
参数: 无
作用:读取1820一个字节
*******************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i;
unsigned char value=0;
for(i=8;i>0;i--)
{
DQ=1;nop();
value>>=1;
DQ=0;nop(); nop(); //4 us
DQ=1;nop(); nop(); //4 us
if(DQ)value|=0x80;
delay60(); //66 us
}
DQ=1;
return(value);
}
/******************************************************
函数名称:void WriteOneChar(uchar dat)
返回值:无
参数: uchar dat
作用:向1820写一个字节
*******************************************************/
/////****写DS18B20***/
//写0 60us读完,写1 30us 内读完
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
DQ=1;
nop();
DQ=0;
nop();
nop();
DQ=dat&0x01;//写所给数据最低位
delay60us();
DQ=1;//给脉冲
dat>>=1;
}
nop();
}
/******************************************************
函数名称:int ReadOneTemperature(void)
返回值:int t
参数: 无
作用:读温度值
*******************************************************/
int ReadOneTemperature(void)
////////***读取温度值***********/
//// 每次读写均要先复位
{
Init_DS18B20();
delay60us () ;
delay60us () ;
delay60us () ;
WriteOneChar(0xcc);//发跳过ROM命令
WriteOneChar(0x44);//发读开始转换命令
Init_DS18B20();
delay60us () ;
delay60us () ;
delay60us () ;
WriteOneChar(0xcc);//发跳过ROM命令
WriteOneChar(0xbe);//读寄存器,共九字节,前两字节为转换值
a=ReadOneChar(); //a存低字节
b=ReadOneChar(); //b存高字节
t=b;
t<<=8;//高字节转换为10进制
t=t|a;
//tep=t*0.0625;//转换精度为0.0625/LSB
//t=tep*10+0.5;//保留1位小数并四舍五入****后面除10还原正确温度值)
return(t);
}
/******************************************************
函数名称:uint Temperaturepro(void)
返回值:void
参数: void
作用:温度处理
*******************************************************/
/*void Temperaturepro(void)
{
int temp;
temp=ReadOneTemperature();
tempbuf[3]=temp/1000;//百位
tempbuf[2]=temp/100%10;//十位
tempbuf[1]=temp%100/10; //个位
tempbuf[0]=temp%10; //小数
} */ 这个是.h文件