項目名:
單片機:STC89C52
功能:
1、通過顯示屏顯示花盆中土壤的溫度、濕度,花盆外光照強度;
2、通過按鍵切換顯示屏的界面,設置土壤最小溫度值、最小濕度值,花盆外光照強度值,輸液倒計時,松土倒計時;
3、通過土壤濕度傳感器檢測土壤濕度,通過DS18B20檢測土壤溫度;
4、通過繼電器控制加熱片,水泵,輸液,補光燈;
5、通過步進電機來實現松土;
部分程序:
#include "main.h"
#include "lcd1602.h"
#include "key.h"
#include "ds18b20.h"
#include "adc.h"
#include "motor.h"
#include "timer.h"
/**********************************
變量定義
**********************************/
uchar key_num = 0; //按鍵掃描標志位
uchar flag_display = 0; //顯示模式標志位
bit flag_display_cut = 0; //切換界面標志位
uint time_num = 0; //10ms計數變量
uint temp_value = 0; //溫度值
uchar temp_min = 10; //最小溫度值
uint humi_value = 0; //濕度值
uchar humi_min = 30; //最小濕度值
uint light_value = 0; //光照強度值
uchar light_min = 50; //最小光照強度值
uchar time_songtu = 0; //松土時間
uint time_minus_songtu = 0; //松土倒計時時間
uchar time_shuye = 0; //輸液時間
uint time_minus_shuye = 0; //輸液倒計時時間
extern bit flag_songtu_begin; //松土開始標志位
extern bit flag_songtu_finish; //松土完成標志位
extern bit flag_shuye_begin; //輸液開始標志位
extern bit flag_shuye_finish; //輸液完成標志位
/**********************************
函數聲明
**********************************/
void Delay_function(uint x); //延時函數
void Key_function(void); //按鍵函數
void Monitor_function(void); //監測函數
void Display_function(void); //顯示函數
void Manage_function(void); //處理函數
/****
******* 主函數
*****/
void main()
{
Lcd1602_Init(); //LCD1602初始化
Delay_function(50);
lcd1602_clean(); //清屏
Delay_function(50);
Ds18b20_Init(); //DS18B20初始化
Delay_function(50);
Timer0_Init(); //定時器0初使化
Delay_function(50);
while(1)
{
Key_function(); //按鍵函數
Monitor_function(); //監測函數
Display_function(); //顯示函數
Manage_function(); //處理函數
Delay_function(10); //延時10ms
time_num++; //間隔10ms計時變量+1
if(time_num >= 5000) //計時累加到5000,重新從0開始累加
{
time_num = 0;
}
}
}
/****
******* 延時 x ms函數
*****/
void Delay_function(uint x)
{
uint m,n;
for(m=x;m>0;m--)
for(n=110;n>0;n--);
}
/****
*******按鍵函數
*****/
void Key_function(void)
{
key_num = Chiclet_Keyboard_Scan(0); //按鍵掃描
if(key_num != 0) //有按鍵按下
{
switch(key_num)
{
case 1: //按鍵1,切換界面
flag_display++;
if(flag_display >= 6) //一共6個界面
flag_display = 0;
lcd1602_clean(); //按一下,清屏一次
break;
case 2:
switch(flag_display)
{
case 0: //界面為0時,手動松土
Motor_Foreward();
break;
case 1: //界面為1時,修改溫度最小值+1
if(temp_min < 99)
temp_min++;
break;
case 2: //界面為2時,修改濕度最小值+1
if(humi_min < 99)
humi_min++;
break;
case 3: //界面為3時,修改光照最小值+1
if(light_min < 99)
light_min++;
break;
case 4: //界面為4時,修改松土時間+1
time_songtu++;
time_minus_songtu = time_songtu*60;
break;
case 5: //界面為5時,修改輸液時間+1
time_shuye++;
time_minus_shuye = time_shuye*60;
break;
default:
break;
}
break;
case 3: //按鍵3
switch(flag_display)
{
case 0: //界面為0時,手動輸液
RELAY_SHUYE = 0; //閉合輸液繼電器,開始輸液
Delay_function(3000); //輸液三秒
RELAY_SHUYE = 1; //斷開輸液繼電器,停止輸液
break;
case 1: //界面為1時,修改溫度最小值-1
if(temp_min > 0)
temp_min--;
break;
case 2: //界面為2時,修改濕度最小值-1
if(humi_min > 0)
humi_min--;
break;
case 3: //界面為3時,修改光照最小值-1
if(light_min > 0)
light_min--;
break;
case 4: //界面為4時,修改松土時間-1
if(time_songtu > 0)
{
time_songtu--;
time_minus_songtu = time_songtu*60;
}
break;
case 5: //界面為5時,修改輸液時間-1
if(time_shuye > 0)
{
time_shuye--;
time_minus_shuye = time_shuye*60;
}
break;
default:
break;
}
break;
case 4: //按鍵4,切換界面
flag_display_cut = ~flag_display_cut;
lcd1602_clean(); //按一下,清屏一次
break;
default:
break;
}
}
}
評論
查看更多