程序如下
#include //_nop_();延时函数用
#define uchar unsigned char
#define uint unsigned int
***it temp_out=P1^3;
***it humi_out=P1^4;
***it temp_led=P1^5;
***it humi_led=P1^6;
uint count;
uchar ds1,ds2,ds3,ds4;
uchar U8FLAG,k;
uchar U8count,U8temp;
uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
uchar U8comdata;
uint U16temp1,U16temp2;
***it IO= P1^7 ;
//
void Delay1(uint j)
{
uchar i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
uchar i=5;
for(;i>0;i--);
}
void COM(void)
{
uchar i;
for(i=0;i<8;i++)
{
U8FLAG=2;
//---------------------
while((!IO)&&U8FLAG++);
Delay_10us();
Delay_10us();
// Delay_10us();
U8temp=0;
if(IO)U8temp=1;
U8FLAG=2;
while((IO)&&U8FLAG++);
//----------------------
//P2_1=0 ;
//P2_1=1 ;
//----------------------
if(U8FLAG==1)break;
U8comdata<<=1;
U8comdata|=U8temp;
}
}
//--------------------------------
void RH(void)
{
IO=0;
Delay1(180);
IO=1;
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
IO=1;
if(!IO)
{
U8FLAG=2;
while((!IO)&&U8FLAG++);
U8FLAG=2;
while((IO)&&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;
IO=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 convdat()
{
ds1=U8RH_data_H/10;
ds2=U8RH_data_H%10;
ds3=U8T_data_H/10;
ds4=U8T_data_H%10;
}
LCD1602显示模块
#define uchar unsigned char
#define uint unsigned int
***it RS=P1^2;
***it RW=P1^1;
***it E=P1^0;
uchar d;
uchar code tab_t[]={"TEMPERATURE: C"};
uchar code tab_h[]={"HUMIDITY: %"};
uchar code tab_time[]={"TIME:"};
uchar code tab_set_temp_H[]={"SET_TEMP_HIGH"};
uchar code tab_set_temp_L[]={"SET_TEMP_ LOW"};
uchar code tab_set_humi_H[]={"SET_HUMI_HIGH"};
uchar code tab_set_humi_L[]={"SET_HUMI_ LOW"};
uchar code tab_set_hour[]={"SET_HOUR"};
uchar code tab_lcd_num[]={'0','1','2','3','4','5','6','7','8','9'};
void delay_1602(uchar x)
{
uchar a,b;
for(a=0;a<10;a++)
{ for(b=x;b>0;b--); }
}
void write_cmd(uchar x)
{
E=0;
RS=0;
RW=0;
E=1;
P0=x;
delay_1602(50);
}
/*uchar read_dat()
{
RS=1;
RW=1;
E=1;
d=P0;
delay(5);
return d;
}*/
void write_dat(uchar y)
{
E=0;
RS=1;
RW=0;
E=1;
P0=y;
delay_1602(50);
E=0;
}
void busy()
{uchar a;
while(a==0x80)
{E=0;
RS=0;
RW=1;
E=1;
delay_1602(50);
a=P0;
}
}
void init_lcd()
{
busy();
write_cmd(0x38);
delay_1602(5);
busy();
write_cmd(0x01);
delay_1602(5);
busy();
write_cmd(0x0C);
delay_1602(5);
}
温湿度控制系统程序
#include //52单片机头文件
#include //温湿度传感器DHT11头文件
#include //液晶屏1602头文件
uchar i,key_flag;
uchar set_temp_H,set_temp_H_shi,set_temp_H_ge;//设定温度的变量
uchar set_temp_L,set_temp_L_shi,set_temp_L_ge;//设定温度的变量
uchar set_humi_H,set_humi_H_ge,set_humi_H_shi;//设置湿度的变量
uchar set_humi_L,set_humi_L_ge,set_humi_L_shi;//设置湿度的变量
***it k1=P2^0;//定义按键K1
***it k2=P2^1;//定义按键K2
***it k3=P2^2;//定义按键K3
***it k4=P2^3;//定义按键K4
***it baojing=P3^3;
/////////////////////////延时函数/////////////////////////////
void delay(uchar x)
{
uchar a,b;
for(a=0;a<20;a++)
{ for(b=x;b>0;b--); }
}
/////////////////////////显示温度 和 湿度//////////////////////////
void disp_t_h()
{
write_cmd(0x8c);
write_dat(tab_lcd_num[ds3]);//显示温度十位
write_cmd(0x8d);
write_dat(tab_lcd_num[ds4]);//显示温度个位
write_cmd(0xcc);
write_dat(tab_lcd_num[ds1]);//显示温湿度十位
write_cmd(0xcd);
write_dat(tab_lcd_num[ds2]);//显示温湿度个位
}
///////////////////////开机显示////////////////////////////////////
void disp_start()
{for(i=0;i<16;i++)
{write_cmd(0x80+i);
write_dat(tab_t[i]);//温度
}
for(i=0;i<16;i++)
{write_cmd(0xc0+i);
write_dat(tab_h[i]);//湿度
}
}
///////////////////////扫描按键////////////////////////////////
void key_scan()
{
if(k1==0)//按下K1
{
//设置温度上限////////////////////////////////
if(key_flag==0)//按键标志0
{
write_cmd(0x01);//清屏
write_cmd(0x80);//显示位置第一行第一列
for(i=0;i<13;i++)
write_dat(tab_set_temp_H[i]);//显示SET TEMPERATURE字符
while(k4==1)//按下K4
{
if(k2==0)//按下K2
{ while(k2==0);
set_temp_H++;//设置温度数值加
if(set_temp_H==100)//到100,清0
set_temp_H=0;
}
if(k3==0)//按下K2
{ while(k3==0);//松手检测
set_temp_H--;//设置温度数值减
if(set_temp_H==0)//到0,加为100
set_temp_H=100;
}
set_temp_H_ge=set_temp_H%10;//计算设置温度个位
set_temp_H_shi=set_temp_H/10;//计算设置温度十位
write_cmd(0xc6);
write_dat(tab_lcd_num[set_temp_H_shi]);//显示设置温度个位
write_cmd(0xc7);
write_dat(tab_lcd_num[set_temp_H_ge]);//显示设置温度十位
}
delay(200);
}
//设置温度下限////////////////////////////////
if(key_flag==1)//按键标志1
{
write_cmd(0x01);//清屏
write_cmd(0x80);//显示位置第一行第一列
for(i=0;i<13;i++)
write_dat(tab_set_temp_L[i]);//显示SET TEMPERATURE字符
while(k4==1)//按下K4
{
if(k2==0)//按下K2
{ while(k2==0);
set_temp_L++;//设置温度数值加
if(set_temp_L==100)//到100,清0
set_temp_L=0;
}
if(k3==0)//按下K2
{ while(k3==0);//松手检测
set_temp_L--;//设置温度数值减
if(set_temp_L==0)//到0,加为100
set_temp_L=100;
}
set_temp_L_ge=set_temp_L%10;//计算设置温度个位
set_temp_L_shi=set_temp_L/10;//计算设置温度十位
write_cmd(0xc6);
write_dat(tab_lcd_num[set_temp_L_shi]);//显示设置温度个位
write_cmd(0xc7);
write_dat(tab_lcd_num[set_temp_L_ge]);//显示设置温度十位
}
}
////设置湿度上限///////////////////////////////////////////////////
if(key_flag==2)//按键标志2
{
write_cmd(0x01);//清屏
write_cmd(0x80);//显示位置第一行第一列
for(i=0;i<13;i++)
write_dat(tab_set_humi_H[i]);//显示SET HUMIDITY字符
while(k4==1)
{
if(k2==0)
{ while(k2==0);
set_humi_H++;//设置湿度数值加
if(set_humi_H==100)
set_humi_H=0;
}
if(k3==0)
{ while(k3==0);
set_humi_H--;//设置湿度数值减
if(set_humi_H==0)
set_humi_H=100;
}
set_humi_H_ge=set_humi_H%10;//计算设置湿度个位
set_humi_H_shi=set_humi_H/10;//计算设置湿度十位
write_cmd(0xc6);
write_dat(tab_lcd_num[set_humi_H_shi]);//显示设置湿度十位
write_cmd(0xc7);
write_dat(tab_lcd_num[set_humi_H_ge]);//显示设置湿度个位
}
}
////设置湿度下限///////////////////////////////////////////////////
if(key_flag==3)//按键标志3
{
write_cmd(0x01);//清屏
write_cmd(0x80);//显示位置第一行第一列
for(i=0;i<13;i++)
write_dat(tab_set_humi_L[i]);//显示SET HUMIDITY字符
while(k4==1)
{
if(k2==0)
{ while(k2==0);
set_humi_L++;//设置湿度数值加
if(set_humi_L==100)
set_humi_L=0;
}
if(k3==0)
{ while(k3==0);
set_humi_L--;//设置湿度数值减
if(set_humi_L==0)
set_humi_L=100;
}
set_humi_L_ge=set_humi_L%10;//计算设置湿度个位
set_humi_L_shi=set_humi_L/10;//计算设置湿度十位
write_cmd(0xc6);
write_dat(tab_lcd_num[set_humi_L_shi]);//显示设置湿度十位
write_cmd(0xc7);
write_dat(tab_lcd_num[set_humi_L_ge]);//显示设置湿度个位
}
}
//按键功能结束/////////////////////////////////////////////
key_flag++;
if(key_flag==4)//按键标志6
key_flag=0;
write_cmd(0x01);//清屏
disp_start();//显示字符
}
}
////////////比较数据,开启或关闭 继电器/////////////////////////////////////
void bijiao()
{
if(U8T_data_H>set_temp_H)//如果温度大于设置温度,关闭温度继电器和温度LED,
baojing=0;
else baojing=1;
//temp_out=0;//P1.3
// else temp_out=1;
if(U8T_data_H
temp_led=0;//P1.1
else temp_led=1;
if(U8RH_data_H>set_humi_H)//如果湿度大于设置湿度,关闭湿度继电器和湿度LED,
humi_out=0;//P1.4
else humi_out=1;
if(U8RH_data_H
humi_led=0;//P1.2
else humi_led=1;
}
/////////主函数//////////////////////////////////////////////////
void main()
{
init_lcd();//初始化液晶1602
disp_start();//显示字符
RH();//读取DHT11温湿度数值
convdat();//转换DHT11温湿度数值
disp_t_h();//显示温度 和 湿度
while(1)
{
key_scan();//扫描按键
count++;//计数器加
if(count==100)//到100,转换温湿度数据
{ count=0;
RH();
convdat();}
disp_t_h();//显示温度 和 湿度
bijiao();//比较数据控制 继电器动作
}
}
|