DHT11检测的温湿度控制系统程序

#include
#include
#define uchar unsigned char
#define uint unsigned int

sbit tempAndHumi=P2^0; //温湿传感器数据传输
/*LCD1602液晶显示*/
sbit e=P2^7;
sbit rs=P2^6;
sbit rw=P2^5;
/*步进电机相序控制*/
/*sbit A1=P3^0;
sbit B1=P3^1;
sbit C1=P3^2;
sbit D1=P3^3;
sbit windChooser=P3^4;//吹风机加热
sbit HFJ=P3^5;//风扇转动
sbit DRB=P3^6;//加湿器*/

unsigned char code table[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//转换成液晶显示的字符
unsigned char code biaoge[]={0,1,2,3,4,5,6,7,8,9};//转换成液晶显示的字符
unsigned char table1[17]={"temperat "};
unsigned char table2[17]={"humitude "};
unsigned char U8FLAG;
unsigned char U8count,U8temp;
unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsigned char U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
unsigned char U8comdata;
unsigned int U16temp1,U16temp2;
unsigned char wenshe,shishe;
//unsigned char wdbijiao,sdbijiao,wsbijiao;
//unsigned char a=0,b=0,c=0;

uchar data display[5];
void delay_50us(uint t)
{ uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);

}
/*void delayMotor(int a)
{
while(a--);
}*/
void dELAYYY(uint j)
{
uchar i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void delay(uint ms)
{
uint x,y;
for(x=ms;x>0;x--)
{
for(y=200;y>0;y--);
}

}
void Delayy_10us(void)
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;

}
//键盘扫描函数
uchar keyscan()
{
uchar key_l,key_h,number=0xff,keyvalue;


P1=0XF0;
key_l=P1;
key_l=key_l&0xf0;
if(key_l!=0x0f)
{
delay_50us(200);
if(key_l!=0x0f)
{

{
key_l=P1&0xf0;
key_l=key_l|0x0f;
P1=key_l;
key_h=P1;
key_h=key_h&0x0f;
key_l=key_l&0xf0;
keyvalue=key_h+key_l;
}
}
switch (keyvalue)
{

case 0xb7:number=0;break;
case 0xbb:number=1;break;
case 0xbd:number=2;break;
case 0xbe:number=3;break;

case 0xd7:number=4;break;
case 0xdb:number=5;break;
case 0xdd:number=6;break;
case 0xde:number=7;break;

case 0xe7:number=8;break;
case 0xeb:number=9;break;
case 0xed:number=10;break;
case 0xee:number=11;break;
}


}
return (number);


}

