sbitkey1=P2^0; //接口定義
sbitkey2=P2^1;
sbitkey3=P2^2;
sbitbuzzer=P1^4;
sbitrelayF=P1^0;
sbitrelayJ=P1^1;
unsignedcharReadTempFlag=0;//定義讀時間標志
inttemp1; //溫度讀取值
floattemperature;//實際溫度
unsignedlongtime_20ms=0; //定時計數
unsignedchari;
xdataunsignedchardis0[16];//數據暫存
xdataunsignedchardis1[16];//數據暫存
xdataunsignedchardis2[16];//數據暫存
unsignedintsetR=5;//設置溫度
unsignedintsetF1=5;//設置濕度
unsignedintsetF2=5;
bitstartFlag=0;//開始運行
unsignedinttimeLater=0;//初始化時間
unsignedcharstep=0;//運行步驟
bitdisFlag=0;//顯示標志
unsignedcharSetFlag=0;//設置標志
voidInit_Timer0(void);//函數命令
voidCheckKey(void);
voiddealYunXing(void);
voidmain(void)
{
Init_Timer0();//定時器0初始化
relayF=0; //繼電器和蜂鳴器上電動作下方便檢測硬件
relayJ=0;
buzzer=0;
DelayMs(200);//延時有助于穩定
relayF=1;
relayJ=1;
buzzer=1;
LCD_Init();//初始化液晶
DelayMs(20);//延時有助于穩定
LCD_Clear();//清屏
while(1)//主循環
{
CheckKey();//按鍵處理
dealYunXing(); //運行過程
if(ReadTempFlag==1) //讀取溫度標志
{
ReadTempFlag=0;
temp1=ReadTemperature(); //讀取溫度
temperature=(float)temp1*0.0625; //溫度值轉換
sprintf(dis0,"T:%4.1fC",temperature);
LCD_Write_String(0,0,dis0);//顯示時間及溫度
}
if(disFlag==1)
{
disFlag=0;
sprintf(dis1,"J%02dA%02dB%02d",(int)setR,(int)setF1,(int)setF2);
LCD_Write_String(0,1,dis1); //初始化顯示
if(SetFlag==0)//按鍵設置標志
{
LCD_Write_Char(0,1,'');LCD_Write_Char(4,1,'');LCD_Write_Char(8,1,'');//更新顯示標志
}
elseif(SetFlag==1)//按鍵設置標志
{
LCD_Write_Char(0,1,'S');LCD_Write_Char(4,1,'');LCD_Write_Char(8,1,'');//更新顯示標志
}
elseif(SetFlag==2)//按鍵設置標志
{
LCD_Write_Char(0,1,'');LCD_Write_Char(4,1,'S');LCD_Write_Char(8,1,'');//更新顯示標志
}
elseif(SetFlag==3)//按鍵設置標志
{
LCD_Write_Char(0,1,'');LCD_Write_Char(4,1,'');LCD_Write_Char(8,1,'S');//更新顯示標志
}
if(step==0) //查看運行步驟
{
sprintf(dis2,"STP-%2.1f",(float)timeLater/10); //顯示
}
elseif(step==1) //查看運行步驟
{
sprintf(dis2,"JR-%2.1f",(float)timeLater/10); //顯示
}
elseif(step==2) //查看運行步驟
{
sprintf(dis2,"FS1-%2.1f",(float)timeLater/10); //顯示
}
elseif(step==3) //查看運行步驟
{
sprintf(dis2,"JR-%2.1f",(float)timeLater/10); //顯示
}
elseif(step==4) //查看運行步驟
{
sprintf(dis2,"FS2-%2.1f",(float)timeLater/10); //顯示
}
elseif(step==5) //查看運行步驟
{
sprintf(dis2,"JR-%2.1f",(float)timeLater/10); //顯示
}
LCD_Write_String(9,0,dis2);//顯示
}
}
}
voidCheckKey(void)
{
staticunsignedcharrekey=0;
if((key1==0)||(key2==0)||(key3==0)) //檢測到按鍵按下
{
DelayMs(10);//小抖動
if(rekey==0)
{
if(key1==0)//檢測是否按下
{
rekey=1;
SetFlag++;//設置標志
if(SetFlag>=4)SetFlag=0;
}
elseif(key2==0)//設置值鍵
{
rekey=1;
if(SetFlag==1)//處于設置1
{
if(setF1>0)
{setR=setR-1;}
}
elseif(SetFlag==2)//處于設置2
{
if(setF1>0)
{setF1=setF1-1;}
}
elseif(SetFlag==3)//處于設置3
{
if(setF2>0)
{setF2=setF2-1;}
}
}
elseif(key3==0)//設置值鍵
{
rekey=1;
if(SetFlag==1)//處于設置1
{
if(setR<10)
{setR=setR+1;}
}
elseif(SetFlag==2)//處于設置2
{
if(setF1<10)
{setF1=setF1+1;}
}
elseif(SetFlag==3)//處于設置3
{
if(setF2<10)
{setF2=setF2+1;}
}
else
{
startFlag=1;//開始運行
timeLater=setR*10;//初始化時間
step=1;//運行步驟
relayF=1;
relayJ=0;
}
}
}
}
else
{
rekey=0;//防止重復檢測到按鍵
}
}
voiddealYunXing(void)
{
if(startFlag==1)//啟動過程中
{
if(timeLater==0)
{
buzzer=0;//報警
DelayMs(100);
buzzer=1;
if(step==1)
{
step=2;//運行步驟
timeLater=setF1*10;//初始化時間
relayF=0;//粉碎
relayJ=1;
}
elseif(step==2)
{
step=3;//運行步驟
timeLater=setR*10;//初始化時間
relayF=1;//粉碎
relayJ=0;//加熱
}
elseif(step==3)
{
step=4;//運行步驟
timeLater=setF2*10;//初始化時間
relayF=0;//粉碎
relayJ=1;
}
elseif(step==4)
{
step=5;//運行步驟
timeLater=setR*10;//初始化時間
relayF=1;//粉碎
relayJ=0;//加熱
}
elseif(step==5)
{
step=0;//運行步驟
timeLater=0;//初始化時間
startFlag=0;//開始標志清空
relayF=1;//粉碎
relayJ=1;//加熱
}
}
}
}
voidInit_Timer0(void)
{
TMOD|=0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH0=(65536-20000)/256; //重新賦值20ms
TL0=(65536-20000)%256;
EA=1;//總中斷打開
ET0=1;//定時器中斷打開
TR0=1;//定時器開關打開
}
voidTimer0_isr(void)interrupt1
{
TH0=(65536-20000)/256; //重新賦值20ms
TL0=(65536-20000)%256;
time_20ms++;
time_20ms++;
if(time_20ms%5==0)
{
disFlag=1;
if(timeLater>0)timeLater--;
if(time_20ms%50==0)
{
ReadTempFlag=1; //定時發送數據
}
}
}
|