#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P2^0; //定义数据线
uchar rec_dat[9]; //用于显示的接收数据数组
sbit lcdrs = P2^3; //寄存器选择输入
sbit lcdrw = P2^4; //液晶读/写控制
sbit lcden = P2^5; //液晶使能控制
sbit wela = P2^7;
sbit dula = P2^6;
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(20); //延时18ms以上
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte() //接收一个字节
{
uchar i,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!Data); ////等待50us低电平过去
DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
if(Data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Data); //等待数据线拉低
}
return dat;
}
void DHT11_receive() //接收40位的数据
{
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); //拉高后延时80us
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]='R';
rec_dat[3]='H';
rec_dat[4]=' ';
rec_dat[5]=' ';
rec_dat[6]='0'+(TH/10);
rec_dat[7]='0'+(TH%10);
rec_dat[8]='C';
}
}
void write_com(uchar com)
{
lcdrw= 0;
lcdrs= 0;
P0 = com;
DHT11_delay_ms(5);
lcden=1 ;
DHT11_delay_ms(5);
lcden =0;
}
void write_date(uchar date)
{
lcdrw =0;
lcdrs=1;
P0 =date;
DHT11_delay_ms(5);
lcden =1;
DHT11_delay_ms(5);
lcden =0;
}
void init()
{
dula =0;
wela =0;
lcden=0;
lcdrw=0;
write_com(0x38);//初始化液晶
write_com(0x0f); //不显示显示光标
write_com(0x0c); //当读或写一个字符后地址指针加一,且光标加一
write_com(0x06);// 整屏不左移
write_com(0x01);//刷新一次使其全部清零
//如果指针不赋值,指针默认80h
write_com(0x80);//写指针地址
}
void main()
{
uchar i;
init(); //lcd1602初始化
while(1)
{
DHT11_delay_ms(1500); //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令
DHT11_receive();
write_com(0x80); //从lcd1602第一行第一个位置开始显示
for(i=0;i<9;i++)
write_date(rec_dat[i]); //显示数据
}
}
|