//串行读取数据
void COM(void)
{
uchar i;
for(i=0;i<8;i++)
{
U8FLAG=2;

while((!tempAndHumi)&&U8FLAG++);
Delayy_10us();
Delayy_10us();
Delayy_10us();
Delayy_10us();

U8temp=0;
if(tempAndHumi)
U8temp=1;

U8FLAG=2;
while((tempAndHumi)&&U8FLAG++);

if(U8FLAG==1)
break;
U8comdata<<=1;
U8comdata|=U8temp;
}
}
//读取温湿度
void RH(void)
{
//主机拉低18ms
tempAndHumi=0;
dELAYYY(180);
tempAndHumi=1;
//主机有上拉电阻拉高,主机延时20~40us
Delayy_10us();
Delayy_10us();
Delayy_10us();
//Delayy_10us();
//主机设为输入

判断从机响应信号
tempAndHumi=1;
//判断从机是否有低电平响应信号
if(!tempAndHumi)
{
U8FLAG=2;
//判断从机是否发出80us的低电平响应
while((!tempAndHumi)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出80us的高电平,数据接收
while((tempAndHumi)&&U8FLAG++);
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
while((!tempAndHumi)&&U8FLAG++);
tempAndHumi=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;

}
}
}
void write_com (unsigned char com)
{
e=0;
rw=0;
rs=0;
P0=com;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
void write_data(unsigned char dat)
{
e=0;
rw=0;
rs=1;
P0=dat;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
void init()
{
delay_50us(300);
write_com(0x38);
delay_50us(100);
write_com(0x38);
delay_50us(100);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);

}
//显示温湿
void Disp_Temperature()
{

display[4]=U8RH_data_H;

display[4]=display[4]%100;
display[3]=display[4]/10;
display[2]=display[4]%10;


display[4]=U8T_data_H;

display[4]=display[4]%100;
display[1]=display[4]/10;

display[0]=display[4]%10;

write_com(0x80+14);
write_data(table[display[1]]);


write_com(0x80+15);
write_data(table[display[0]]);

write_com(0xc0+14);
write_data(table[display[3]]);


write_com(0xc0+15);
write_data(table[display[2]]);
}

//键盘扫描显示
void Dis_code()
{ unsigned char num=0;
unsigned char key;
unsigned char j;
unsigned char flag;


init();
write_com(0x80);
for(j=0;j<16;j++)
// while(table1[j]!='\0')
{
write_data(table1[j]);
//delay_50us(1);}
//j++;
}

write_com(0xc0);
for(j=0;j<16;j++)
{write_data(table2[j]);
//delay_50us(1); //显示温湿字样
}



while(1)
{ if(flag==1)
break;
if(keyscan()!=0xff)
{

{ key=keyscan();
//write_data(table[key]);

while(keyscan()!=0xff);
num++;
switch(num)
{
case 1:
{
write_com(0x80+11);
write_data(table[key]);
wenshe=biaoge[key]*10;//加语句
break;
}
case 2:
{
write_com(0x80+12);
write_data(table[key]);
wenshe=wenshe+biaoge[key];
break;
}
case 3:
{
write_com(0xc0+11);
write_data(table[key]);
shishe=biaoge[key]*10;
break;
}
case 4:
{
flag=1;
num=0;
write_com(0xc0+12);
write_data(table[key]);
shishe=shishe+bi

aoge[key];
break;
}
}
}
}

}
}
/*void Compare_WS()
{
if(U8T_data_H<(wenshe-2))
{
wdbijiao=1;
} //加热
if(U8T_data_H>=wenshe)
{
wdbijiao=0;
} //加热停止
if(U8RH_data_H<(shishe-2))
{
sdbijiao=1;
} //加湿
if(U8RH_data_H>=shishe)
{
sdbijiao=0;
} //停止加湿
if((U8T_data_H>(wenshe+2))||(U8RH_data_H>(shishe+2)))
{
wsbijiao=1;
}
if((U8T_data_H<=(wenshe-2))&&(U8RH_data_H<=(shishe-2)))
{
wsbijiao=0;
}
}
void JiaRe()
{
windChooser=1;

}
void JiaShi()
{
DRB=1;
}
void JRS()
{
HFJ=1;
}
void TJiaRe()
{
windChooser=0;

}
void TJiaShi()
{
DRB=0;
}
void TJRS()
{
HFJ=0;
}
void motor_Left()
{
unsigned int i=35;
while(i)
{
A1=0;
B1=1;
C1=0;
D1=0;
delayMotor(3000);
A1=0;
B1=0;
C1=1;
D1=0;
delayMotor(3000);
A1=1;
B1=0;
C1=0;
D1=0;
delayMotor(3000);
A1=0;
B1=0;
C1=0;
D1=1;
delayMotor(3000);
i--;
}
}


void motor_Right()
{
unsigned int i=35;
while(i)
{
A1=0;
B1=0;
C1=0;
D1=1;
delayMotor(3000);
A1=1;
B1=0;
C1=0;
D1=0;
delayMotor(3000);
A1=0;
B1=0;
C1=1;
D1=0;
delayMotor(3000);
A1=0;
B1=1;
C1=0;
D1=0;
delayMotor(3000);
i--;
}
}*/

void main(void)
{
init();
//HFJ=0;
//DRB=0;
//windChooser=0;
Dis_code();//设定温度湿度显示
while(1)
{
RH();//读取实际温湿度
Disp_Temperature();//显示实际温湿度
//Compare_WS();
/*if(wdbijiao==1)
{
JiaRe();
}
if(sdbijiao==1)
{
if(a==0)
{
motor_Right();
a=1;
b=0;
c=1;
}
JiaShi();

}
if(wsbijiao==1)
{
JRS();
}
if(wdbijiao==0)
{
TJiaRe();
}
if(sdbijiao==0)
{
TJiaShi();
if((b==0)&&(c==1)) //c标志盖子开始在下面
{
motor_Left();
a=0;
b=1;
}
}
if(wsbijiao==0)
{
TJRS();
} */
}
}

相关文档
最新文档