為什么實現不了上面的功能,求解
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define GPIO_KEY P1
#define GPIO_DIG P0
sbit LSC=P2^4;
sbit LSB=P2^3;
sbit LSA=P2^2;
sbit dht11=P3^7;
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^5;
sbit LED4=P2^6;
u8 table_dht11[5]={1,2,3,4,5};
u16 wendu;
u16 shidu;
u8 dingshi;
u8 Displaydata[7];
u8 KeyValue;
u8 mode;
u8 temph1,temph2,humih1,humih2,ssec,sec,min=12;
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void delay(u16 i)
{
while(i--);
}
void Timer0Init()
{
TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
TH0=0Xd8; //給定時器賦初值,定時10ms
TL0=0Xf0;
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時器
}
void weixian(void)
{
u8 i;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;break;
case 1:LSA=1;LSB=0;LSC=0;break;
case 2:LSA=0;LSB=1;LSC=0;break;
case 3:LSA=1;LSB=1;LSC=0;break;
case 4:LSA=0;LSB=0;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
}
P0=Displaydata[ i];
delay(100);
P0=0x00;
}
}
void xianshi(void)
{
Displaydata[0]=smgduan[wendu/100];
Displaydata[1]=smgduan[(wendu%100)/10]+0x80;
Displaydata[2]=smgduan[(wendu%100)%10];
Displaydata[3]=smgduan[shidu/100];
Displaydata[4]=smgduan[(shidu%100)/10]+0x80;
Displaydata[5]=smgduan[(shidu%100)%10];
Displaydata[6]=smgduan[min/10];
Displaydata[7]=smgduan[min%10];
}
void keydown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
delay(1000);
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
}
}
while((a<50)&&(GPIO_KEY!=0xf0))
{
delay(100);
a++;
}
}
void Timer0() interrupt 1
{
TH0=0Xd8; //給定時器賦初值,定時10ms
TL0=0Xf0;
ssec++;
if(ssec>=100) //1s
{
ssec=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
}
}
}
}
void dst11(void)
{
u8 i,j;
dht11 = 0;
delay(5);
dht11 = 1;
delay(4); //50us
if(dht11 == 0) //判斷是否響應 0 為響應
{
while(dht11 == 0);
while(dht11 == 1); //等待響應時間過完
for(i=0;i<5;i++)
{
for(j=0;j<8;j++)
{
table_dht11[ i] <<= 1;
while(dht11 == 1);
delay(4); //50us 數據1的高電平時間為110us 低為27us
if(dht11 == 1)
{
table_dht11[ i] |= 0x01;
while(dht11 == 1); //等待響應時間過完
}
}
}
}
dht11 = 1;
}
void key_pros(void) //按鍵處理函數
{
if(KeyValue==3)
{
mode++;
if(mode==3)
mode=0;
weixian(); //初始化
}
if(mode==1) //對溫度上\下限設定
{
if(KeyValue==0)
{
temph1++;
if(temph1>=30)
temph1=30;
}
if(KeyValue==1)
{
temph2--;
if(temph2<=26)
temph2=26;
}
}
if(mode==2) //對濕度上\下限設定
{
if(KeyValue==4) //加
{
humih1++;
if(humih1>=80)humih1=80;
}
if(KeyValue==5) //減
{
humih2--;
if(humih2<=60)humih2=60;
}
}
if(mode==3) //對定時上下限設定
{
if(KeyValue==8) //加
{
min++;
if(min>=12)min=12;
}
if(KeyValue==9) //減
{
min--;
if(min<=0)min=0;
}
}
}
void clock_h_l(void)
{
if((table_dht11[2] >= temph1))
{
LED1= 0; //打開指示燈
}
else
{
LED1= 1; //關閉指示燈
}
if((table_dht11[2] <= temph2))
{
LED2 = 0; //打開指示燈
}
else
{
LED2= 1; //關閉指示燈
}
if((table_dht11[0] >=humih1))
{
LED3= 0; //打開指示燈
}else
{
LED3= 1; //關閉指示燈
}
if((table_dht11[0] <=humih1))
{
LED4= 0; //打開指示燈
}else
{
LED4= 1; //關閉指示燈
}
if((table_dht11[4]==0))
{
LED1=0;
LED2=0;
LED3=0;
LED4=0;
}
}
void main(void)
{
while(1)
{
Timer0Init();
keydown();
dst11();
key_pros();
clock_h_l();
weixian();
xianshi();
GPIO_DIG=smgduan[KeyValue];
}
}
|