設計成果,SHT11的溫濕度控制下面是仿真原理圖:
單片機源程序部分預覽:
- #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;
- humi=humi_val.f*10;
- GotoXY(0,0); //選擇溫度顯示位置
- Print("Temp: C"); //5格空格
- GotoXY(0,1); //選擇濕度顯示位置
- Print("Humi: %"); //5格空格
- GotoXY(5,0); //設置溫度顯示位置
- TEMP_data[0]=temp/1000+'0'; //溫度百位
- if (TEMP_data[0]==0x30)
- TEMP_data[0]=0x20;
- TEMP_data[1]=temp%1000/100+'0'; //溫度十位
- if (TEMP_data[1]==0x30 && TEMP_data[0]!=0x30)
- TEMP_data[1]=0x20;
- TEMP_data[2]=temp%100/10+'0'; //溫度個位
- TEMP_data[3]=0x2e; //小數點
- TEMP_data[4]=temp%10+'0'; //溫度小數點后第一位
- TEMP_data[5]=0xdf; //顯示溫度符號℃
- TEMP_data[6]='\0';
- Print(TEMP_data); //輸出溫度
- GotoXY(5,1); //設置濕度顯示位置
- HUMI_data[0]=humi/1000+'0'; //濕度百位
- if (HUMI_data[0]==0x30)
- HUMI_data[0]=0x20;
- HUMI_data[1]=humi%1000/100+'0'; //濕度十位
- HUMI_data[2]=humi%100/10+'0'; //濕度個位
- HUMI_data[3]='.' ; //小數點
- HUMI_data[4]=humi%10+'0'; //濕度小數點后第一位
- HUMI_data[5]='\0';
- Print(HUMI_data); //輸出濕度
- if ((temp/10)<temp_set)
- {
- led1=0; //加熱
- motor1=1;
- led2=1;
- motor2=0;
- if((temp/10)==temp_set)
- {
- led1=1;
- motor1=0;
- }
- }
- else if ((temp/10)>temp_set)
- {
- led2=0; //制冷
- motor2=1;
- led1=1;
- motor1=0;
- if ((temp/10)==temp_set)
- {
- led2=1;
- motor2=0;
- }
- }
- if ((humi/10)<humi_set)
- {
- led3=0; //加濕
- motor3=1;
- led4=1;
- motor4=0;
- if ((humi/10)==humi_set)
- {
- led3=1;
- motor3=0;
- }
- }
- else if ((humi/10)>humi_set)
- {
- led4=0; //干燥
- motor4=1;
- led3=1;
- motor3=0;
- if ((humi/10)==humi_set)
- {
- led4=1;
- motor4=0;
- }
- }
-
- } //else
- } //if
-
- if(presskeynum==1) //設定溫度時顯示的內容
- {
- show_temp[0]=temp_set/10+0x30;
- show_temp[1]=temp_set%10+0x30;
- show_temp[2]=0xdf;
- show_temp[3]='C';
- show_temp[4]='\0';
- GotoXY (0,0);
- Print("SET TEMP:");
- GotoXY (0,1);
- Print(show_temp);
-
- }
-
- if(presskeynum==2) //設定濕度時顯示的內容
- {
- show_humi[0]=humi_set/10+0x30;
- show_humi[1]=humi_set%10+0x30;
- show_humi[2]='%';
- show_humi[3]='\0';
- GotoXY (0,0);
- Print("SET HUMI:");
- GotoXY (0,1);
- Print(show_humi);
- }
-
-
- }//while
- } //mian
復制代碼
Keil2代碼與Proteus7.5仿真下載(注意版本):
1130.zip
(167.19 KB, 下載次數: 841)
2017-1-7 21:49 上傳
點擊文件名下載附件
Sht11
|