温室大棚温湿度监测
包keil程序和proteus仿真
单片机源程序如下:
- /*************************************************************************************/
-
- //主函数( main.c):
- #include<tou.h>
- #include<serial.h>
- typedef union //定义共用同类型
- {
- unsigned int i;
- float f;
- } value;
- idata unsigned int t=10;
- idata unsigned int h=30;
- //延时函数
- void delay(int z) //z 为毫秒数
- {
- int x,y;
- for(x=z;x>0;x--)
- for(y=125;y>0;y--);
- }
- void key(void)
- {
- uchar key1;
- temp0=1;
- temp1=1;
- humi0=1;
- humi1=1;
- if(temp0==0) t=t+1;
- if(temp1==0) t=t-1;
- if(humi0==0) h=h+1;
- if(humi1==0) h=h-1;
- temp0=1;
- temp1=1;
- humi0=1;
- humi1=1;
- key1=P3;
- key1=key1&0x3c;
- while(key1!=0x3c)
- {key1=P3;
- key1=key1&0x3c;}
- }
-
- void main()
- {
- unsigned int temp,humi;
- value humi_val,temp_val; //定义两个共同体,一个用于湿度,一个用于温度 //
- //float dew_point; //用于记录露点值
- unsigned char error; //用于检验是否出现错误
- unsigned char checksum; //CRC
- idata char dis_buf[]="温度:30.5C 湿度:30.3%RH\r\n" ;
- uchar wendu[6]; //用于记录温度
- uchar shidu[6]; //用于记录湿度
- LCD_Initial(); //初始化液晶
- GotoXY(0,0); //选择温度显示位置
- Print("TEMP: %C"); //5 格空格
- GotoXY(0,1); //选择湿度显示位置
- Print("HUMI: %RH"); //5 格空格
- s_connectionreset(); //启动连接复位
- EA=1;
- serial_init(9600) ;
- while(1)
- {
- set=1;
- 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); //修正相对湿度及温度 //
- //dew_point=calc_dewpoint(humi_val.f,temp_val.f); // 计算 e dew_point
- temp=temp_val.f*10;
- humi=humi_val.f*10; GotoXY(5,0); //设置温度显示位置
- if(set==1)
- {
- wendu[0]=temp/1000+'0'; //温度百位
- wendu[1]=temp%1000/100+'0'; //温度十位
- wendu[2]=temp%100/10+'0'; //温度个位
- wendu[3]=0x2E; //小数点
- wendu[4]=temp%10+'0'; //温度小数点后第一位
- Print(wendu); //输出温度
- GotoXY(5,1); //设置湿度显示位置
- shidu[0]=humi/1000+'0'; //湿度百位
- shidu[1]=humi%1000/100+'0'; //湿度十位
- shidu[2]=humi%100/10+'0'; //湿度个位
- shidu[3]=0x2E; //小数点
- shidu[4]=humi%10+'0'; //湿度小数点后第一位
- Print(shidu); //输出湿度
- dis_buf[6]=wendu[1] ;
- dis_buf[7]=wendu[2] ;
- dis_buf[8]=wendu[3] ;
- dis_buf[9]=wendu[4] ;
- dis_buf[18]=shidu[1] ;
- dis_buf[19]=shidu[2] ;
- dis_buf[20]=shidu[3] ;
- dis_buf[21]=shidu[4] ;
- if(serial_send_ok==1)
- serial_write_str(dis_buf) ;
- }
- if(set==0)
- {
- key();
- wendu[0]=t*10/1000+'0'; //温度百位
- wendu[1]=t*10%1000/100+'0'; //温度十位
- wendu[2]=t*10%100/10+'0'; //温度个位
- wendu[3]=0x2E; //小数点
- wendu[4]=t*10%10+'0'; //温度小数点后第一位
- Print(wendu); //输出温度
- GotoXY(5,1); //设置湿度显示位置
- shidu[0]=h*10/1000+'0'; //湿度百位
- shidu[1]=h*10%1000/100+'0'; //湿度十位
- shidu[2]=h*10%100/10+'0'; //湿度个位
- shidu[3]=0x2E; //小数点
- shidu[4]=h*10%10+'0'; //湿度小数点后第一位
- Print(shidu); //输出湿度
- }
- }
- if(temp>t*10)
- {
- jwBaojin=1;
- }
- else
- {
- jwBaojin=0;
- }
- //delay(800); //等待足够长的时间,以现行下一次转换
- if(temp<t*10-10)
- {
- swBaojin=1;
- }
- else
- {
- swBaojin=0;
- }
- //delay(800); //等待足够长的时间,以现行下一次转换
- if(humi<h*10)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
Sht11湿度测量仿真.rar
(392.33 KB, 下载次数: 186)
程序.docx
(19.5 KB, 下载次数: 104)
|