#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);
}
}
|