#include<reg51.h>
sbit DQ=P1^2;
sbit DQ1=P2^5;
sbit DQ2=P2^7;
//sbit DQ3=P1^3;
#define uchar unsigned char
#define uint unsigned int
uchar temp_value,temp_value1,temp_value2;
uchar code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X40};
void delay_18B20(uint i)
{
while(i--);
}
void Init_DS18B20(void)
{
uchar x=0;
DQ = 1; //DQ复位
delay_18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(60); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_18B20(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(20);
}
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{ DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
void Init_DS18B201(void)
{
uchar x=0;
DQ1 = 1; //DQ复位
delay_18B20(8); //稍做延时
DQ1 = 0; //单片机将DQ拉低
delay_18B20(80); //精确延时 大于 480us
DQ1 = 1; //拉高总线
delay_18B20(14);
x=DQ1; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(20);
}
uchar ReadOneChar1(void)
{
uchar i=0; uchar dat = 0;
for (i=8;i>0;i--)
{
DQ1 = 0; // 给脉冲信号
dat>>=1;
DQ1 = 1; // 给脉冲信号
if(DQ1)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
void WriteOneChar1(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ1 = 0;
DQ1 = dat&0x01;
delay_18B20(5);
DQ1 = 1;
dat>>=1;
}
}
void Init_DS18B202(void)
{
uchar x=0;
DQ2 = 1; //DQ复位
delay_18B20(8); //稍做延时
DQ2 = 0; //单片机将DQ拉低
delay_18B20(80); //精确延时 大于 480us
DQ2 = 1; //拉高总线
delay_18B20(14);
//x=DQ1; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(20);
}
uchar ReadOneChar2(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ2 = 0; // 给脉冲信号
dat>>=1;
DQ2 = 1; // 给脉冲信号
if(DQ2)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
void WriteOneChar2(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ2 = 0;
DQ2 = dat&0x01;
delay_18B20(5);
DQ2 = 1;
dat>>=1;
}
}
void ReadTemp(void)
{
uchar a=0;
uchar b=0;
uchar t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay_18B20(100); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等共可读9个寄存器 前两个就是温度
delay_18B20(100);
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;
}
void ReadTemp1(void)
{
uchar c=0;
uchar d=0;
uchar t=0;
Init_DS18B201();
WriteOneChar1(0xCC); // 跳过读序号列号的操作
WriteOneChar1(0x44); // 启动温度转换
delay_18B20(100); // this message is wery important
Init_DS18B201();
WriteOneChar1(0xCC); //跳过读序号列号的操作
WriteOneChar1(0xBE); //读取温度寄存器等共可读9个寄存器 前两个就是温度
delay_18B20(100);
c=ReadOneChar1(); //读取温度值低位
d=ReadOneChar1(); //读取温度值高位
temp_value1=d<<4;
temp_value1+=(c&0xf0)>>4;
}
void ReadTemp2(void)
{
uchar e=0;
uchar f=0;
uchar t=0;
Init_DS18B202(); WriteOneChar2(0xCC); // 跳过读序号列号的操作
WriteOneChar2(0x44); // 启动温度转换
delay_18B20(100); // this message is wery important
Init_DS18B202();
WriteOneChar2(0xCC); //跳过读序号列号的操作
WriteOneChar2(0xBE); //读取温度寄存器等共可读9个寄存器 前两个就是温度
delay_18B20(100);
e=ReadOneChar2(); //读取温度值低位
f=ReadOneChar2(); //读取温度值高位
temp_value2=f<<4;
temp_value2+=(e&0xf0)>>4;
}
//显示延时 函数
void delay(unsigned int z)
{
unsigned int x;
unsigned char y;
for(x=z;x>0;x--)
for(y=200;y>0;y--);
}
void display (uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5)
{ P2=0XFE;
P0=0x00;
P0=table[num1];
delay(6);
P2=0XFD;
P0=0x00;
P0=table[num0];
delay(6);
P2=0XFB;
P0=0x00;
P0=table[10];
delay(6);
P2=0XF7;
P0=0x00;
P0=table[num3];
delay(6);
P2=0XEF;
P0=0x00;
P0=table[num2]; delay(6);
P2=0XDF;
P0=0x00;
P0=table[10];
delay(6);
P2=0XBF;
P0=0x00;
P0=table[num5];
delay(6);
P2=0X7F;
P0=0x00;
P0=table[num4];
delay(6);
}
main()
{ unsigned int i=0;
uchar a ,b,c,d,e,f ;
while(1)
{
ReadTemp();
ReadTemp1();
ReadTemp2();
b=temp_value/10; //十位
a=temp_value%10; //个位
d=temp_value1/10; //十位
c=temp_value1%10; //个位
f=temp_value2/10; //十位
e=temp_value2%10; //个位
display(b,a,d,c,f,e);
}
}
|