根據(jù)DTH11傳感器來記錄溫濕度數(shù)據(jù),并以此來控制4個不同的繼電器,達到控制不同負載來調(diào)節(jié)溫濕度的目的
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
制作出來的實物圖如下:
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <absacc.h>
- #include <math.h> //包含頭文件
-
- #define uchar unsigned char
- #define uint unsigned int //宏定義
- //定義四個輸出端口
- sbit Led_jiashi=P3^6; //加濕
- sbit Led_qushi=P3^4; //去濕
- sbit Led_jiangwen=P3^2; //降溫
- sbit Led_shengwen=P3^3; //升溫
- //定義三個設(shè)置按鍵
- sbit Key_SET = P2^0; //設(shè)置按鍵
- sbit Key_ADD = P2^1; //加按鍵
- sbit Key_SUB = P2^2; //減按鍵
- sbit Key_OK = P2^3; //確定按鍵
- //定義24C02數(shù)據(jù)口
- sbit SCL = P1^0;
- sbit SDA = P1^1;
- //定義DHT11數(shù)據(jù)口
- sbit DATA = P1^7;
- sbit buzz=P3^5; //蜂鳴器接口
- //定義LCD1602端口
- sbit E=P1^3; //1602使能引腳
- //sbit RW=P2^6; //1602讀寫引腳 我們只需要向液晶里寫數(shù)據(jù),不需要讀取數(shù)據(jù),所以就把讀寫引腳直接接地,程序里就不用單獨控制了
- sbit RS=P1^2; //1602數(shù)據(jù)/命令選擇引腳
- //定義全局變量
- uchar U8FLAG,U8temp,U8comdata,U8RH_data_H_temp,U8RH_data_L_temp,U8T_data_H_temp,U8T_data_L_temp,U8checkdata_temp; //定義讀取溫濕度變量
- uchar U8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L,U8checkdata;
- uchar Mode,humidity,temperature; //設(shè)置模式、讀取到的濕度溫度數(shù)據(jù)存儲變量
- char TH,TL,HH,HL; //溫濕度的上下限變量
- bit bdata FlagStartRH,hot,cold,humid,dry,BJ; //開啟轉(zhuǎn)換溫濕度標志位、熱冷濕干和報警變量
- //定時器0初始化
- void Timer0_Init()
- {
- ET0 = 1; //允許定時器0中斷
- TMOD = 0x11; //定時器工作方式選擇
- TL0 = 0xb0;
- TH0 = 0x3c; //定時器賦予初值50ms
- TR0 = 1; //啟動定時器T0
- }
- //定時器0中斷
- void Timer0_ISR (void) interrupt 1 using 0
- {
- uchar RHCounter; //定義計數(shù)變量
- TL0 = 0xb0;
- TH0 = 0x3c; //定時器賦予初值
- RHCounter++; //每進一次中斷就是50ms,此變量加一
- if(RHCounter%10==0&&BJ==1) //加到10的整數(shù)倍,并且報警標志位為1
- buzz=!buzz; //開啟報警,每500ms蜂鳴器引腳取反一次,就是蜂鳴器一秒響一次
- else if(BJ==0) //報警標志位為0時
- buzz=1; //關(guān)閉報警
- //每2秒鐘啟動一次溫濕度轉(zhuǎn)換
- if (RHCounter >= 40) //計數(shù)到40次,就是2s,啟動一次溫濕度轉(zhuǎn)換
- {
- FlagStartRH = 1; //啟動轉(zhuǎn)換變量置1
- RHCounter = 0; //計數(shù)變量清零
- }
- }
- /*以下程序為24c02的程序,都是官方的實例程序,可以參考時序圖理解,都是固定的*/
- /*********************************
- BASE DRIVE
- **********************************/
- void DELAY(unsigned int t) //延時函數(shù)
- {
- while(t!=0)
- t--;
- }
- /******************************
- IIC DRIVE
- ******************************/
- void IICStart(void) //24c02的開始函數(shù),關(guān)于24c02的函數(shù)多看下24c02的手冊
- {
- SCL=0; //SCL引腳拉低
- DELAY(1); //短延時
- SDA=1; SCL=1; DELAY(1); //SDA拉高,SCL拉高,短延時
- SDA=0; DELAY(1); //SDA拉低,短延時
- SCL=0; //SCL拉低
- }
- void IICStop(void) //停止
- {
- SDA=0;SCL=1; DELAY(1); //注釋略
- SDA=1; DELAY(1);
- SCL=0;
- }
- void SEND0(void) //發(fā)送
- {
- SDA=0;
- SCL=1;
- DELAY(1);
- SCL=0;
- }
- void SEND1(void)
- {
- SDA=1;
- DELAY(1);
- SCL=1;
- DELAY(1);
- SCL=0;
- }
- bit Check_Ack(void) //應(yīng)答
- {
- unsigned char errtime=250; //定義變量
- DELAY(1);
- SCL=1;
- DELAY(1);
- CY=SDA; //SDA引腳高電平就是1,低電平就是0,賦值給CY
- while(CY) //如果CY為1,就執(zhí)行此while
- {
- errtime--; //變量減
- CY=SDA; //賦值
- if (!errtime) //判斷有沒有減到0
- {
- IICStop(); //停止24C02
- return 1; //返回1
- }
- }
- DELAY(1);
- SCL=0;
- return 0;
- }
- void Write_byte(unsigned char dat)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- if((dat<<i)&0x80)
- SEND1();
- else
- SEND0();
- }
- }
- unsigned char Read_byte(void)
- {
- unsigned char i,temp=0;
- for(i=0;i<8;i++)
- {
- SDA=1;
- SCL=1;
- DELAY(1);
- if(SDA==1)
- {
- temp=temp<<1;
- temp=temp|0x01;
- }
- else
- temp=temp<<1;
- SCL=0;
- }
- return temp;
- }
- /************************************
- EEPROM DRIVE
- Addr:from 0x00-->
- *************************************/
- unsigned char rdeeprom(unsigned char addr)
- {
- unsigned char temp=0;
- bit flag=0;
- IICStart();
- Write_byte(0xa0);
- Check_Ack();
- Write_byte(addr);
- Check_Ack();
- IICStart();
- Write_byte(0xa1);
- Check_Ack();
- temp=Read_byte();
- SEND1();
- IICStop();
- return temp;
- }
-
-
- void wrteeprom(unsigned char addr,unsigned char dat)
- {
- IICStart();
- Write_byte(0xa0);
- Check_Ack();
- Write_byte(addr);
- Check_Ack();
- Write_byte(dat);
- Check_Ack();
- IICStop();
- }
- /*以下程序為DHT11溫濕度傳感器程序,官方的實例程序*/
- void Delay1(uint j) //延時程序
- {
- uchar i;
- for(;j>0;j--)
- {
- for(i=0;i<27;i++);
- }
- }
- void Delay_10us(void) //延時函數(shù),大約10us,不精確
- {
- uchar i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- void COM(void) //讀取溫濕度函數(shù)
- {
- uchar 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++);
- //超時則跳出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-----
- //----校驗 8位 == U8checkdata-----
- //----調(diào)用相關(guān)子程序如下----------
- //---- Delay();, Delay_10us();,COM();
- //--------------------------------
- uchar RH(void)
- {
- //主機拉低18ms
- DATA=0;
- Delay1(180); //原來為5
- DATA=1;
- //總線由上拉電阻拉高 主機延時20us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主機設(shè)為輸入 判斷從機響應(yīng)信號
- DATA=1;
- //判斷從機是否有低電平響應(yīng)信號 如不響應(yīng)則跳出,響應(yīng)則向下運行
- if(!DATA) //T !
- {
- U8FLAG=2;
- //判斷從機是否發(fā)出 80us 的低電平響應(yīng)信號是否結(jié)束
- while((!DATA)&&U8FLAG++);
- U8FLAG=2;
- //判斷從機是否發(fā)出 80us 的高電平,如發(fā)出則進入數(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ù)校驗
- 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;
- }
- return 1;
- }
- else //傳感器不響應(yīng)
- {
- return 0;
- }
- }
- /********************************************************************
- * 文件名 : 液晶1602顯示.c
- * 描述 : 該程序?qū)崿F(xiàn)了對液晶1602的控制。
- ***********************************************************************/
- /********************************************************************
- * 名稱 : delay()
- * 功能 : 延時,延時時間大概為140US。
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void delay()
- {
- int i,j;
- for(i=0; i<=10; i++)
- for(j=0; j<=2; j++);
- }
-
- /********************************************************************
- * 名稱 : enable(uchar del)
- * 功能 : 1602命令函數(shù)
- * 輸入 : 輸入的命令值
- * 輸出 : 無
- ***********************************************************************/
- void enable(uchar del)
- {
- P0 = del; //數(shù)據(jù)發(fā)送到P0口
- RS = 0; //RS引腳拉低
- E = 1; //E引腳高電平
- delay(); //延時
- E = 0; //E引腳低電平
- delay(); //延時
- }
- /********************************************************************
- * 名稱 : write(uchar del)
- * 功能 : 1602寫數(shù)據(jù)函數(shù)
- * 輸入 : 需要寫入1602的數(shù)據(jù)
- * 輸出 : 無
- ***********************************************************************/
- void write(uchar del)
- {
- P0 = del; //同上
- RS = 1;
- E = 1;
- delay();
- E = 0;
- delay();
- }
- /********************************************************************
- * 名稱 : L1602_init()
- * 功能 : 1602初始化,請參考1602的資料
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void L1602_init(void)
- {
-
- enable(0x38); //設(shè)置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)
- enable(0x0c); //開顯示不顯示光標
- enable(0x06); //整屏不移動,光標自動右移
- enable(0x01); //清屏
- }
- /********************************************************************
- * 名稱 : L1602_char(uchar hang,uchar lie,char sign)
- * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符顯示"b" ,調(diào)用該函數(shù)如下
- L1602_char(1,5,'b')
- * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
- * 輸出 : 無
- ***********************************************************************/
- void L1602_char(uchar hang,uchar lie,char sign)
- {
- uchar a; //定義變量
- if(hang == 1) a = 0x80; //如果hang變量為1,讓地址數(shù)據(jù)為0x80就是第一行的
- if(hang == 2) a = 0xc0; //如果hang變量為0,讓地址數(shù)據(jù)為0xc0就是第二行的
- a = a + lie - 1; //列數(shù)據(jù)減一,因為液晶屏的列是從0開始的
- enable(a); //發(fā)送行和列數(shù)據(jù)
- write(sign); //寫顯示內(nèi)容
- }
- /********************************************************************
- * 名稱 : L1602_string(uchar hang,uchar lie,uchar *p)
- * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
- L1602_string(1,5,"ab cd ef;")
- * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
- * 輸出 : 無
- ***********************************************************************/
- void L1602_string(uchar hang,uchar lie,uchar *p)
- {
- uchar a;
- if(hang == 1) a = 0x80; //第一行地址
- if(hang == 2) a = 0xc0; //第二行地址
- a = a + lie - 1; //行和列數(shù)據(jù)加一起
- enable(a); //發(fā)送行列數(shù)據(jù)
- while(1) //進入循環(huán)
- {
- if(*p == '\0') break; //發(fā)送完字符串后跳出while循環(huán)
- write(*p); //沒發(fā)送完就繼續(xù)發(fā)
- p++; //字符串指針地址加1
- }
- }
- //顯示整型的溫濕度數(shù)據(jù)用,共占用4位,其中一位符號位
- void L1602_int(uchar hang, uchar lie, int num)
- {
- uint temp;
- uint gewei,shiwei,baiwei,sign;
- if (num >= 0) //如果溫度值大于等于0
- sign = 0; //符號為正
- else //反之
- sign = 1; //符號為負
- temp = abs(num); //溫度值取絕對值
- baiwei = temp / 100; //除以100得到溫度值百位
- temp = temp - baiwei*100; //溫度值減去百位得到十位和個位的數(shù)
- shiwei = temp / 10; //除以10得到十位的數(shù)據(jù)
- gewei = temp - shiwei*10; //減去十位的數(shù)據(jù)得到個位的數(shù)
- num = abs(num); //溫度取絕對值
- if (num>=100) //如果溫度大于100
- {
- // L1602_char(hang, lie+1, baiwei+48);
- L1602_char(hang, lie+2, shiwei+48); //顯示十位和個位
- L1602_char(hang, lie+3, gewei+48);
- }
- else if (num>=10) //溫度大于10
- {
- if (sign == 1) //負數(shù)時
- L1602_char(hang, lie+1, '-'); //顯示負號
- L1602_char(hang, lie+2, shiwei+48); //顯示十位和個位數(shù)
- L1602_char(hang, lie+3, gewei+48);
- }
- else //溫度小于10
- {
- if (sign == 1) //負數(shù)時
- L1602_char(hang, lie+2, '-'); //顯示負號
- else //正數(shù)
- L1602_char(hang, lie+2, ' '); //十位不顯示
- L1602_char(hang, lie+3, gewei+48); //顯示個位數(shù)
- }
- }
- void display() //顯示函數(shù)
- {
- if(Mode==0) //不是設(shè)置狀態(tài)
- {
- L1602_int(1,3,temperature); //顯示溫度數(shù)據(jù)
- L1602_char(1,7,0xdf); //顯示攝氏度的°
- L1602_int(1,12,humidity); //顯示濕度數(shù)據(jù)
- if(hot==1&&cold==0&&humid==0&&dry==0) //溫度過高
- {L1602_string(2,1," It's very hot! ");BJ=1;} //顯示熱 ,報警
- else if(hot==1&&cold==0&&humid==1&&dry==0) //溫度高,濕度高
- {L1602_string(2,1," Hot and humid! ");BJ=1;} //顯示熱 ,濕, 報警
- else if(hot==1&&cold==0&&humid==0&&dry==1) //溫度高 ,濕度低
- {L1602_string(2,1," Hot and dry! ");BJ=1;} //顯示熱 ,干, 報警
- else if(hot==0&&cold==1&&humid==0&&dry==0) //溫度低
- {L1602_string(2,1," It's very cold!");BJ=1;} //顯示冷 ,報警
- else if(hot==0&&cold==1&&humid==1&&dry==0) //溫度低 ,濕度高
- {L1602_string(2,1," Cold and humid!");BJ=1;} //顯示冷 ,濕,報警
- else if(hot==0&&cold==1&&humid==0&&dry==1) //溫度低 ,濕度低
- {L1602_string(2,1," Cold and dry! ");BJ=1;} //顯示冷 ,干,報警
- else if(hot==0&&cold==0&&humid==1&&dry==0) //濕度高
- {L1602_string(2,1,"It's very humid!");BJ=1;} //顯示潮濕,報警
- else if(hot==0&&cold==0&&humid==0&&dry==1) //濕度低
- {L1602_string(2,1," It's very dry! ");BJ=1;} //顯示干燥
- else if(hot==0&&cold==0&&humid==0&&dry==0) //都在范圍內(nèi)
- {L1602_string(2,1,"Good environment");BJ=0;} //顯示環(huán)境好,關(guān)閉報警
- }
- }
- /***按鍵函數(shù)***/
- void KEY() //按鍵函數(shù)
- {
- if(Key_SET==0) //設(shè)置按鍵按下
- {
- Delay1(200); //延時去抖
- if(Key_SET==0) //再次判斷按鍵按下
- {
- Mode++; //顯示位加
- TR0=0; //關(guān)閉定時器
- Led_shengwen=1;
- Led_jiangwen=1;
- Led_jiashi=1;
- Led_qushi=1; //關(guān)閉四路繼電器輸出
- hot=0;
- cold=0;
- humid=0;
- dry=0; //變量清零
- if(Mode==1) //設(shè)置第一個位置
- {
- L1602_string(1,1," TH: C HH: %"); //初始化設(shè)置界面,第一行顯示溫度和濕度上限
- L1602_char(1,8,0xdf); //顯示攝氏度的°
- L1602_string(2,1," TL: C HL: %"); //第二行顯示溫度和濕度的下限
- L1602_char(2,8,0xdf); //顯示攝氏度的°
- L1602_int(1,4,TH); //顯示溫度上限
- L1602_int(1,12,HH); //顯示濕度上限
- L1602_int(2,4,TL); //顯示溫度下限
- L1602_int(2,12,HL); //顯示濕度下限
- enable(0x80+6); //選中第一個位置閃爍
- enable(0x0f); //開啟閃爍
- }
- else if(Mode==2) //第二個位置
- {
- enable(0x80+0x40+6); //溫度上限位置閃爍
- enable(0x0f);
- }
- else if(Mode==3)
- {
- enable(0x80+14); //濕度上限位置閃爍
- enable(0x0f);
- }
- else if(Mode==4)
- {
- enable(0x80+0x40+14); //濕度下限位置閃爍
- enable(0x0f);
- }
- else if(Mode>=5) //設(shè)置完最后一位,回到第一位
- {
- Mode=1; //回到第一位置
- enable(0x80+6); //第一個位置閃爍
- enable(0x0f);
- }
- while(!Key_SET); //按鍵釋放
- }
- }
- else if(Key_ADD==0) //加按鍵
- {
- Delay1(200);
- if(Key_ADD==0)
- {
- if(Mode==1) //設(shè)置溫度上限
- {
- TH++; //溫度上限加
- if(TH>=100) //加到100
- TH=99; //賦值99,也就是最大能加到99
- L1602_int(1,4,TH); //顯示溫度上限
- enable(0x80+6); //因為送顯示數(shù)據(jù)了,閃爍的位置會自動右移,所以這里要指定要閃爍的位置
- wrteeprom(0,TH); //將上限值寫入AT24C02芯片
- }
- else if(Mode==2) //設(shè)置溫度下限
- {
- TL++; //加
- if(TL>=TH) //下限不能比上限高
- TL=TH-1; //下限只能加到比上限小一
- L1602_int(2,4,TL); //下面注釋同上,略
- enable(0x80+0x40+6);
- wrteeprom(1,TL);
- }
- else if(Mode==3)
- {
- HH++;
- if(HH>=100)
- HH=99;
- L1602_int(1,12,HH);
- enable(0x80+14);
- wrteeprom(2,HH);
- }
- else if(Mode==4)
- {
- HL++;
- if(HL>=HH)
- HL=HH-1;
- L1602_int(2,12,HL);
- enable(0x80+0x40+14);
- wrteeprom(3,HL);
- }
- while(!Key_ADD);
- }
- }
- else if(Key_SUB==0) //減按鍵
- {
- Delay1(200);
- if(Key_SUB==0)
- {
- if(Mode==1)
- {
- TH--;
- if(TH<=TL)
- TH=TL+1;
- L1602_int(1,4,TH);
- enable(0x80+6);
- wrteeprom(0,TH);
- }
- else if(Mode==2)
- {
- TL--;
- if(TL<=0)
- TL=0;
- L1602_int(2,4,TL);
- enable(0x80+0x40+6);
- wrteeprom(1,TL);
- }
- else if(Mode==3)
- {
- HH--;
- if(HH<=HL)
- HH=HL+1;
- L1602_int(1,12,HH);
- enable(0x80+14);
- wrteeprom(2,HH);
- }
- else if(Mode==4)
- {
- HL--;
- if(HL<=0)
- HL=0;
- L1602_int(2,12,HL);
- enable(0x80+0x40+14);
- wrteeprom(3,HL);
- }
- while(!Key_SUB);
- }
- }
- if(Key_OK==0&&Mode!=0) //確認按鍵
- {
- Delay1(200);
- if(Key_OK==0)
- {
- L1602_string(1,1,"Tem: C Hum: %"); //退出設(shè)置狀態(tài),恢復(fù)待機顯示界面
- L1602_string(2,1,"Good environment");
- Mode=0; //清零
- TR0=1; //打開定時器
- enable(0x0c); //光標不閃爍
- while(Key_OK==0); //按鍵釋放
- }
- }
- }
- //數(shù)據(jù)初始化
- void Data_Init()
- {
- Led_qushi = 1;
- Led_jiashi=1;
- Led_jiangwen = 1;
- Led_shengwen = 1; //熄滅四個繼電器
- }
- /********************************************************************
- * 名稱 : Main()
- * 功能 : 主函數(shù)
- ***********************************************************************/
- void main()
- {
- uint i, j, testnum;
- EA = 0; //關(guān)閉定時器
- Timer0_Init(); //定時器0初始化
- Data_Init(); //數(shù)據(jù)初始化
- EA = 1; //打開定時器
- L1602_init(); //液晶屏初始化
- L1602_string(1,1," Welcome to T&H ");
- L1602_string(2,1," Control System!"); //開機顯示界面
- //延時
- for (i=0;i<1000;i++) //延時
- for (j=0;j<100;j++)
- {;}
- /***載入溫度上限和濕度上限設(shè)定值***/
- TH=rdeeprom(0); //從AT24C02讀取溫度上限數(shù)據(jù)
- Delay1(20); //加延時可以存取穩(wěn)定
- TL=rdeeprom(1); //溫度下限
- Delay1(20);
- HH=rdeeprom(2); //濕度上限
- Delay1(20);
- HL=rdeeprom(3); //濕度下限
- Delay1(20);
-
- if(TH<=0&&TL<=0&&HH<=0&&HL<=0) //如果是新單片機,溫濕度數(shù)據(jù)都是小于0
- {
- wrteeprom(0,30); //那么就給溫濕度的報警值賦初值,30 20 60 50
- Delay1(20); //加延時可以存取穩(wěn)定
- TH=rdeeprom(0); //寫進去再讀出來
- Delay1(20); //加延時可以存取穩(wěn)定
- wrteeprom(1,20);
- Delay1(20); //加延時可以存取穩(wěn)定
- TL=rdeeprom(1);
- Delay1(20); //加延時可以存取穩(wěn)定
- wrteeprom(2,60);
- Delay1(20); //加延時可以存取穩(wěn)定
- HH=rdeeprom(2);
- Delay1(20); //加延時可以存取穩(wěn)定
- wrteeprom(3,50);
- Delay1(20); //加延時可以存取穩(wěn)定
- HL=rdeeprom(3);
- }
- //清屏
- L1602_string(1,1," ");
- L1602_string(2,1," ");
- L1602_string(1,1,"Tem: C Hum: %");
- L1602_string(2,1,"Good environment"); //顯示待機界面
-
- while(1) //進入while循環(huán)
- {
-
- if (FlagStartRH == 1) //溫濕度轉(zhuǎn)換標志檢查
- {
- TR0 = 0; //關(guān)閉定時器
- testnum = RH(); //讀取溫濕度
- FlagStartRH = 0; //轉(zhuǎn)換標志清零
- TR0 = 1; //打開定時器
- humidity = U8RH_data_H; //讀出濕度,只取整數(shù)部分
- temperature = U8T_data_H; //讀出溫度
-
- if(Mode==0) //溫濕度控制
- {
- if (temperature > TH) //溫度大于上限
- {
- Led_jiangwen = 0; //控制降溫繼電器打開
- hot=1; //溫度高變量置1
- Led_shengwen = 1; //升溫繼電器關(guān)閉
- cold=0; //溫度低變量置0
- // BJ=1;
- }
- else if(temperature<TL) //注釋同上,略
- {
- Led_shengwen = 0;
- cold=1;
- Led_jiangwen = 1;
- hot=0;
- buzz=0;
- // BJ=1;
- }
- else //溫度上下都不超限
- {
- Led_jiangwen=1;
- Led_shengwen=1;
- hot=0;
- cold=0;
- buzz=1;
- }
- if (humidity > HH)
- {
- Led_qushi = 0;
- humid=1;
- Led_jiashi = 1;
- dry=0;
- // BJ=1;
- }
- else if(humidity<HL)
- {
- Led_jiashi = 0;
- dry=1;
- Led_qushi = 1;
- humid=0;
- // BJ=1;
- }
- else //濕度上限都不超限
- {
- Led_qushi=1;
- Led_jiashi=1;
- humid=0;
- dry=0;
- }
- }
- else //所有數(shù)據(jù)都不超限
- {
- Led_shengwen=1;
- Led_jiangwen=1;
- Led_jiashi=1;
- Led_qushi=1; //關(guān)閉所有繼電器
- hot=0;
- cold=0;
- humid=0;
- dry=0; //變量清零
- BJ=0; //關(guān)閉報警
- }
- }
- display(); //調(diào)用顯示函數(shù)
- KEY(); //調(diào)用按鍵掃描函數(shù)
- }
- }
復(fù)制代碼
所有資料51hei提供下載(Proteus7.5版本的仿真+程序):
4個繼電器的溫濕度控制器.7z
(424.6 KB, 下載次數(shù): 171)
2021-3-8 16:05 上傳
點擊文件名下載附件
|