温湿度检测控制程序_c

#include
#include
#define uchar unsigned char
#define unit unsigned int

sbit P2_0=P2^0; //数据传输
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 Relay=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;
uchar data display[5];
void delay_50us(unsigned int t)
{ unsigned char j;
for(;t>0;t--)
for(j=19;j>0;j--);

}
void dELAYYY(unsigned int j)
{
unsigned char i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void delay(unsigned int ms)
{
unsigned int x,y;
for(x=ms;x>0;x--)
{
for(y=200;y>0;y--);
}

}
void Delayy_10us(void)
{
unsigned char i;
i--;
i--;
i--;
i--;
i--;
i--;

}
//键盘扫描函数
unsigned char keyscan()
{
unsigned char 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)
{
unsigned char i;
for(i=0;i<8;i++)
{
U8FLAG=2;

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

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

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

if(U8FLAG==1)
break;
U8comdata<<=1;
U8comdata|=U8temp;
}
}
//读取温湿度
void RH(void)
{
//主机拉低18ms
P2_0=0;
dELAYYY(180);
P2_0=1;
//主机有上拉电阻拉高,主机延时20~40us
Delayy_10us();
Delayy_10us();
Delayy_10us();
//Delayy_10us();
//主机设为输入 判断从机响应信号
P2_0=1;
//判断从机是否有低电平响应信号
if(!P2_

0)
{
U8FLAG=2;
//判断从机是否发出80us的低电平响应
while((!P2_0)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出80us的高电平,数据接收
while((P2_0)&&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((!P2_0)&&U8FLAG++);
P2_0=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+biaoge[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-1))
{
sdbijiao=0;
} //停止加湿
if((U8T_data_H>(wenshe+2))||(U8RH_data_H>(shishe+2)))
{
wsbijiao=1;
}
if((U8T_data_H<=wenshe)||(U8RH_data_H<=shishe))
{
wsbijiao=0;
}
}
void JiaRe()
{
Relay=1;

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

}
void TJiaShi()
{
DRB=0;
}
void TJRS()
{
HFJ=0;
}




void main(void)
{
init();
HFJ=0;
DRB=0;
Relay=0;
Dis_code();
while(1)
{
RH();
Disp_Temperature();
Compare_WS();
if(wdbijiao==1)
{
JiaRe();
}
if(sdbijiao==1)
{
JiaShi();
}
if(wsbijiao==1)
{
JRS();
}
if(wdbijiao==0)
{
TJiaRe();
}
if(sdbijiao==0)
{
TJiaShi();
}
if(wsbijiao==0)
{
TJRS();
}
}
}

相关文档
最新文档