{ Nhumi+=1; //按下一次,湿度数值加1
if(Nhumi>=99) {Nhumi=99;}
write_eeprom(); //保存数据,写数据到单片机内部的eeprom中
S_Temp=Nhumi;
set_temp();}}} //调用湿度设置函数
if(!K3) //按下减按键
{ delay_1ms(80); if(!K3) { //光线 if(yemian==1)
{ Nlight-=1; //每按下一次,数值减1
if(Nlight<=1) {Nlight=1;}
write_eeprom(); //保存数据,写数据到单片机内部的eeprom中
Light=Nlight*100; set_light();}
//温度 if(yemian==2)
{ Ntemp-=1; //每按下一次,数值减1
if(Ntemp<=1) {Ntemp=1;}
write_eeprom(); //保存数据,写数据到单片机内部的eeprom中
S_Temp=Ntemp; set_temp();}
//湿度 if(yemian==3)
{ Nhumi-=1; //每按下一次,数值减1
if(Nhumi<=1) {Nhumi=1;}
write_eeprom(); //保存数据,写数据到单片机内部的eeprom中
S_Temp=Nhumi;
31
set_temp();}}}}
4.3.2数据采集模块
系统元件和端口初始化完成,系统稳定之后,开始监测温湿度及光照度,并在LCD1602液晶显示屏上显示温湿度及光照度。 (1)温湿度监测的核心代码如下:
void receive() //接收数据
{ uchar T_H,T_L,R_H,R_L,check,num_check;//定义各参数的高八位、低八位 uchar count;
start(); //开始信号 io=1;
if(!io) //读取DHT11响应信号
{ count=2;
while((!io)&&count++); //DHT11高电平80us是否结束 count=2;
while((!io)&&count++); //DHT11高电平80us是否结束 T_H=receive_byte(); T_L=receive_byte(); check=receive_byte();
io=0; //拉低延时50us delay1();delay1();delay1();delay1();delay1(); io=1;
num_check=R_H+R_L+T_H+T_L; if(num_check=check) { RH=R_H; RL=R_L; TH=T_H; TL=T_L;
check=num_check;}}}
32
(2)光照度监测的核心代码如下:
void Single_Write_BH1750(uchar REG_Address) { BH1750_Start(); //起始信号 BH1750_SendByte(REG_Address); //内部寄存器地址, BH1750_SendByte(REG_data); //内部寄存器数据, BH1750_Stop(); } //发送停止信号 //连续读出BH1750内部数据 void Multiple_read_BH1750(void) { uchar i;
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress+8); //发送设备地址+读信号 for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF { BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据 if (i == 3)
{ BH1750_SendACK(1);} //最后一个数据需要回NOACK else{BH1750_SendACK(0); } } //回应ACK BH1750_Stop(); //停止信号 Delay5ms();} 4.3.3 数据接收与显示模块
当系统建立连接之后,接收并显示温湿度和光照度,下面分别介绍温湿度和光照度数据的接收与显示。 (1)温湿度数据接收与显示
单片机控制温湿度传感器监测环境的温湿度并进行分析和处理,结果显示在LCD1602液晶显示屏上,该模块的核心代码如下: void show_dht11()
{ receive(); //调用温湿度采集函数
DisplayOneChar(3,0,RH/10+'0'); //显示湿度数据 DisplayOneChar(4,0,RH+'0');
33
DisplayOneChar(11,0,TH/10+'0'); //显示温度数据 DisplayOneChar(12,0,TH+'0');}
(2)光照度数据接收与显示
单片机控制光照度传感器监测环境的光照强度并进行分析和处理,结果显示在LCD1602液晶显示屏上,该模块的核心代码如下: void working()
{ Single_Write_BH1750(0x01); // power on
Single_Write_BH1750(0x10); // H- resolution mode
Multiple_Read_BH1750(); //连续读出数据,存储在BUF中 dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1]; //合成数据,即光照数据 temp=(float)dis_data/1.2;
conversion(temp); //计算数据和显示 DisplayOneChar(7,1,wan); //显示数据 DisplayOneChar(8,1,qian); DisplayOneChar(9,1,bai); DisplayOneChar(10,1,shi); DisplayOneChar(11,1,ge); } 4.3.4 指示灯与继电器模块
当监测的温度、湿度和光照度不在预先设置的范围值时,相应的指示灯亮起,继电器驱动风扇和加湿器开始工作。 void baojing() { //control_temp
if(temp<=Nlight*100 )
{ control_light=0;}//如果监测的光照度小于设置的光照度,光线不足指示灯亮
if(temp>Nlight*100 )
{ control_light=1;}//如果监测的光照度大于设置的光照度,光线不足指示不亮
if(TH>=Ntemp )
34