原有DHT11+LCD1602显示温湿度采集代码,如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P1^6;
uchar rec_dat[7];
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
void delay(uint n)
{ uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_dat(uchar dat)
{
lcdrs=1;
P0=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(30);
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte()
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
while(!Data);
DHT11_delay_us(8);
dat<<=1;
if(Data==1)
dat+=1;
while(Data);
}
return dat;
}
void DHT11_receive()
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0);
DHT11_delay_us(40);
R_H=DHT11_rec_byte();
R_L=DHT11_rec_byte();
T_H=DHT11_rec_byte();
T_L=DHT11_rec_byte();
revise=DHT11_rec_byte();
DHT11_delay_us(25);
if((R_H+R_L+T_H+T_L)==revise)
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
rec_dat[0]='0'+(RH/10);
rec_dat[1]='0'+(RH%10);
rec_dat[2]='%';
rec_dat[3]=' ';
rec_dat[4]=' ';
rec_dat[5]='0'+(TH/10);
rec_dat[6]='0'+(TH%10);
}
}
void main()
{
uchar i;
init_lcd();
while(1)
{
DHT11_delay_ms(100);
DHT11_receive();
write_com(0x80);
for(i=0;i<7;i++)
write_dat(rec_dat[i]);
write_dat(rec_dat[7]);
write_dat(0xdf);
write_dat('C');
}
}
但是,LCD显示屏显示位数只显示到个位数,精度较低;并且不能够调整误差。如图所示:
接下来修改代码使其显示一位小数,因为存在时间漂移和温度漂移,所以添加4个按键Key1~Key4,可对设备进行手动校正。修改后代码如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P1^6;
uchar rec_dat[10];
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
sbit Key1=P3^0;
sbit Key2=P3^1;
sbit Key3=P3^2;
sbit Key4=P3^3;
int a=0,b=0;
void delay(uint n)
{ uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_dat(uchar dat)
{
lcdrs=1;
P0=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(30);
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte()
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
while(!Data);
DHT11_delay_us(8);
dat<<=1;
if(Data==1)
dat+=1;
while(Data);
}
return dat;
}
void DHT11_receive()
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0);
DHT11_delay_us(40);
R_H=DHT11_rec_byte();
R_L=DHT11_rec_byte();
T_H=DHT11_rec_byte();
T_L=DHT11_rec_byte();
revise=DHT11_rec_byte();
DHT11_delay_us(25);
if((R_H+R_L+T_H+T_L)==revise)
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
rec_dat[0]='0'+((RH+a)/10);
rec_dat[1]='0'+((RH+a)%10);
rec_dat[2]='.';
rec_dat[3]='0'+1;
rec_dat[4]='%';
rec_dat[5]=' ';
rec_dat[6]=' ';
rec_dat[7]='0'+((TH+b)/10);
rec_dat[8]='0'+((TH+b)%10);
rec_dat[9]='.';
rec_dat[10]='0'+2;
}
}
void main()
{
uchar i;
init_lcd();
while(1)
{
if(Key1==0)
{
delay(30);
a+=1;
}
if(Key2==0)
{
delay(30);
a-=1;
}
if (Key3==0)
{
delay(30);
b+=1;
}
if (Key4==0)
{
delay(30);
b-=1;
}
DHT11_delay_ms(100);
DHT11_receive();
write_com(0x80);
for(i=0;i<10;i++)
write_dat(rec_dat[i]);
write_dat(rec_dat[10]);
write_dat(0xdf);
write_dat('C');
}
}
演示视频如下: