#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
sbit psb=P2^3;
sbit kg=P2^6;
sbit DQ=P3^2;
float temper;
uchar code table[]="室内温度: . ℃";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay1(uint i)
{
while(i--);
}
void write_com(uchar com)
{
rs=0;
delay(5);
en=1;
P0=com;
delay(5);
en=0;
}
void write_date(uchar date)
{
rs=1;
delay(5);
en=1;
P0=date;
delay(5);
en=0;
}
void dis_str(uchar *p)
{
uchar j,k;
k=strlen(p);
for(j=0;j
}
void init()
{
en=0;
rw=0;
kg=0;
psb=1;
write_com(0x0c);
write_com(0x30);
write_com(0x01);
delay(5);
write_com(0x80);
dis_str(table);
}
void init_18B20()
{
uchar x;
DQ = 1; //DQ复位
delay1(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay1(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay1(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay1(20);
}
void write_byte(uchar date)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=0;
DQ=date&0x01; //写入一位数据
delay1(5);
DQ=1; //总线拉高(释放总线),发送下一位数据
date>>=1;
}
}
uchar read_byte()
{
uchar i,date;
bit k;
for(i=8;i>0;i--)
{
date>>=1;
DQ=0;
DQ=1;
k=DQ; // 读出一位数据
if(k==1)
date|=0x80; //因为最先读出的是数据的最低位,所以让它跟0x80与一下,先把它放到最高位,再通过右移最后把它放到最低位
delay1(4);
}
return date;
}
void get_temp()
{
uchar temp1,temp2;
init_18B20(); // 初始化DS18B20
write_byte(0xCC); // 跳过序列号命令
write_byte(0x44); // 发送温度转换命令
delay(800); // 延迟800ms,让DS18B20有充足的时间进行温度转换
init_18B20(); // 每次操作RAM之前必须先初始化DS18B20
write_byte(0xCC); // 跳过ROM命令
write_byte(0xBE); // 发送读取数据命令
temp1=read_byte(); // 连续读两个字节数据,读数据从最低字节的最低位开始读
temp2=read_byte();
temper=(temp2*256+temp1)*0.0625;
}
void display()
{
uchar a,b,c,shi1,ge1,shi2,ge2;
a=temper/1;
b=(temper-a)*100;
c=b/1;
shi1=a/10;
ge1=a%10;
shi2=c/10;
ge2=c%10;
write_com(0x80+4);
write_date(':');
write_date(0x30+shi1);
write_date(0x30+ge1);
write_date('.');
write_date(0x30+shi2);
write_date(0x30+ge2);
}
void main()
{
init();
while(1)
{
get_temp();
display();
}
}