#include<reg52.h> //分享一下自己的学习成果,给自己加把劲!!!
#define uint unsigned int //路漫漫其修远兮 吾将上下而求索
#define uchar unsigned char
sbit lcde=P2^7;
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit IO=P3^7;
uchar temp,num;
void init_DS18B20();
void init_1602();
void write_byte(uchar dat);
uchar read_byte(void);
uchar readtemperature();
void write_com(uchar com);
void write_data(uchar date);
void delay(uint z);
void delay2(uint t);
void display();
uchar code table[]={"Temperature"};
uchar code table1[]={"The value: C"};
void main()
{
delay(10);
init_1602();
init_DS18B20();
write_com(0x80+0x10);
for(num=0;num<11;num++) //写第一行
{
write_data(table[num]);
delay(2);
}
write_com(0x80+0x50); //设置第二行地址
for(num=0;num<13;num++) //写第二行
{
write_data(table1[num]);
delay(2);
}
delay(10);
for(num=0;num<16;num++) //写完整屏左移16位
{
write_com(0x18);
delay(2);
}
while(1)
{
display();
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //液晶写命令
{
lcdrs=0;
lcde=0;
P0=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
P0=com<<4;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void write_data(uchar date) //液晶写数据
{
lcdrs=1;
lcde=0;
P0=date;
delay(5);
lcde=1;
delay(5);
lcde=0;
P0=date<<4;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void delay2(uint t)
{
while(t--);
}
void init_DS18B20() //初始化ds18b20
{
uchar n; //初始化DS18B200
IO=1;
delay2(8);
IO=0;
delay(80);
IO=1;
delay(8);
n=IO; //n这里不用返回,若需要,可改为带返回值的函数,n=0,则线上没有DS18B20,n=1,则有
delay2(4);
}
void init_1602()
{
lcdrw=0;
write_com(0x32); //初始化4pin
write_com(0x28); //初始化两行显示
write_com(0x0f);
write_com(0x06);
write_com(0x01);
write_com(0x02);
write_com(0x80+0x10); //初始化地址
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
IO=0;
IO=dat&0x01;
delay2(4);
IO=1;
dat>>=1;
}
delay(4);
}
uchar read_byte(void)
{
uchar i,value;
for(i=0;i<8;i++)
{
IO=0; //拉低
value>>=1; //延时
IO=1; //释放
if(IO) //采样
value|=0x80;
delay2(4);
}
return value;
}
uchar readtemperature()
{
uchar a,b; //温度有2个字节一个高8位,一个低8位
init_DS18B20();
write_byte(0xcc); //跳过rom
write_byte(0x44); //启动温度测量
delay2(300);
init_DS18B20();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte(); //读低8位
b=read_byte();
b<<=4; //读高8位
b+=(a&0xf0)>>4;
return(b);
}
void display()
{
uint shi,ge;
temp=readtemperature();
shi=temp/10;
ge=temp%10;
write_com(0x80+0x50+0x0A);
if(shi>9)
shi=shi+0x37;
else
shi=shi+0x30;
write_data(shi);
if(ge>9)
ge=ge+0x37;
else
ge=ge+0x30;
write_data(ge);
}