#include<at89x52.h>
//延时函数
sbit DQ =P2^3; //DS18B20数据口
/*
typedef unsigned char byte;
typedef unsigned int word;
byte Te=0; //温度整数部分
//延时
void delay(word useconds)
{
for(;useconds>0;useconds--);
}
//复位
byte ow_reset(void)
{
byte presence;
DQ = 0; //pull DQ line low
delay(29); // leave it low for 480us
DQ = 1; // allow line to return high
delay(3); // wait for presence
presence = DQ; // get presence signal
delay(25); // wait for end of timeslot
return(presence); // presence signal returned
} // 0=presence, 1 = no part
//从 1-wire 总线上读取一个字节
byte read_byte(void)
{
byte i;
byte value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0; // pull DQ low to start timeslot
DQ = 1; // then return high
delay(1); //for (i=0; i<3; i++);
if(DQ)value|=0x80;
delay(6); // wait for rest of timeslot
}
return(value);
}
//向 1-WIRE 总线上写一个字节
void write_byte(char val)
{
byte i;
for (i=8; i>0; i--) // writes byte, one bit at a time
{
DQ = 0; // pull DQ low to start timeslot
DQ = val&0x01;
delay(5); // hold value for remainder of timeslot
DQ = 1;
val=val/2;
}
delay(5);
}
//读取温度
byte Read_Temperature(void)
{
byte c[2],a=0;
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
c[1]=read_byte(); //低字节
c[0]=read_byte(); //高字节
ow_reset();
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion
c[1]=c[1]>>4;
c[0]=c[0]<<4;
a=c[0]|c[1];
return a;
}
*/
unsigned char Te=0;//温度整数部分
unsigned char Te_D=0;//温度小数部分
void delay(unsigned int i)
{
while(i--);
}
//初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
//delay(4);
}
//读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
//unsigned char t;
float tt=0;
//unsigned char c,d;
//unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(125);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
//t= tt*10+0.5; //放大10倍输出并四舍五入---此行没用
return(t);
//e=a&0x0f;//小数部分
//c=(e*10)/16;
//d=((e*10)%16)*10/16;
//Te_D=c*10+d;
//a=a>>4;
//Te=b<<4;
//Te=Te|a;
}
//*************************初始化串口**************************//
//串口初始化
void init_com()
{
SCON=0X40; //方式2,不允许接收
TMOD|=0x20; //定时器1工作方式2,8位自动重装计数初值
PCON=0X80; //波特率加倍
TH1=TL1=0XFA ; //波特率为9600
ES=1; //允许串行中断
TR1=1;
TI=0;
}
//*********************串口发送程序**********************************//
//********************向串口发送一个字符*****************************//
void send_to_comm(unsigned char ch)
{
SBUF=ch;
while(!TI);
TI=0;
}
//*********************************************************************//
void main()
{ unsigned char i=0;
init_com();
while(1)
{
send_to_comm(0xff);
i=ReadTemperature();
send_to_comm(Te);
// send_to_comm(Te_D);
// i=Read_Temperature();
// send_to_comm(i);
}
}