#include"reg51.h"
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
sbit DQ=P3^3;
unsigned int readtemp=0;
unsigned char str[]={"0123456789"};
// 非精確延時確定
void delay_18B20(unsigned int i)
{
for(;i>0;i--);
}
// 初始化程序
void Init_DS18B20(void)
{
unsigned char x=0;
DQ=1;
delay_18B20(8);
DQ=0;
delay_18B20(80);
DQ=1;
delay_18B20(14);
x=DQ;
delay_18B20(20);
}
// 讀時序
unsigned char 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_18B20(4);
}
return(dat);
}
// 寫時序
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--);
{
DQ=0;
DQ=dat&0x01;
if(DQ){delay_18B20(1);DQ=1;}
else{delay_18B20(5);DQ=1;}
dat>>=1;
}
}
// 讀溫度
unsigned char ReadTemperature(void)
{
unsigned char a=0,b=0;
unsigned int temp=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
delay_18B20(100);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(100);
a=ReadOneChar();
b=ReadOneChar();
temp=((b*256+a)>>4);
return(temp);
}
void delay(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
void writedat(unsigned char dat)
{
RS=1;
RW=0;
E=0;
P1=dat;
delay(5);
E=1;
E=0;
}
void writecom(unsigned char com)
{
RS=0;
RW=0;
E=0;
P1=com;
delay(5);
E=1;
E=0;
}
void initlcd()
{
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01);
}
void display()
{
unsigned char temp0=0,temp1=0,temp2=0;
temp0=readtemp/100;
temp1=(readtemp%100)/10;
temp2=readtemp%10;
writecom(0x80);
delay(5);
writedat(str[temp0]);
delay(5);
writedat(str[temp1]);
delay(5);
writedat(str[temp2]);
delay(5);
}
void main()
{
initlcd();
while(1)
{
readtemp=ReadTemperature();
display();
}
}
|