#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include <stdio.h>
bit ture=0;
typedef unsigned char uchar;
typedef unsigned int uint;
sbit dq = P2^0;
sbit rs = P3^4;
sbit lcde = P3^5;
sbit wr = P2^6;
sbit rd = P2^7;
sbit INT = P2^5;
sbit scl = P2^2;
sbit sda = P2^1;
code uchar zf1[]="temp:";
code uchar zf2[]="humidity: g/m3";
code uchar zf3[]="0123456789";
static uchar humidity[10];
void delay_1(uchar m)
{
uchar i;
while(m--)
{
for(i=120;i>0;i--);
}
}
void write_cmd(uchar cmd) /*液晶写指令*/
{
_nop_();
_nop_();
rs=0;
P1=cmd;
lcde=0;
delay_1(1);
lcde=1;
delay_1(3);
lcde=0;
}
void write_data(uchar dat) /*液晶写数据*/
{
_nop_();
_nop_();
rs=1;
P1=dat;
lcde=0;
delay_1(3);
lcde=1;
delay_1(3);
lcde=0;
}
void wait(uint m)
{
while(m--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void init2(void) /*液晶初始化*/
{
uchar i;
delay_1(26670);
write_cmd(0x38);
delay_1(1200);
write_cmd(0x0c);
delay_1(1200);
write_cmd(0x06);
delay_1(1200);
write_cmd(0x01);
write_cmd(0x80);
delay_1(1000);
write_cmd(0x80);
for(i=0;i<strlen(zf1)-1;i++)
{
write_data(zf1[i]);
}
wait(65535);
write_cmd(0x80+40);
for(i=0;i<strlen(zf2)-1;i++)
{
write_data(zf2[i]);
}
wait(65535);
}
/*18B20程序*/
void delay(uint m)
{
while(m--);
}
void init1() //初始化DS
{
uchar x;
dq=1;
_nop_();
_nop_();
dq=0;
delay(80);
dq=1;
delay(8);
x=dq;
delay(4);
dq=1;
}
void write_dat(uchar dat) //对DS写数据
{
uchar i;
for(i=0;i<8;i++)
{
dq=0;
dq=dat&0x01;
delay(4);
dq=1;
dat>>=1;
}
delay(4);
}
uchar read_dat() //读DS数据
{
uchar i,dat;
for(i=0;i<8;i++)
{
dq=0;
dat>>=1;
dq=1;
if(dq)
dat|=0x80;
delay(4);
}
return dat;
}
uint readtmp() //读取温度
{
uchar a,b,t;
init1();
write_dat(0xcc);
delay(1);
write_dat(0x44);
delay(300);
init1();
write_dat(0xcc);
delay(1);
write_dat(0xbe);
a=read_dat();
b=read_dat();
b<<=4;
b+=(a&0xf0)>>4;
t=b;
return t;
}
void start_ad() //初始化AD
{
wr=1;
wr=0;
wr=1;
}
/*温度显示*/
void handle_temp(uchar temp)
{
write_cmd(0x80+5);
write_dat(zf3[temp/10]);
write_dat(zf3[temp%10]);
}
/*湿度矫正*/
uchar humidity_handle(uchar *p)
{
char i,j;
uchar humidity;
float sum;
uchar *p1=p;
for(i=0;i<strlen(p)-1;i++)
{
for(j=0;j<strlen(p)-1-i;j++)
{
if((*p)<(*(p+1))){
humidity = *p;
*p = *(p+1);
*(p+1) = humidity;
}
}
}
p=p1+2;
for(i=0;i<6;i++)
{
sum+=*p++;
}
humidity =(uchar) (sum/6);
return humidity;
}
/*I2C总线代码*/
void init_IIC()
{
scl=1;
sda=1;
}
void start()
{
sda=1;
delay(2);
scl=1;
delay(2);
sda=0;
delay(2);
}
void respond()
{
uchar i;
scl=1;
while((sda==1)&&(i<200))
i++;
scl=0;
delay(2);
}
void stop()
{
sda=0;
delay(2);
scl=1;
delay(2);
sda=1;
delay(2);
}
void write(uchar date)
{
uchar i,t;
t=date;
scl=0;
for(i=0;i<8;i++)
{
t=t<<1;
sda=CY;
delay(2);
scl=1;
delay(2);
scl=0;
delay(2);
}
sda=1;
delay(2);
}
void write_temp(uchar dat)
{
start();
write(0xa0);
respond();
write(1);
respond();
write(dat);
respond();
stop();
}
#if ture
uchar read()
{
uchar dat;
start();
write(0xa0);
respond();
write(1);
respond();
delay(255);
delay(255);
start();
write(0xa1);
respond();
dat=read();
stop();
return dat;
}
#endif
/*主函数*/
void main()
{
char j;
uchar humidi;
uchar temp;
init2();
init_IIC();
while(1)
{
temp = readtmp();
handle_temp(temp);
write_temp(temp);
for(j=0;j<10;j++)
{
P0 = 0xff;
start_ad();
delay(10);
while(INT);
humidity[j] = P0;
}
humidi = humidity_handle(humidity);
write_cmd(0x80+40+9);
write_dat(zf2[humidi/10]);
write_dat(zf2[humidi%10]);
}
}