|
溫濕度檢測(cè)系統(tǒng)的源程序和原理圖,拿來和大家分享
原理圖
全部資料(壓縮包)下載:
溫濕度檢測(cè)系統(tǒng)資料.zip
(587.95 KB, 下載次數(shù): 82)
2016-4-24 13:57 上傳
點(diǎn)擊文件名下載附件
溫濕度檢測(cè)系統(tǒng)源程序和原理圖
下面是部分程序預(yù)覽(完整版本請(qǐng)下載本帖附件):
dht11程序
- #include "dht.h"
- U8 U8FLAG,k;
- U8 U8count,U8temp;
- U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
- U8 U8comdata;
- U8 count, count_r=0;
- void Delay1(U16 j)
- {
- U8 i;
- for(;j>0;j--)
- {
- for(i=0;i<27;i++);
- }
- }
- void Delay_10us(void)
- {
- U8 i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- void COM(void)
- {
- U8 i;
- for(i=0;i<8;i++)
- {
- U8FLAG=2;
- while((!DATA)&&U8FLAG++);
- Delay_10us();
- Delay_10us();
- Delay_10us();
- U8temp=0;
- if(DATA)U8temp=1;
- U8FLAG=2;
- while((DATA)&&U8FLAG++);
- //超時(shí)則跳出for循環(huán)
- if(U8FLAG==1)break;
- //判斷數(shù)據(jù)位是0還是1
-
- // 如果高電平高過預(yù)定0高電平值則數(shù)據(jù)位為 1
-
- U8comdata<<=1;
- U8comdata|=U8temp; //0
- }//rof
- }
- //--------------------------------
- //-----溫濕度讀取子程序 ------------
- //--------------------------------
- //----以下變量均為全局變量--------
- //----溫度高8位== U8T_data_H------
- //----溫度低8位== U8T_data_L------
- //----濕度高8位== U8RH_data_H-----
- //----濕度低8位== U8RH_data_L-----
- //----校驗(yàn) 8位 == U8checkdata-----
- //----調(diào)用相關(guān)子程序如下----------
- //---- Delay();, Delay_10us();,COM();
- //--------------------------------
- U8 RH(void)
- {
- //主機(jī)拉低18ms
- DATA=0;
- Delay1(180); //原來為5
- DATA=1;
- //總線由上拉電阻拉高 主機(jī)延時(shí)20us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
- DATA=1;
- //判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
- if(!DATA) //T !
- {
- U8FLAG=2;
- //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
- while((!DATA)&&U8FLAG++);
- U8FLAG=2;
- //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
- while((DATA)&&U8FLAG++);
- //數(shù)據(jù)接收狀態(tài)
- 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;
- DATA=1;
- //數(shù)據(jù)校驗(yàn)
- 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;
- }//fi
- return 1;
- }//fi
- else //傳感器不響應(yīng)
- {
- return 0;
- }
- }
復(fù)制代碼
溫濕度檢測(cè)系統(tǒng)dht11主程序:
- #include <reg52.h>
- #include <math.h>
- #include "1602.h"
- #include "dht.h"
- #include "DS1302.h"
- //定義管腳
- sbit Key_Up = P3^2;
- sbit Key_Down = P3^5;
- sbit Key_Set = P3^3;
- //定義標(biāo)識(shí)
- volatile bit FlagStartRH = 0; //開始溫濕度轉(zhuǎn)換標(biāo)志
- volatile bit FlagKeyPress = 0; //有鍵按下標(biāo)志
- volatile bit FlagAlert = 0; //報(bào)警狀態(tài)標(biāo)志
- volatile bit FlagReview = 0; //查詢標(biāo)志
- //定義溫濕度傳感器用外部變量
- extern U8 U8FLAG,k;
- extern U8 U8count,U8temp;
- extern U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- extern U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
- extern U8 U8comdata;
- extern U8 count, count_r;
- //溫濕度傳感器用變量
- U16 temp;
- S16 temperature, humidity;
- U16 RHCounter;
- //按鍵響應(yīng)用變量
- U8 keyvalue, keyUp, keyDown, keySet;
- U8 FlagSet;
- //DS1302時(shí)鐘用變量
- SYSTEMTIME CurrentTime;
- uchar year, month, day, hour, minute, second;
- //報(bào)警及存儲(chǔ)用變量
- //char * pSave;
- //字符串顯示用變量
- uchar str1[6] = "000000";
- uchar AlertDate[9]="00-00-00", AlertTime[9]="00:00:00";
- uchar hide;
- //
- //函數(shù)聲明
- void int2str(int x, char* str);
- void Delay1ms(unsigned int count);
- void Data_Init();
- void Timer0_Init();
- void Timer0_ISR () ;
- void KeyProcess(uint num);
- //整型轉(zhuǎn)字符串的函數(shù),轉(zhuǎn)換范圍0--65536
- void int2str(int x, char* str)
- {
- int i=1;
- int tmp=10;
- while(x/tmp!=0)
- {
- i++;
- tmp*=10;
- }
- tmp=x;
- str[i]='\0';
- while(i>1)
- {
- str[--i]='0'+(tmp%10);
- tmp/=10;
- }
- str[0]=tmp+'0';
- }
- void Delay1ms(unsigned int count)
- {
- unsigned int i,j;
- for(i=0;i<count;i++)
- for(j=0;j<120;j++);
- }
- //數(shù)據(jù)初始化
- void Data_Init()
- {
- RHCounter = 0;
- keyvalue = 0;
- keyUp = 1;
- keyDown = 1;
- keySet = 1;
- FlagSet = 0;
- hide = 0;
- AlertDate[8]='\0';
- AlertTime[8]='\0';
- }
- //定時(shí)器0初始化
- void Timer0_Init()
- {
- ET0 = 1; //允許定時(shí)器0中斷
- TMOD = 1; //定時(shí)器工作方式選擇
- TL0 = 0x06;
- TH0 = 0xf8; //定時(shí)器賦予初值
- TR0 = 1; //啟動(dòng)定時(shí)器
- }
- //定時(shí)器0中斷
- void Timer0_ISR (void) interrupt 1 using 0
- {
- TL0 = 0x06;
- TH0 = 0xf8; //定時(shí)器賦予初值
- //每2秒鐘啟動(dòng)一次溫濕度轉(zhuǎn)換
- RHCounter ++;
- if (RHCounter >= 450)
- {
- FlagStartRH = 1;
- RHCounter = 0;
- //設(shè)定閃爍標(biāo)志
- if (hide == 1) hide = 0;
- else hide = 1;
- }
- }
- void KeyProcess(uint num)
- {
- switch (num)
- {
- case 1: //Up鍵被按下
- switch (FlagSet)
- {
- case 0:
- case 1:
- break;
- case 2: //年
- if (year<99) year++;
- Write1302(0x8e,0x00); //寫入允許
- DS1302_SetTime(DS1302_YEAR,year);
- Write1302(0x8e,0x80); //禁止寫入
- break;
- case 3: //月
- if (month<12) month++;
- Write1302(0x8e,0x00); //寫入允許
- DS1302_SetTime(DS1302_MONTH,month);
- Write1302(0x8e,0x80); //禁止寫入
- break;
- case 4: //日
- if (day<31) day++;
- Write1302(0x8e,0x00); //寫入允許
- DS1302_SetTime(DS1302_DAY,day);
- Write1302(0x8e,0x80); //禁止寫入
- break;
- case 5: //時(shí)
- if (hour<23) hour++;
- Write1302(0x8e,0x00); //寫入允許
- DS1302_SetTime(DS1302_HOUR,hour);
- Write1302(0x8e,0x80); //禁止寫入
- break;
- case 6: //分
- if (minute<60) minute++;
- Write1302(0x8e,0x00); //寫入允許
- DS1302_SetTime(DS1302_MINUTE,minute);
- Write1302(0x8e,0x80); //禁止寫入
- break;
- case 7: //秒
- if (second<60) second++;
- Write1302(0x8e,0x00); //寫入允許
- DS1302_SetTime(DS1302_SECOND,second);
- Write1302(0x8e,0x80); //禁止寫入
- break;
- }
- break;
- case 2: //Down鍵被按下
- switch (FlagSet)
- {
- case 0:
- case 1:
- break;
- case 2: //年
- if (year>0) year--;
- Write1302(0x8e,0x00); //寫入允許
- DS1302_SetTime(DS1302_YEAR,year);
- Write1302(0x8e,0x80); //禁止寫入
- break;
- case 3: //月
- if (month>0) month--;
- Write1302(0x8e,0x00); //寫入允許
- DS1302_SetTime(DS1302_MONTH,month);
- Write1302(0x8e,0x80); //禁止寫入
- break;
- case 4: //日
- if (day>0) day--;
- Write1302(0x8e,0x00); //寫入允許
- DS1302_SetTime(DS1302_DAY,day);
- Write1302(0x8e,0x80); //禁止寫入
- break;
- case 5: //時(shí)
- if (hour>0) hour--;
- Write1302(0x8e,0x00); //寫入允許
- DS1302_SetTime(DS1302_HOUR,hour);
- Write1302(0x8e,0x80); //禁止寫入
- break;
- case 6: //分
- if (minute>0) minute--;
- Write1302(0x8e,0x00); //寫入允許
- DS1302_SetTime(DS1302_MINUTE,minute);
- Write1302(0x8e,0x80); //禁止寫入
- break;
- case 7: //秒
- if (second>0) second--;
- Write1302(0x8e,0x00); //寫入允許
- DS1302_SetTime(DS1302_SECOND,second);
- Write1302(0x8e,0x80); //禁止寫入
- break;
- }
- break;
- case 3: //Set鍵被按下。FlagSet 0-報(bào)警;1-關(guān)報(bào)警;2-設(shè)置年;3-月;4-日;5-時(shí);6-分;7-秒
- if (FlagReview==0) //只有不查詢時(shí)才能設(shè)定
- {
- FlagSet ++;
- if (FlagSet==1)
- {
- L1602_string(2,10," ");
- }
- else
- {
- L1602_string(2,10," ");
- }
- if (FlagSet>=8)
- {
- FlagSet = 0;
- }
- }
- break;
- default:
- break;
- }
- }
- /********************************************************************
- * 名稱 : Main()
- * 功能 : 主函數(shù)
- ***********************************************************************/
- void main()
- {
- U16 i, j, testnum;
- EA = 0;
- Timer0_Init(); //定時(shí)器0初始化
- Data_Init();
- Initial_DS1302();
- EA = 1;
- L1602_init();
- L1602_string(1,1," Welcome to my ");
- L1602_string(2,1," Infra Monitor! ");
- //延時(shí)
- for (i=0;i<1000;i++)
- for (j=0;j<1000;j++)
- {;}
- //清屏
- L1602_string(1,1," T C");
- L1602_string(2,1," H %");
-
- while(1)
- {
- //查詢報(bào)警信號(hào)
- //FlagSet=0為報(bào)警狀態(tài),
- //FlagSet=1為關(guān)報(bào)警狀態(tài),
- //FlagSet=2,3,4,5,6,7依次為設(shè)置年,月,日,時(shí),分,秒狀態(tài)
- if (FlagStartRH == 1)
- {
- //溫濕度轉(zhuǎn)換標(biāo)志檢查
- TR0 = 0;
- testnum = RH();
- FlagStartRH = 0;
- TR0 = 1;
- //讀出溫濕度,只取整數(shù)部分
- humidity = U8RH_data_H;
- temperature = U8T_data_H;
- //讀出日期時(shí)間值
- DS1302_GetTime(&CurrentTime);
- year = CurrentTime.Year;
- month = CurrentTime.Month;
- day = CurrentTime.Day;
- hour = CurrentTime.Hour;
- minute = CurrentTime.Minute;
- second = CurrentTime.Second;
- DateToStr(&CurrentTime);
- TimeToStr(&CurrentTime);
- //如果不處于查詢狀態(tài)則顯示當(dāng)前日期時(shí)間溫度濕度
- if (FlagReview==0)
- {
- //清屏
- L1602_string(1,1," T C");
- L1602_string(2,1," ");
- L1602_string(2,12,"H %");
- //顯示溫濕度
- if (temperature<0)
- {
- L1602_string(2,7,"-");
- }
- temperature = abs(temperature);
- int2str(temperature,str1);
- L1602_string(1,14,str1);
- int2str(humidity,str1);
- L1602_string(2,14,str1);
- L1602_string(1,1,CurrentTime.DateString);
- L1602_string(2,1,CurrentTime.TimeString);
- //產(chǎn)生時(shí)間設(shè)定時(shí)的閃爍效果,只在未查詢且閃爍標(biāo)志置位時(shí)運(yùn)行
- if (hide==1)
- {
- switch (FlagSet)
- {
- case 0:
- case 1:
- break;
- case 2: //年
- L1602_string(1,1," ");
- break;
- case 3: //月
- L1602_string(1,4," ");
- break;
- case 4: //日
- L1602_string(1,7," ");
- break;
- case 5: //時(shí)
- L1602_string(2,1," ");
- break;
- case 6: //分
- L1602_string(2,4," ");
- break;
- case 7: //秒
- L1602_string(2,7," ");
- break;
- default:
- break;
- }
- }
- }
- }
- //以下為鍵盤查詢,當(dāng)有按鍵從按下到彈起時(shí),該按鍵被響應(yīng)。
- if ((Key_Up)&&(keyUp==0)) {FlagKeyPress = 1; keyvalue = 1;}
- else if ((Key_Down)&&(keyDown==0)) {FlagKeyPress = 1; keyvalue = 2;}
- else if ((Key_Set)&&(keySet==0)) {FlagKeyPress = 1; keyvalue = 3;}
- if (FlagKeyPress == 1)
- {
- KeyProcess(keyvalue);
- FlagKeyPress = 0;
- }
- if (!Key_Up) keyUp = 0;
- else keyUp = 1;
- if (!Key_Down) keyDown = 0;
- else keyDown = 1;
- if (!Key_Set) keySet = 0;
- else keySet = 1;
- Delay1ms(100);
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|