|
#include<reg52.h>
#include <intrins.h> //庫文件
#include <math.h> //庫文件
#include <stdio.h> //庫文件
#include <1602.h> //lcd1602頭文件
#include <sht11.h> //sht11頭文件
#include <24c02.h> //24c02頭文件
#define uchar unsigned char
#define uint unsigned int
#define W_cmd 0xa0 //24c02寫指令
#define R_cmd 0xa1 //24c02讀指令
uchar temp,humi,gas; //定義溫度,濕度,氣體濃度
value humi_val,temp_val; //定義兩個共同體,一個用于濕度,一個用于溫度
uchar error; //檢驗(yàn)是否出現(xiàn)錯誤
uchar checksum; //CRC
uchar nn; //用于蜂鳴器
uchar TEMP_data[7]; //用于記錄實(shí)測的溫度
uchar HUMI_data[6]; //用于記錄實(shí)測的濕度
uchar show_temp[10]; //保存設(shè)定的溫度
uchar show_humi[8]; //保存設(shè)定的濕度
uchar show_gas[8]; //保存設(shè)定的氣體濃度
uchar idata temp_humi_gas_cache[12]; //溫濕度和氣體濃度設(shè)置緩存
uchar temp_high; //溫度上限變量
uchar temp_low; //溫度下限變量
uchar humi_high; //濕度上限變量
uchar humi_low; //濕度下限變量
uchar gas_high; //氣體濃度上限變量
uchar gas_low; //氣體濃度下限變量
uchar presskeynum; //按鍵次數(shù)變量
uchar code word1[]={" a product of "};
uchar code word2[]={"husijia"};
uchar code word3[]={" Welcome"};
sbit k1=P3^2; //選擇按鍵
sbit k2=P3^3; //增加按鍵
sbit k3=P3^4; //減小按鍵
sbit k4=P3^5; //確認(rèn)按鍵
sbit led1=P1^0; //溫度過低指示燈報(bào)警
sbit led2=P1^1; //溫度過高指示燈報(bào)警
sbit led3=P1^2; //濕度低于下限值,報(bào)警,加濕
sbit led4=P1^3; //濕度過高,報(bào)警,不調(diào)濕
sbit beep=P2^5; //定義蜂鳴器
sbit motor1=P1^4; //加熱電機(jī)
sbit motor2=P1^5; //降溫電機(jī)
sbit motor3=P1^6; //加濕電機(jī)
sbit motor4=P1^7; //干燥電機(jī)
sbit P2_6=P2^6;
/*************************************************************************/
//****************************延時(shí)函數(shù)************************************/
void delay(uint z) //z為毫秒數(shù)
{
int a,b;
for(a=z;a>0;a--)
for(b=120;b>0;b--);
}
/*************************************************************************/
//****************************按鍵函數(shù)************************************/
void key()
{
uchar m;
if (k1==0) //調(diào)整按鍵檢測
{
delay(10);
if (k1==0)
{
presskeynum++;
if(presskeynum==7)
presskeynum=0;
while(k1==0); //若一直按下,循環(huán)
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
}
}
if(presskeynum==1) //第一次按下溫度上限設(shè)置
{
if(k2==0) //數(shù)字加
{
delay(300); //延時(shí)
temp_high++;
if (temp_high>90)
temp_high=0;
if (temp_high<0)
temp_high=90;
while(k2==0); //按下后松開才做處理
}
if(k3==0) //數(shù)字減
{
delay(300);
temp_high--;
if (temp_high>90)
temp_high=0;
if (temp_high<0)
temp_high=90;
while(k3==0); //按下后松開才做處理
}
}
if(presskeynum==2) //第二次按下溫度下限設(shè)置
{
if(k2==0) //數(shù)字加
{
delay(300);
temp_low++;
if (temp_low>90)
temp_low=0;
if (temp_low<0)
temp_low=90;
while(k2==0);
}
if(k3==0) //數(shù)字減
{
delay(300);
temp_low--;
if (temp_low>90)
temp_low=0;
if (temp_low<0)
temp_low=90;
while(k3==0);
}
}
if(presskeynum==3) //第三次按下濕度上限設(shè)置
{
if(k2==0) //數(shù)字加
{
delay(300);
humi_high++;
if (humi_high>50)
humi_high=0;
if (humi_high<0)
humi_high=50;
while(k2==0);
}
if(k3==0) //數(shù)字減
{
delay(300);
humi_high--;
if (humi_high>50)
humi_high=0;
if (humi_high<0)
humi_high=50;
while(k3==0);
}
}
if(presskeynum==4) //第四次按下濕度下限設(shè)置
{
if(k2==0) //數(shù)字加
{
delay(300);
humi_low++;
if (humi_low>50)
humi_low=0;
if (humi_low<0)
humi_low=50;
while(k2==0);
}
if(k3==0) //數(shù)字減
{
delay(300);
humi_low--;
if (humi_low>50)
humi_low=0;
if (humi_low<0)
humi_low=50;
while(k3==0);
}
}
if(presskeynum==5) //第五次按下濃度上限設(shè)置
{
if(k2==0) //數(shù)字加
{
delay(300);
gas_high++;
if (gas_high>30) //因?yàn)榭諝庵卸趸颊急?.3%,氧氣濃度占比21%,故上限值減少至30
gas_high=0;
if (gas_high<0)
gas_high=30;
while(k2==0);
}
if(k3==0) //數(shù)字減
{
delay(300);
gas_high--;
if (gas_high>30)
gas_high=0;
if (gas_high<0)
gas_high=30;
while(k3==0);
}
}
if(presskeynum==6) //第六次按下濃度下限設(shè)置
{
if(k2==0) //數(shù)字加
{
delay(300);
gas_low++;
if (gas_low>30)
gas_low=0;
if (gas_low<0)
gas_low=30;
while(k2==0);
}
if(k3==0) //數(shù)字減
{
delay(300);
gas_low--;
if (gas_low>30)
gas_low=0;
if (gas_low<0)
gas_low=30;
while(k3==0);
}
}
if(k4==0)// 退出鍵
{
delay(10);
if(k4==0)
{
while(k4==0);
presskeynum=0;
temp_humi_gas_cache[0]=temp_high/10; //將設(shè)定的溫度上限值十位進(jìn)行緩存
temp_humi_gas_cache[1]=temp_high%10; //將設(shè)定的溫度上限值個位進(jìn)行緩存
temp_humi_gas_cache[2]=temp_low/10; //將設(shè)定的溫度下限值十位進(jìn)行緩存
temp_humi_gas_cache[3]=temp_low%10; //將設(shè)定的溫度下限值個位進(jìn)行緩存
temp_humi_gas_cache[4]=humi_high/10; //將設(shè)定的濕度上限值十位進(jìn)行緩存
temp_humi_gas_cache[5]=humi_high%10; //將設(shè)定的濕度上限值個位進(jìn)行緩存
temp_humi_gas_cache[6]=humi_low/10; //將設(shè)定的濕度下限值十位進(jìn)行緩存
temp_humi_gas_cache[7]=humi_low%10; //將設(shè)定的濕度下限值個位進(jìn)行緩存
temp_humi_gas_cache[8]=gas_high/10; //將設(shè)定的濃度上限值十位進(jìn)行緩存
temp_humi_gas_cache[9]=gas_high%10; //將設(shè)定的濃度上限值個位進(jìn)行緩存
temp_humi_gas_cache[10]=gas_low/10; //將設(shè)定的濃度下限值十位進(jìn)行緩存
temp_humi_gas_cache[11]=gas_low%10; //將設(shè)定的濃度下限值十位進(jìn)行緩存
for(m=0;m<=7;m++)
{
WriteIIC(W_cmd,0x00+m,temp_humi_gas_cache[m]); //設(shè)定值寫入24c02
}
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
}
}
}
/*************************************************************************/
//****************************主函數(shù)************************************/
void main()
{
uchar t;
k1=k2=k3=k4=1;
motor1=motor2=motor3=motor4=0; //4個執(zhí)行器初始化
P2_6=0;
for (t=0;t<12;t++)
temp_humi_gas_cache[t]=ReadIIC(W_cmd,0x00+t,R_cmd); //讀入24c02設(shè)定的值
temp_high=temp_humi_gas_cache[0]*10+temp_humi_gas_cache[1]; //溫度上限值=緩存0+緩存1
temp_low=temp_humi_gas_cache[2]*10+temp_humi_gas_cache[3]; //溫度下限值=緩存2+緩存3
humi_high=temp_humi_gas_cache[4]*10+temp_humi_gas_cache[5]; //濕度上限值=緩存4+緩存5
humi_low=temp_humi_gas_cache[6]*10+temp_humi_gas_cache[7]; //濕度下限值=緩存6+緩存7
gas_high=temp_humi_gas_cache[8]*10+temp_humi_gas_cache[9]; //濕度上限值=緩存8+緩存9
gas_low=temp_humi_gas_cache[10]*10+temp_humi_gas_cache[11]; //濕度下限值=緩存10+緩存11
LCD_Initial(); //液晶初始化
GotoXY(0,0);
Print_slow(word1); //lcd1602輸出word1內(nèi)容
GotoXY(0,1);
Print_slow(word2); //lcd1602輸出word2內(nèi)容
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
GotoXY(0,0);
Print_slow(word3); //lcd1602輸出word3內(nèi)容
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
/******************************************************************************************************/
while(1)
{
key();
if(presskeynum==0) //測量溫濕度
{
s_connectionreset(); //啟動連接復(fù)位
error=0; //初始化error=0,即沒有錯誤
error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //溫度測量
error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //濕度測量
if(error!=0) //發(fā)生錯誤
s_connectionreset(); //如果發(fā)生錯誤,系統(tǒng)復(fù)位
else
{
temp_val.f=(float)temp_val.i; //轉(zhuǎn)換為浮點(diǎn)數(shù)
humi_val.f=(float)humi_val.i; //轉(zhuǎn)換為浮點(diǎn)數(shù)
calc_sth10(&humi_val.f,&temp_val.f); //修正相對濕度及溫度
temp=temp_val.f*10;
humi=humi_val.f*10;
GotoXY(0,0); //選擇溫度顯示位置
Print("Temp: C"); //5格空格
GotoXY(0,1); //選擇濕度顯示位置
Print("Humi: %"); //5格空格
GotoXY(5,0); //設(shè)置溫度顯示位置
TEMP_data[0]=temp/1000+'0'; //溫度百位
if (TEMP_data[0]==0x30) //如果實(shí)測溫度百位為0
TEMP_data[0]=0x20; //第一個緩存為空格
TEMP_data[1]=temp%1000/100+'0'; //溫度十位
if (TEMP_data[1]==0x30 && TEMP_data[0]!=0x30) //如果實(shí)測溫度十位為0且第一個緩存為0
TEMP_data[1]=0x20; //第二個緩存為空格
TEMP_data[2]=temp%100/10+'0'; //溫度個位
TEMP_data[3]=0x2e; //小數(shù)點(diǎn)
TEMP_data[4]=temp%10+'0'; //溫度小數(shù)點(diǎn)后第一位
TEMP_data[5]=0xdf; //顯示溫度符號℃
TEMP_data[6]='\0';
Print(TEMP_data); //輸出溫度
GotoXY(5,1); //設(shè)置濕度顯示位置
HUMI_data[0]=humi/1000+'0'; //濕度百位
if (HUMI_data[0]==0x30) //如果實(shí)測濕度百位為0
HUMI_data[0]=0x20; //第一個緩存輸出為0
HUMI_data[1]=humi%1000/100+'0'; //濕度十位
HUMI_data[2]=humi%100/10+'0'; //濕度個位
HUMI_data[3]='.' ; //小數(shù)點(diǎn)
HUMI_data[4]=humi%10+'0'; //濕度小數(shù)點(diǎn)后第一位
HUMI_data[5]='\0';
Print(HUMI_data); //輸出濕度
if ((temp/10)<temp_low) //如果溫度小于設(shè)定最小值
{
led1=0; //溫度低于設(shè)定下限值LED1點(diǎn)亮報(bào)警
motor1=0; //啟動加熱電機(jī)
led2=1; //LED2暗
motor2=1; //制冷電機(jī)停止
if((temp/10)==temp_low) //如果實(shí)際溫度等于設(shè)定溫度下限值
{
led1=1; //LED1暗
motor1=0; //啟動加熱電機(jī)
led2=1; //LED2暗
motor2=1; //制冷電機(jī)停止
}
}
if ((temp/10)>temp_high) //如果溫度大于設(shè)定最大值
{
led2=0; //溫度高于設(shè)定上限值LED2點(diǎn)亮報(bào)警
motor2=1; //降溫電機(jī)工作
led1=1; //LED1暗
motor1=0; //加熱電機(jī)停止
if ((temp/10)==temp_high)
{
led2=1; //LED2暗
motor2=0; //啟動降溫電機(jī)
led1=1; //LED1暗
motor1=1; //加熱電機(jī)停止
}
}
else if ((temp/10)>temp_low &&((temp/10)<temp_high)) //如果溫度在設(shè)定值之間
{
led1=1; //LED1暗
motor1=1; //加熱電機(jī)停止
led2=1; //LED2暗
motor2=1; //降溫電機(jī)停止
}
if ((humi/10)<humi_low)
{
led3=0; //濕度低于設(shè)定下限值LED3點(diǎn)亮報(bào)警
motor3=0; //啟動加濕電機(jī)
led4=1; //LED4暗
motor4=1; //干燥電機(jī)停止
if((humi/10)==humi_low) //如果實(shí)際濕度等于設(shè)定濕度下限值
{
led3=1; //LED3暗
motor3=0; //啟動加濕電機(jī)
led4=1; //LED4暗
motor4=1; //干燥電機(jī)停止
}
}
if ((humi/10)>humi_high)
{
led4=0; //濕度高于設(shè)定上限值LED4點(diǎn)亮報(bào)警
motor4=1; //干燥電機(jī)工作
led3=1; //LED3暗
motor3=0; //加濕電機(jī)停止
if ((humi/10)==humi_high)
{
led4=1; //LED4暗
motor4=0; //啟動干燥電機(jī)
led3=1; //LED3暗
motor3=1; //加濕電機(jī)停止
}
}
else if ((humi/10)>humi_low &&((humi/10)<humi_high)) //如果溫度在設(shè)定值之間
{
led3=1; //LED3暗
motor3=1; //加濕電機(jī)停止
led4=1; //LED4暗
motor4=1; //干燥電機(jī)停止
}
} //else
} //if
if (((temp/10)<temp_low)|((temp/10)>temp_high)|((humi/10)<humi_low))
{
for (nn=0;nn<50;nn++)
{
beep=0;
delay(1); //延時(shí)1ms
beep=1; //響0.5s
delay(1);
}
}
if ((humi/10)>humi_high)
{
for (nn=0;nn<10;nn++)
{
beep=0;
delay(1); //延時(shí)1ms
beep=1; //響0.1s
delay(1);
}
}
}
/******************************************************************************************************/
if(presskeynum==1) //設(shè)置溫度上限時(shí)顯示的內(nèi)容
{
set_temp[0]=temp_high/10+0x30; //設(shè)定上限溫度十位保存于緩存
set_temp[1]=temp_high%10+0x30; //設(shè)定上限溫度個位保存于緩存
set_temp[2]=0xdf; //°
set_temp[3]='C'; //C
set_temp[4]='\0';
GotoXY (0,0); //第一行輸出SET TEMP HIGH:
Print("SET TEMP HIGH:");
GotoXY (0,1); //第二行輸出溫度值
Print(set_temp);
}
if(presskeynum==2) //設(shè)置溫度下限時(shí)顯示的內(nèi)容
{
set_temp[5]=temp_low/10+0x30; //設(shè)定下限溫度十位保存于緩存
set_temp[6]=temp_low%10+0x30; //設(shè)定下限溫度個位保存于緩存
set_temp[7]=0xdf; //°
set_temp[8]='C'; //C
set_temp[9]='\0';
GotoXY (0,0); //第一行輸出SET TEMP LOW:
Print("SET TEMP LOW:");
GotoXY (0,1); //第二行輸出溫度值
Print(set_temp);
}
if(presskeynum==3) //設(shè)置濕度上限時(shí)顯示的內(nèi)容
{
set_humi[0]=humi_high/10+0x30; //設(shè)定上限濕度十位保存于緩存
set_humi[1]=humi_high%10+0x30; //設(shè)定上限濕度個位保存于緩存
set_humi[2]='%'; //%
set_humi[3]='\0';
GotoXY (0,0); //第一行輸出SET HUMI HIGH:
Print("SET HUMI HIGH:");
GotoXY (0,1); //第二行輸出濕度值
Print(set_humi);
}
if(presskeynum==4) //設(shè)置濕度下限時(shí)顯示的內(nèi)容
{
set_humi[4]=humi_low/10+0x30; //設(shè)定下限濕度十位保存于緩存
set_humi[5]=humi_low%10+0x30; //設(shè)定下限濕度個位保存于緩存
set_humi[6]='%'; //%
set_humi[7]='\0';
GotoXY (0,0); //第一行輸出SET HUMI LOW:
Print("SET HUMI LOW:");
GotoXY (0,1); //第二行輸出濕度值
Print(set_humi);
}
if(presskeynum==5) //設(shè)置空氣濃度下限時(shí)顯示的內(nèi)容
{
set_gas[0]=gas_low/10+0x30; //設(shè)定上限濃度十位保存于緩存
set_gas[1]=gas_low%10+0x30; //設(shè)定上限濃度個位保存于緩存
set_gas[2]='%'; //%
set_gas[3]='\0';
GotoXY (0,0); //第一行輸出SET GAS LOW:
Print("SET GAS LOW:");
GotoXY (0,1); //第二行輸出空氣濃度值
Print(set_gas);
}
if(presskeynum==6) //設(shè)置空氣濃度上限時(shí)顯示的內(nèi)容
{
set_gas[4]=gas_high/10+0x30; //設(shè)定下限濃度十位保存于緩存
set_gas[5]=gas_high%10+0x30; //設(shè)定下限濃度個位保存于緩存
set_gas[6]='%'; //%
set_gas[7]='\0';
GotoXY (0,0); //第一行輸出SET GAS HIGH:
Print("SET GAS HIGH:");
GotoXY (0,1); //第二行輸出空氣濃度值
Print(set_gas);
}
}
|
-
-
2018.3.17.rar
2018-3-18 08:18 上傳
點(diǎn)擊文件名下載附件
198.62 KB, 下載次數(shù): 2
|