主程序:
- #include "reg51.h"
- #include "DHT11.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit k1=P1^4;//按鈕
- sbit k2=P1^5;
- sbit k3=P1^6;
- sbit k4=P1^7;
- sbit out1=P2^4;//輸出控制
- sbit out2=P2^5;
- sbit out3=P2^6;
- sbit out4=P2^7;
- sbit led1=P3^4;//led
- sbit led2=P3^5;
- sbit led3=P3^6;
- sbit led4=P3^7;
- sbit beep=P1^0;//蜂鳴器
- sbit smg1=P2^0;//數(shù)碼管
- sbit smg2=P2^1;
- sbit smg3=P2^2;
- sbit smg4=P2^3;
- uchar code smgduan0[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示0~9,無小數(shù)點
- uchar code smgduan1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//顯示0~9,有小數(shù)點
- uchar time=0,mode=0;//系統(tǒng)變量
- uchar flag=0,time1=0;//顯示切換
- uchar lim1=20,lim2=30,lim3=30,lim4=80;//閥值
- //延時
- void delay(uint i)
- {
- while(i--);
- }
- void main()//主函數(shù)
- {
- uchar k=0;
- TMOD|=0X01;//初始化定時器
- TH0=0X3C;
- TL0=0XB0;
- ET0=1;//打開定時器0中斷允許
- EA=1;//打開總中斷
- TR0=1;//打開定時器
- while(1)
- {
- if(!k1 &&(k!=1))//設(shè)置
- {
- if(mode<4)
- mode++;
- else
- mode=0;
- k=1;
- }
- if(!k2 &&(k!=2))//加
- {
- switch(mode)
- {
- case 1:
- if(lim1<lim2)
- lim1++;
- break;
- case 2:
- if(lim2<99)
- lim2++;
- break;
- case 3:
- if(lim3<lim4)
- lim3++;
- break;
- case 4:
- if(lim4<99)
- lim4++;
- }
- k=2;
- }
- if(!k3 &&(k!=3))//減
- {
- switch(mode)
- {
- case 1:
- if(lim1>0)
- lim1--;
- break;
- case 2:
- if(lim2>lim1)
- lim2--;
- break;
- case 3:
- if(lim3>0)
- lim3--;
- break;
- case 4:
- if(lim4>lim3)
- lim4--;
- }
- k=3;
- }
- if(!k4)//OK
- {
- mode=0;
- }
- if(k1 && k2 && k3)
- k=0;
- //顯示
- if(mode==0)
- {
- if(flag==0)//顯示溫度
- {
- P0=0x01;
- smg1=0;
- delay(100);
- smg1=1;
- P0=smgduan0[dht11_dat[2]/10];
- smg3=0;
- delay(100);
- smg3=1;
- P0=smgduan0[dht11_dat[2]%10];
- smg4=0;
- delay(100);
- smg4=1;
- }
- else//顯示濕度
- {
- P0=0x08;
- smg1=0;
- delay(100);
- smg1=1;
- P0=smgduan0[dht11_dat[0]/10];
- smg3=0;
- delay(100);
- smg3=1;
- P0=smgduan0[dht11_dat[0]%10];
- smg4=0;
- delay(100);
- smg4=1;
- }
- }
- if(mode==1)//溫度下限
- {
- P0=smgduan0[1];
- smg1=0;
- delay(100);
- smg1=1;
- P0=smgduan0[lim1/10];
- smg3=0;
- delay(100);
- smg3=1;
- P0=smgduan0[lim1%10];
- smg4=0;
- delay(100);
- smg4=1;
- }
- if(mode==2)//溫度上限
- {
- P0=smgduan0[2];
- smg1=0;
- delay(100);
- smg1=1;
- P0=smgduan0[lim2/10];
- smg3=0;
- delay(100);
- smg3=1;
- P0=smgduan0[lim2%10];
- smg4=0;
- delay(100);
- smg4=1;
- }
- if(mode==3)//濕度下限
- {
- P0=smgduan0[3];
- smg1=0;
- delay(100);
- smg1=1;
- P0=smgduan0[lim3/10];
- smg3=0;
- delay(100);
- smg3=1;
- P0=smgduan0[lim3%10];
- smg4=0;
- delay(100);
- smg4=1;
- }
- if(mode==4)//濕度上限
- {
- P0=smgduan0[4];
- smg1=0;
- delay(100);
- smg1=1;
- P0=smgduan0[lim4/10];
- smg3=0;
- delay(100);
- smg3=1;
- P0=smgduan0[lim4%10];
- smg4=0;
- delay(100);
- smg4=1;
- }
- led1=out1;
- led2=out2;
- led3=out3;
- led4=out4;
- }
- }
- //定時器中斷
- void Timer0() interrupt 1
- {
- if(time<10)//0.5s
- time++;
- else
- {
- time=0;
- dht11_recive();//測量溫濕度
- if(dht11_dat[2]<lim1)//加熱
- out2=0;
- else
- out2=1;
- if(dht11_dat[2]>lim2)//散熱
- out1=0;
- else
- out1=1;
- if(dht11_dat[0]<lim3)//加濕
- out4=0;
- else
- out4=1;
- if(dht11_dat[0]>lim4)//除濕
- out3=0;
- else
- out3=1;
- beep=out1 && out2 && out3 && out4;
- //切換
- if(time1<6)
- time1++;
- else
- {
- time1=0;
- flag=!flag;
- }
- }
- TH0=0X3C;
- TL0=0XB0;
- }
復(fù)制代碼 |