当前位置 博文首页 > 通信汪的美好生活的博客:51单片机温湿度调节系统
电路:
程序:一个主函数,三个头文件分别对应设计中用到的三个主要元件
//主函数
#include<reg52.h>
#include <intrins.h>
#include <math.h>
#include <stdio.h>
#include <1602.h>
#include <sht11.h>
#include <24c02.h>
#define uchar unsigned char
#define uint unsigned int
#define W_cmd 0xa0 //24c02写指令
#define R_cmd 0xa1
uint temp,humi;
value humi_val,temp_val; //定义两个共同体,一个用于湿度,一个用于温度
uchar error; //用于检验是否出现错误
uchar checksum; //CRC
uchar TEMP_data[7]; //用于记录实测的温度
uchar HUMI_data[6]; //用于记录实测的湿度
uchar show_temp[5]; //显示设定的温度
uchar show_humi[4]; //显示设定的湿度
uchar data temp_humi_cache[4]; //温湿度设置缓存
uchar temp_set; //保存温度变量
uchar humi_set; //保存湿度变量
uchar presskeynum; //按键次数变量
uchar nn; //用于蜂鸣器
uchar code word1[]={" a product of "};
uchar code word2[]={"UNITED ELECTRONS"};
uchar code word3[]={" Welcome........"};
sbit k1=P2^0; //选择按键
sbit k2=P2^1; //增加按键
sbit k3=P2^2; //减小按键
sbit k4=P2^3;// 确认按键
sbit led1=P1^4; //温度过低指示灯
sbit led2=P1^5; // 温度过高
sbit led3=P1^6; //湿度低于下限值,报警,加湿。
sbit led4=P1^7; //湿度过高,报警,不调湿
sbit motor1=P1^0;
sbit motor2=P1^1;
sbit motor3=P1^2;
sbit motor4=P1^3;
sbit P2_6=P2^6;
//********延时函数*********
void delay(uint z) //z为毫秒数
{
int a,b;
for(a=z;a>0;a--)
for(b=120;b>0;b--);
}
void key()
{
uchar m;
if (k1==0) //调整按键检测
{
delay(5);
if (k1==0)
{
presskeynum++;
if(presskeynum==3)
presskeynum=0;
while(k1==0); //若一直按下,循环
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
}
}
if(presskeynum==1)//温度设置
{
if(k2==0) // 加
{
delay(300);
temp_set++;
if (temp_set>30)
temp_set=30;
while(k2==0); //加上此句必须松按键才处理
}
if(k3==0)//减
{
delay(300);
temp_set--;
if (temp_set<18)
temp_set=18;
while(k3==0); //加上此句必须松按键才处理
}
}
if(presskeynum==2)//湿度设置
{
if(k2==0)// 加
{
delay(300);
humi_set++;
if (humi_set>99)
humi_set=99;
while(k2==0);
}
if(k3==0)//减
{
delay(300);
humi_set--;
if (humi_set<1)
humi_set=1;
}
}
if(k4==0)// 退出键
{
delay(10);
if(k4==0)
{
while(k4==0);
presskeynum=0;
temp_humi_cache[0]=temp_set/10;
temp_humi_cache[1]=temp_set%10;
temp_humi_cache[2]=humi_set/10;
temp_humi_cache[3]=humi_set%10;
for(m=0;m<4;m++)
{
WriteIIC(W_cmd,0x00+m,temp_humi_cache[m]); //设定值写入24c02
}
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
}
}
}
//主函数
void main()
{
uchar t;
k1=k2=k3=k4=1;
motor1=motor2=motor3=motor4=0;
P2_6=0;
for (t=0;t<4;t++)
temp_humi_cache[t]=ReadIIC(W_cmd,0x00+t,R_cmd); //读入24c02设定的值
temp_set=temp_humi_cache[0]*10+temp_humi_cache[1];
humi_set=temp_humi_cache[2]*10+temp_humi_cache[3];
LCD_Initial(); //液晶初始化
GotoXY(0,0);
Print_slow(word1);
GotoXY(0,1);
Print_slow(word2);
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
GotoXY(0,0);
Print_slow(word3);
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
while(1)
{
key();
if(presskeynum==0) //测量温湿度
{
s_connectionreset(); //启动连接复位
error=0; //初始化error=0,即没有错误
error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //温度测量
error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //湿度测量
if(error!=0)
s_connectionreset(); //如果发生错误,系统复位
else
{
humi_val.f=(float)humi_val.i; //转换为浮点数
temp_val.f=(float)temp_val.i; //转换为浮点数
calc_sth10(&humi_val.f,&temp_val.f); //修正相对湿度及温度
temp=temp_val.f*10